英文:
Migrating from Java 8 to java 11- not able to load jdk.internal.util class (java.lang.NoClassDefFoundError)
问题
从Java 8迁移到Java 11的OpenJDK时出现了奇怪的错误,其中一个来自java.base模块的类(java.util.Arrays)无法访问另一个来自java.base
模块的类(jdk.internal.util.ArraysSupport
)。
如果查看java.base
模块的module-info
,可以看到jdk.internal.util
包未被导出。我尝试过使用--add-export java.base/jdk.internal.util=ALL-UNNAMED
,但仍然出现相同的错误。因为--add-export
在将包导出到另一个模块时会起作用。在这里的问题是同一模块中的一个类无法访问另一个类。不确定问题出在哪里,正在寻求建议。
java.lang.NoClassDefFoundError: Could not initialize class jdk.internal.util.ArraysSupport
at java.base/java.util.Arrays.equals(Arrays.java:2873)
...
SalesHubSQLExecutionTasklet
类的代码如下:
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
...
int[] result = jdbcTemplate.batchUpdate(sqls);
...
}
我在Unix系统上尝试了加载一个独立的普通类,它工作得很好:
Class<?> classToLoad = Class.forName("jdk.internal.util.ArraysSupport");
它成功地加载了这个类,所以不确定这里出了什么问题!
英文:
Migrating from Java 8 to Java 11 open JDK. Getting weird error where one class (java.util.Arrays) from java.base module is not able to access another class called (jdk.internal.util.ArraysSupport
) from java.base
module.
If I look at module-info of java.base
module jdk.internal.util
package is not exported. I tried --add-export java.base/jdk.internal.util=ALL-UNNAMED
but getting the same error. As --add-export
helps in exporting package to another module. Here the problem is one class from the same module is not able to access another one from the same module. Not sure what is wrong here and looking for suggestions.
java.lang.NoClassDefFoundError: Could not initialize class jdk.internal.util.ArraysSupport
at java.base/java.util.Arrays.equals(Arrays.java:2873)
at java.base/sun.security.util.ObjectIdentifier.equals(ObjectIdentifier.java:345)
at java.base/sun.security.pkcs.PKCS7.parse(PKCS7.java:185)
at java.base/sun.security.pkcs.PKCS7.parse(PKCS7.java:154)
at java.base/sun.security.pkcs.PKCS7.<init>(PKCS7.java:136)
at java.base/sun.security.util.SignatureFileVerifier.<init>(SignatureFileVerifier.java:127)
at java.base/java.util.jar.JarVerifier.processEntry(JarVerifier.java:297)
at java.base/java.util.jar.JarVerifier.update(JarVerifier.java:230)
at java.base/java.util.jar.JarFile.initializeVerifier(JarFile.java:757)
at java.base/java.util.jar.JarFile.ensureInitialization(JarFile.java:1034)
at java.base/java.util.jar.JavaUtilJarAccessImpl.ensureInitialization(JavaUtilJarAccessImpl.java:69)
at java.base/jdk.internal.loader.URLClassPath$JarLoader$2.getManifest(URLClassPath.java:870)
at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:788)
at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:315)
at org.apache.commons.dbcp2.BasicDataSource.createConnectionFactory(BasicDataSource.java:2124)
at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2033)
at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533)
at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:371)
at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:590)
at com.rbccm.sales.hub.employee.tasklet.SalesHubSQLExecutionTasklet.execute(SalesHubSQLExecutionTasklet.java:45)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:406)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:330)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:272)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:81)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:375)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:145)
at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:257)
at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:200)
at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:148)
at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:66)
Code of SalesHubSQLExecutionTasklet
class is as following
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
JdbcTemplate jdbcTemplate = new JdbcTemplate(this.getDataSource());
long start = System.currentTimeMillis();
try {
if (!StringUtils.isBlank(this.getSql())) {
if (this.getSql().toUpperCase().startsWith("UPDATE")) {
int result = jdbcTemplate.update(this.getSql());
LOGGER.info("{} records updated executing SQL [{}]", result, this.getSql());
}
else {
jdbcTemplate.execute(this.getSql());
}
}
else if (this.sqls != null && this.sqls.length > 0) {
int[] result = jdbcTemplate.batchUpdate(sqls);
for (int i=0; i<sqls.length; i++) {
LOGGER.info("SQL [{}] result [{}].", sqls[i], result[i]);
}
}
}
catch (Exception ex) {
LOGGER.error("Error executing SQL [{}]", this.getSql(), ex);
}
LOGGER.info("Step {} execute SQL [{}] finished in {} ms.", chunkContext.getStepContext().getStepName(), this.getSql(), (System.currentTimeMillis()-start));
return RepeatStatus.FINISHED;
}
The line no 45 is
int[] result = jdbcTemplate.batchUpdate(sqls);
I tried to load with a separate plain class on the Unix box. And it worked fine
Class<?> classToLoad = Class.forName("jdk.internal.util.ArraysSupport");
and it loaded the class successfully, so not sure what's wrong here!
答案1
得分: 0
我用最新的Hikari数据源替换了最新的dbcp数据源,它起作用了。感谢大家的建议。
英文:
I replaced latest dbcp Datasource with latest Hikari Datasource and it worked . Thanks all for your suggestions.
专注分享java语言的经验与见解,让所有开发者获益!
评论