从使用 Ant 构建的 jar 查询 Oracle DB 时出现“ExceptionInInitializerError”,但它在 IDE 中运行良好

问题描述 投票:0回答:0

当我在我的 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。

java oracle jdbc ant ojdbc
© www.soinside.com 2019 - 2024. All rights reserved.