Класс не найден для встроенного метода — что может быть причиной этого?

#java #kotlin #jasync-sql

#java #kotlin #jasync-sql

Вопрос:

Я получаю сообщение об ошибке со следующей трассировкой стека:

 java.lang.NoClassDefFoundError: com/github/jasync/sql/db/ConcreteConnectionBase$flatten$$inlined$mapTry$1
    at com.github.jasync.sql.db.ConcreteConnectionBase.releaseIfNeeded(ConcreteConnectionBase.kt:98) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.mysql.MySQLConnection.sendPreparedStatementDirect(MySQLConnection.kt:299) [jasync-mysql-0.9.41.jar:?]
    at com.github.jasync.sql.db.ConcreteConnectionBase$sendPreparedStatement$1.invoke(ConcreteConnectionBase.kt:75) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.ConcreteConnectionBase$sendPreparedStatement$1.invoke(ConcreteConnectionBase.kt:16) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.interceptor.ConnectionInterceptorHelperKt.wrapPreparedStatementWithInterceptors(ConnectionInterceptorHelper.kt:35) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.ConcreteConnectionBase.sendPreparedStatement(ConcreteConnectionBase.kt:67) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.pool.ConnectionFactory.test(ConnectionFactory.kt:81) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.pool.ConnectionFactory.test(ConnectionFactory.kt:14) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.pool.ObjectPoolActor.sendAvailableItemsToTest(ActorBasedObjectPool.kt:342) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.pool.ObjectPoolActor.handleTestAvailableItems(ActorBasedObjectPool.kt:282) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.pool.ObjectPoolActor.onReceive(ActorBasedObjectPool.kt:226) [jasync-common-0.9.41.jar:?]
    at com.github.jasync.sql.db.pool.ActorBasedObjectPool$actor$1.invokeSuspend(ActorBasedObjectPool.kt:141) [jasync-common-0.9.41.jar:?]
    at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32) [kotlin-stdlib-1.3.10.jar:1.3.10-release-253 (1.3.10)]
    at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:233) [kotlinx-coroutines-core-1.1.1.jar:?]
    at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:594) [kotlinx-coroutines-core-1.1.1.jar:?]
    at kotlinx.coroutines.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60) [kotlinx-coroutines-core-1.1.1.jar:?]
    at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:742) [kotlinx-coroutines-core-1.1.1.jar:?]
Caused by: java.lang.ClassNotFoundException: com.github.jasync.sql.db.ConcreteConnectionBase$flatten$$inlined$mapTry$1
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) [?:1.8.0_144]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) [?:1.8.0_144]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335) [?:1.8.0_144]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) [?:1.8.0_144]
    ... 17 more
  

Вы можете увидеть исходный код для ConcreteConnectionBase класса здесь:
https://github.com/jasync-sql/jasync-sql/blob/master/db-async-common/src/main/java/com/github/jasync/sql/db/ConcreteConnectionBase.kt

flatMapTry и mapTry являются встроенными функциями. Странно то, что вышеупомянутая трассировка стека не согласована (т. Е. Не выполняется во всех экземплярах).

Я декомпилировал jar, но не увидел никаких признаков отсутствия классов (насколько я понял). Есть ли другая причина, по которой я могу здесь отсутствовать?

Комментарии:

1. если у вас есть около 20 минут и вы можете прочитать этот пост ( jrebel.com/rebellabs / … ) возможно, вы сможете определить, что там происходит. Проблемы с загрузкой классов часто трудно найти.

2. Да, я понимаю, но в данном случае это класс из того же файла.

3. вы используете proguard или что-то в этом роде?

4. Нет, это серверное приложение, работающее на JRE 8.

5. Убедитесь, что у вас есть отсутствующий класс в .jar файлах вашего приложения. Убедитесь, что включены все транзитивные зависимости. Проверьте версии библиотек (возможно, некоторые библиотеки были обновлены / понижены при разрешении зависимостей)

Ответ №1:

Оказывается, артефакт был поврежден. gradle clean исправлена проблема.

Я нашел это с помощью:

 >jar tf jasync-common-0.9.24.jar  | grep ConcreteConnectionBase | grep mapTry
com/github/jasync/sql/db/ConcreteConnectionBase$flatten$$inlined$mapTry$1$lambda$1.class
com/github/jasync/sql/db/ConcreteConnectionBase$flatten$$inlined$mapTry$1.class
  

И сравнивая его с:

>jar tf jasync-common-0.9.41.jar | grep ConcreteConnectionBase | grep mapTry

Который был пуст.