从Java 8迁移到Java 11- 无法加载jdk.internal.util类(java.lang.NoClassDefFoundError)

huangapple 未分类评论42阅读模式
英文:

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.&lt;init&gt;(PKCS7.java:136)
        at java.base/sun.security.util.SignatureFileVerifier.&lt;init&gt;(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(&quot;UPDATE&quot;)) {
				int result = jdbcTemplate.update(this.getSql());
				LOGGER.info(&quot;{} records updated executing SQL [{}]&quot;, result, this.getSql());
			}
			else {
				jdbcTemplate.execute(this.getSql());
			}	
		}
		else if (this.sqls != null &amp;&amp; this.sqls.length &gt; 0) {
			int[] result = jdbcTemplate.batchUpdate(sqls);
			for (int i=0; i&lt;sqls.length; i++) {
				LOGGER.info(&quot;SQL [{}] result [{}].&quot;, sqls[i], result[i]);
			}
		}
	}
	catch (Exception ex) {
		LOGGER.error(&quot;Error executing SQL [{}]&quot;, this.getSql(), ex);
	}
    LOGGER.info(&quot;Step {} execute SQL [{}] finished in {} ms.&quot;, 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&lt;?&gt; classToLoad = Class.forName(&quot;jdk.internal.util.ArraysSupport&quot;);

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.

huangapple
  • 本文由 发表于 2020年4月5日 02:47:46
  • 转载请务必保留本文链接:https://java.coder-hub.com/61033132.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定