JDBC 部署错误 - NoClassDefFounderror
JDBC Deployment Error - NoClassDefFound
我一直在使用一个 Java 程序,该程序对 Oracle 数据库执行多个查询。为此,我目前正在使用 jdbc 瘦客户端 (ojdbc7.jar)。对于 IDE 我使用的是 NetBeans,并且在我的 PC 上调试或 运行ning JAR 我没有遇到任何错误。 运行 此 JAR 在 Linux 生产环境中但是,报告以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: oracle/jdbc/OracleDriver
[...]
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
我用来获取连接的代码是:
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = null;
Properties connectionProps = new Properties();
connectionProps.put("user", DBUsername);
connectionProps.put("password", DBPassword);
conn = DriverManager.getConnection(JDBCConnection, DBUsername, DBPassword);
DBUsername/Password 和 JDBCConnection 都在本地存储。添加额外的打印语句显示失败行是:
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
我目前在项目的库下包含 ojdbc7.jar。检查 Build > Packaging 下的项目属性,选中 "Copy Dependent Libraries"。我此时的期望是库应该包含在我的 jar 文件中。
我也测试过:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
同样,我试过只使用 Class.forName(),并同时使用两者。
Class.forName("oracle.jdbc.driver.OracleDriver");
阅读其他问题后,我了解到这可能是我的类路径存在问题。在我尝试 运行 的 Linux 环境中,我将类路径设置为 ocjdb7.jar 的确切位置,但不幸的是:
export CLASSPATH=/<Directory Location>/ocjdb7.jar
我已经尝试了多种配置,例如有问题的 Linux 环境已经有一个包含 ocjdb6.jar 的类路径,所以我用这个版本重新编译,设置类路径,并进行了测试。报告了相同的错误消息。我错过了包含此驱动程序的必要设置吗?在同事 Windows 7 桌面上测试,出现同样的错误,这似乎表明这仍然是一个设置问题。
ocjdb7.jar 应打包到您的可执行 JAR 中。我建议您尝试从中创建一个 Maven 项目(NetBeans 应该有一个方便的向导)并将其作为依赖项引用。
您还可以检查在提取 JAR 时是否将所需的 ocjdb7.jar 打包到您的 JAR 中(JAR 只是一个归档文件)。
答案很简单 - Netbeans 在将 JAR 文件编译到的 dist 文件夹下的 lib 文件夹中包含所有引用的库。我一直只复制编译后的 JAR,而不是关联的 lib 文件夹。复制lib文件夹后,过程运行无异常
Netbeans 文档介绍了它的功能,其中指出:
https://netbeans.org/kb/articles/javase-deploy.html
If you have specified any libraries for the project (in addition to the JDK), a lib folder is created in the dist folder. The libraries are copied into dist/lib.
我一直在使用一个 Java 程序,该程序对 Oracle 数据库执行多个查询。为此,我目前正在使用 jdbc 瘦客户端 (ojdbc7.jar)。对于 IDE 我使用的是 NetBeans,并且在我的 PC 上调试或 运行ning JAR 我没有遇到任何错误。 运行 此 JAR 在 Linux 生产环境中但是,报告以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: oracle/jdbc/OracleDriver
[...]
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
我用来获取连接的代码是:
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = null;
Properties connectionProps = new Properties();
connectionProps.put("user", DBUsername);
connectionProps.put("password", DBPassword);
conn = DriverManager.getConnection(JDBCConnection, DBUsername, DBPassword);
DBUsername/Password 和 JDBCConnection 都在本地存储。添加额外的打印语句显示失败行是:
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
我目前在项目的库下包含 ojdbc7.jar。检查 Build > Packaging 下的项目属性,选中 "Copy Dependent Libraries"。我此时的期望是库应该包含在我的 jar 文件中。
我也测试过:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
同样,我试过只使用 Class.forName(),并同时使用两者。
Class.forName("oracle.jdbc.driver.OracleDriver");
阅读其他问题后,我了解到这可能是我的类路径存在问题。在我尝试 运行 的 Linux 环境中,我将类路径设置为 ocjdb7.jar 的确切位置,但不幸的是:
export CLASSPATH=/<Directory Location>/ocjdb7.jar
我已经尝试了多种配置,例如有问题的 Linux 环境已经有一个包含 ocjdb6.jar 的类路径,所以我用这个版本重新编译,设置类路径,并进行了测试。报告了相同的错误消息。我错过了包含此驱动程序的必要设置吗?在同事 Windows 7 桌面上测试,出现同样的错误,这似乎表明这仍然是一个设置问题。
ocjdb7.jar 应打包到您的可执行 JAR 中。我建议您尝试从中创建一个 Maven 项目(NetBeans 应该有一个方便的向导)并将其作为依赖项引用。 您还可以检查在提取 JAR 时是否将所需的 ocjdb7.jar 打包到您的 JAR 中(JAR 只是一个归档文件)。
答案很简单 - Netbeans 在将 JAR 文件编译到的 dist 文件夹下的 lib 文件夹中包含所有引用的库。我一直只复制编译后的 JAR,而不是关联的 lib 文件夹。复制lib文件夹后,过程运行无异常
Netbeans 文档介绍了它的功能,其中指出: https://netbeans.org/kb/articles/javase-deploy.html
If you have specified any libraries for the project (in addition to the JDK), a lib folder is created in the dist folder. The libraries are copied into dist/lib.