从 java 客户端连接到 db2

Connecting to db2 from java client

我正在尝试从 java 客户端连接到 db2 运行 将应用程序作为 jar。该 jar 是一个超级 jar,其中包含由 shade 插件生成的所有依赖项。

当我 运行 来自我的 ide(Netbeans) 的程序时,它 运行 没问题,但是当我 运行 它来自这样的命令行时,它失败了: java -jar target/locationImporter.jar

我得到的异常是:

Exception in thread "main" java.lang.NullPointerException
    at com.ibm.as400.access.PortMapper.getServerSocket(PortMapper.java:216)
    at com.ibm.as400.access.AS400ImplRemote.signonConnect(AS400ImplRemote.java:2363)
    at com.ibm.as400.access.AS400ImplRemote.signon(AS400ImplRemote.java:2278)
    at com.ibm.as400.access.AS400.sendSignonRequest(AS400.java:3142)
    at com.ibm.as400.access.AS400.promptSignon(AS400.java:2706)
    at com.ibm.as400.access.AS400.signon(AS400.java:4035)
    at com.ibm.as400.access.AS400.connectService(AS400.java:1184)
    at com.ibm.as400.access.AS400JDBCConnection.setProperties(AS400JDBCConnection.java:3338)
    at com.ibm.as400.access.AS400JDBCDriver.prepareConnection(AS400JDBCDriver.java:1419)
    at com.ibm.as400.access.AS400JDBCDriver.initializeConnection(AS400JDBCDriver.java:1256)
    at com.ibm.as400.access.AS400JDBCDriver.connect(AS400JDBCDriver.java:395)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at dataprep.ConnectionSupplier.getConnection(ConnectionSupplier.java:18)
    at dataprep.SqlFileRunner.runScript(SqlFileRunner.java:65)
    at dataprep.SqlFileRunner.runSqlFile(SqlFileRunner.java:26)
    at dataprep.PrepareDatabase.main(PrepareDatabase.java:26)

失败的代码是:

Class.forName("com.ibm.as400.access.AS400JDBCDriver").newInstance();
return DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);

因为它 运行 在我的 ide 中,我知道 url、用户名和密码是正确的。

我的 shade 插件在我的 pom 中是这样配置的:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <shadedArtifactAttached>true</shadedArtifactAttached>
        <shadedClassifierName>launcher</shadedClassifierName> 
        <finalName>locationImporter</finalName>
        <createDependencyReducedPom>false</createDependencyReducedPom>
        <minimizeJar>true</minimizeJar>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

经过几个小时的调试,我的一位同事为我指明了正确的方向。删除 minimizeJar 解决了问题,因为阴影插件删除了文件 "SocketContainerInet" 因为它不是直接实例化而是通过字符串值..