在执行.jar时,将OJBDC添加到Classpath中



我正在尝试开发一个连接到Oracle数据库并执行函数的Java应用程序。如果我在Eclipse中运行应用程序,它可以工作,但当我尝试在Windows命令提示符中运行.jar时,我会得到"遇到错误:java.sql.SQLException:找不到合适的驱动程序"。

当我在命令行中执行时,我正在传递Eclipse中Maven Dependencies中显示的所有.jar文件的路径。

步骤

  1. 执行"mvn clean install-U">

  2. 使用从目标目录执行.jar"java-cp example-1.0-SNAPSHOT.jar;C:\Users/me/.m2/repository/junit/junit/4.11/junit-4.11-sources.jarC:\Users/me/.m2/depository.org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar;C:\Users/me//m2/repository.com/oracle/ojdbc/ojdbc10/19.3.0.0/ojdbcc10-19.3.0.0-sources.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/ucp/19.3.0.0/ucp-13.3.0.0-ssources.jar sources.jar;C:\Users/me/.m2/repository.com/oracle/ojdbc/oraclepki/19.3.0.0/oraclepki-19.3.0.0-sources.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/osdt_cert/19.3.0.0/osdt_cert-19.3.0.0-sources.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/osdt_core/19.0.0/osdt_core-19.3.0.0-sources.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/simplefan/19.3.0.0/simpleefan-19.3.0.0-sources.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/ons/19.3.0.0-sources.jar function.example.App">

  3. OR(如下所示(使用"java-cp示例-1.0-SNAPSHOT.jar;C:\Users/me/.m2/repository/junit/junit/4.11/junit-4.11.jar;C:\Users/sme/.m2/repository.org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar;C:\Users/me//m2/repository.com/oracle/ojdbc/ojdbc10/19.3.0.0/ojdbcc10-19.3.0.0.jar;C:\Users/sme//m2/repository com/oracle/ogdbc/ucp/19.0.0/ucp-9.3.0.0.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/oraclepki/19.3.0.0/oraclepki-19.3.0.0.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/osdt_cert/19.3.0.0.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/osdt_core/19.0.0/osdt_core-19.3.0.0.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/simplefan/19.3.0.0/simpleefan-19.3.0.0.jar;C:/Users/me/.m2/repository.com/oracle/ojdbc/ons/19.3.0.0.jar function.example.App">

应用程序

package function.example;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class App {
public static void main(String[] args) {
String result = null;
try {
result = checkForPalindrome("racecar");
} catch (SQLException e) {
System.out.println("Error encountered: " + e);
e.printStackTrace();
}
System.out.println(result);
}
public static Connection getConnection() {
Properties prop = ReadPropertyFile();
Connection conn = null;
try {
conn = DriverManager.getConnection(prop.getProperty("db.URL"), prop.getProperty("db.user"),
prop.getProperty("db.password"));
} catch (SQLException e) {
System.out.println("Error encountered: " + e);
e.printStackTrace();
}
return conn;
}
public static String checkForPalindrome(String word) throws SQLException {
String sql = "{? = call CHECKFORPALINDROME(?)}";
try (Connection conn = getConnection(); java.sql.CallableStatement stmt = conn.prepareCall(sql);) {
stmt.setString(2, word);
stmt.registerOutParameter(1, java.sql.Types.VARCHAR);
stmt.execute();
String stmtResult = stmt.getString(1);
return stmtResult;
}
}
private static Properties ReadPropertyFile() {
Properties prop = new Properties();
try (InputStream input = new FileInputStream("c:\config.properties")) {
prop.load(input);
} catch (FileNotFoundException e) {
System.out.println("Error encountered: " + e);
e.printStackTrace();
} catch (IOException e) {
System.out.println("Error encountered: " + e);
e.printStackTrace();
}
return prop;
}
}

POM

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>function</groupId>
<artifactId>example</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>ODB-function-example-pom</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.oracle.ojdbc/ojdbc10 -->
<dependency>
<groupId>com.oracle.ojdbc</groupId>
<artifactId>ojdbc10</artifactId>
<version>19.3.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<release>8</release> 
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>function.example.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>

修复

从我的pom中删除了ojdbc10依赖项。从Oracle网站下载了ojdbc8(我似乎无法使用mvnrepository下载它(,在命令行中执行时,将这些.jar文件手动添加到Eclipse和类路径中。

java-cp示例-1.0-SNAPSHOT.jar;C: \用户\我\桌面\ ojdbc8完整*功能。例如,应用

您似乎拥有没有依赖关系的jar,因此您的oraclesojdbc类不包含在最终的jar中。你想要的是一个"胖罐子">

方法是添加maven插件,该插件将封装应用程序jar中的所有依赖项。这可以通过maven-assembly-plugin:实现

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- MainClass in mainfest make a executable jar -->
<archive>
<manifest>
<mainClass>function.example.App</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase> 
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>

因此,如果运行了mvn package,就会有jar-with-dependencies工件,它将包含所有依赖项。

更新

您的应用程序无法在运行时发现驱动程序类,因此您还必须手动加载它。它通常看起来像这样:

Class<?> clazz = Class.forName("oracle.jdbc.driver.OracleDriver");
Driver driver = (Driver) clazz.newInstance();
DriverManager.registerDriver(driver);

最新更新