For security and reliability reason our infrastructure partner (MuleSoft) is adding as less java modules to the runtime as possible.
While in java-module-context only those modules are accessible which are in the module-info.java of the module.
In the environment JDK17 with --add-modules=java.sql instantiating
DB2SimpleDataSource dbds = new com.ibm.db2.jcc.DB2SimpleDataSource();
fails with Exception in thread "main" java.lang.NoClassDefFoundError: jdk/net/ExtendedSocketOptions at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.D(ao.java:2102)
Suggested enhancement is to (additionally to the JDK8 compatiblity) fallback to other SocketOptions impelmentation when jdk.net.ExtendedSocketOptions is not on classpath (in your com.ibm.db2.jcc.am.ao class).
Reproduce:
Run with 11.5.*
java --add-modules=java.sql --module-path bin;lib\jcc-11.5.9.0.jar -m db2jdknetmodule/com.canda.test.Db2DatasourceTest
works as expected
Db2DatasourceTest
java.version = 17.0.9
jdk.module.path = bin;lib\jcc-11.5.9.0.jar
expected: jdk.net.ExtendedSocketOptions not found
dbds=com.ibm.db2.jcc.DB2SimpleDataSource@49993335
dbds.getJccVersion=IBM Data Server Driver for JDBC and SQLJ 4.33.31
dbxads=com.ibm.db2.jcc.DB2XADataSource@2038ae61
dbxads.getJccVersion=IBM Data Server Driver for JDBC and SQLJ 4.33.31
End Db2DatasourceTest
but running with 12.1.*
java --add-modules=java.sql --module-path bin;lib\jcc-12.1.2.0.jar -m db2jdknetmodule/com.canda.test.Db2DatasourceTest
fails with
Db2DatasourceTest
java.version = 17.0.9
jdk.module.path = bin;lib\jcc-12.1.2.0.jar
expected: jdk.net.ExtendedSocketOptions not found
Exception in thread "main" java.lang.NoClassDefFoundError: jdk/net/ExtendedSocketOptions
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.D(ao.java:2102)
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.<clinit>(ao.java:974)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2BaseDataSource.<init>(DB2BaseDataSource.java:3130)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2SimpleDataSource.<init>(DB2SimpleDataSource.java:177)
at db2jdknetmodule/com.canda.test.Db2DatasourceTest.main(Db2DatasourceTest.java:24)
Caused by: java.lang.ClassNotFoundException: jdk.net.ExtendedSocketOptions
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 5 more
see
db2jdknetmodule\src\module-info.java
db2jdknetmodule\src\com\canda\test\Db2DatasourceTest.java
in the attached zip.
Used Sources in the zip:
Java Source: /db2jdknetmodule/src/com/canda/test/Db2DatasourceTest.java
package com.canda.test;
import com.ibm.db2.jcc.DB2SimpleDataSource;
import com.ibm.db2.jcc.DB2XADataSource;
/**
*
*/
public class Db2DatasourceTest {
public static void main(String[] args) {
System.out.println("Db2DatasourceTest");
System.out.println("java.version = " + System.getProperty("java.version"));
System.out.println("jdk.module.path = " + System.getProperty("jdk.module.path"));
try {
Class<?> tempClass = Class.forName("jdk.net.ExtendedSocketOptions");
System.out.println(tempClass + " loaded via " + tempClass.getClassLoader());
} catch (ClassNotFoundException cnf) {
System.out.println("expected: jdk.net.ExtendedSocketOptions not found");
} catch (Throwable e) {
e.printStackTrace();
}
DB2SimpleDataSource dbds = new com.ibm.db2.jcc.DB2SimpleDataSource();
System.out.println("dbds=" + dbds);
System.out.println("dbds.getJccVersion=" + dbds.getJccVersion());
DB2XADataSource dbxads = new com.ibm.db2.jcc.DB2XADataSource();
System.out.println("dbxads=" + dbxads);
System.out.println("dbxads.getJccVersion=" + dbxads.getJccVersion());
System.out.println("End Db2DatasourceTest");
}
}
Module Source: /db2jdknetmodule/src/module-info.java
module db2jdknetmodule {
requires jcc;
exports com.canda.test;
}
with /db2jdknetmodule/lib/jcc-12.1.2.0.jar
Full stacktrace
Db2DatasourceTest
java.version = 17.0.9
jdk.module.path = bin;lib\jcc-12.1.2.0.jar
expected: jdk.net.ExtendedSocketOptions not found
Exception in thread "main" java.lang.NoClassDefFoundError: jdk/net/ExtendedSocketOptions
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.D(ao.java:2102)
at jcc@12.1.2.0/com.ibm.db2.jcc.am.ao.<clinit>(ao.java:974)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2BaseDataSource.<init>(DB2BaseDataSource.java:3130)
at jcc@12.1.2.0/com.ibm.db2.jcc.DB2SimpleDataSource.<init>(DB2SimpleDataSource.java:177)
at db2jdknetmodule/com.canda.test.Db2DatasourceTest.main(Db2DatasourceTest.java:24)
Caused by: java.lang.ClassNotFoundException: jdk.net.ExtendedSocketOptions
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
... 5 more