当我在我的 IDE 中运行我的 Java 代码时,它运行成功。当我构建一个 jar 文件并从命令行运行它时,我在执行实际查询的行上收到“java.lang.ExceptionInInitializerError”。我怀疑我的 Apache Ant 构建脚本有问题,但我不确定。
这是我极其简化的代码(是的,我知道我没有在失败时完全关闭数据库连接,但这是我创建的一些小东西,只是为了获得我能得到的最简单的代码版本,但仍然显示错误):
package com.company.TestApp.TestProj;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
public Main() {
super();
}
public static void main(String[] args) {
Main main = new Main();
main.run();
}
public void run() {
System.out.println("Starting");
try {
Class.forName("oracle.jdbc.OracleDriver");
Connection db = DriverManager.getConnection(connectionString, schema, password);
if (db.isValid(10)) {
System.out.println("Connected");
}
else {
System.out.println("Not connected");
throw new Exception("Not connected");
}
String sql = "SELECT * FROM dual";
Statement statement = db.createStatement();
ResultSet rs = statement.executeQuery(sql);
while (rs.next()) {
System.out.println("Record");
}
rs.close();
statement.close();
db.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
我极其简化的 Apache Ant 构建脚本是:
<project name="test" basedir="." default="main">
<property name="src.dir" value="src"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="com.company.TestApp.TestProj.Main"/>
<property name="lib.dir" value="../lib"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath"/>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<fileset dir="${jar.dir}">
<include name="**/*.class"/>
</fileset>
<zipfileset src="${lib.dir}/ojdbc7.jar">
<include name="**/*.class"/>
</zipfileset>
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java fork="true" classname="${main-class}">
<classpath>
<path refid="classpath"/>
<path location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</java>
</target>
<target name="clean-build" depends="clean,jar"/>
<target name="main" depends="clean,run"/>
</project>
我的IDE是JDeveloper 12.1.3.0.0。 我的JAVA_HOME和路径设置为JDK1.8.0_291。 我的 Oracle 数据库是 19.13.0.0.0
当我从我的 IDE 运行程序时,我得到了预期的结果:
Starting
Connected
Record
当我使用“java -jar test.jar”从命令行运行 jar 时,输出为:
Starting
Connected
Exception in thread "main" java.lang.ExceptionInInitializerError
at oracle.jdbc.driver.OracleStatement.configureRowData(OracleStatement.java:760)
at oracle.jdbc.driver.OracleStatement.<init>(OracleStatement.java:696)
at oracle.jdbc.driver.T4CStatement.<init>(T4CStatement.java:1152)
at oracle.jdbc.driver.T4CDriverExtension.allocateStatement(T4CDriverExtension.java:46)
at oracle.jdbc.driver.PhysicalConnection.createStatement(PhysicalConnection.java:3914)
at oracle.jdbc.driver.PhysicalConnection.createStatement(PhysicalConnection.java:3874)
at com.company.TestApp.TestProj.Main.run(Main.java:34)
at com.company.TestApp.TestProj.Main.main(Main.java:15)
Caused by: java.lang.NullPointerException
at oracle.jdbc.driver.DynamicByteArray$1.run(DynamicByteArray.java:540)
at java.security.AccessController.doPrivileged(Native Method)
at oracle.jdbc.driver.DynamicByteArray.<clinit>(DynamicByteArray.java:535)
... 8 more
我运行的是Java JDK1.8.0_291,但是我在其他不同版本的Java机器上试过,都收到同样的错误。我正在使用 JDeveloper 附带的 ojdbc7.jar。