Миграция с Java 8 на java 11 - не удается загрузить класс jdk.internal.util (java .lang.NoClassDefFoundError) - PullRequest
3 голосов
/ 04 апреля 2020

Миграция с Java 8 до Java 11 открыть JDK. Получение странной ошибки, когда один класс (java .util.Arrays) из модуля java .base не может получить доступ к другому классу (jdk.internal.util.ArraysSupport) из модуля java.base.

Если посмотреть на информацию о модуле java.base, модуль 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)
        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)

Код класса SalesHubSQLExecutionTasklet выглядит следующим образом

@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;
}

Строка № 45 -

int[] result = jdbcTemplate.batchUpdate(sqls);

Я пытался загрузить отдельный простой класс в поле Unix. И он работал нормально

Class<?> classToLoad = Class.forName("jdk.internal.util.ArraysSupport");

и успешно загружал класс, поэтому не уверен, что здесь не так!

1 Ответ

0 голосов
/ 07 апреля 2020

Я заменил последний источник данных dbcp на последний источник данных Hikari, и он заработал. Спасибо всем за ваши предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...