Частое и непредсказуемое исключение ClassNotFoundException в Java - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть проект Eclipse Java с рядом зависимостей - JAR-файлы и внешние библиотеки исходного кода java (от Github) - которые я включил в buildpath.Если я запускаю код локально внутри Eclipse, он работает отлично.

Однако, если я скомпилирую работающий JAR-файл, я постоянно получаю ClassNotFoundException во время выполнения.Где и когда я получаю это, кажется, случайным образом, иногда код работает нормально в течение 2 часов, затем внезапно происходит Throwable, и это происходит в другой части кода, где это произошло в прошлый раз, и где это происходит непредсказуемо.

Общая тема, по-видимому, заключается в том, что либо статические методы (геттеры), либо статические внутренние классы внутри внешних зависимостей вызывают проблему.

Я попытался очистить проект Eclipse.Для компиляции исполняемого JAR-файла я использую Eclipse и выбираю «Извлечь необходимые библиотеки в сгенерированный JAR-файл».В некоторых из приведенных ниже примеров я дважды проверил, что зависимость существует на моем пути сборки и является уникальной (то есть у меня нет двух разных версий одной и той же зависимости).Я также проверил, что файл * .class, в котором находится статический метод, находится в нужном месте в моем исполняемом файле JAR.

Более странно то, что иногда, когда я создаю свой исполняемый JAR, он работает очень гладкобез каких-либо ClassNotFoundException, но когда я делаю небольшое несвязанное изменение в коде и перекомпилирую, я каким-то образом повторно вводю тенденцию для файла JAR выдавать эту ошибку во время выполнения, а затем я должен повторно перекомпилировать и надеяться, что на этом конкретномитерации, у меня нет файла JAR, который будет вызывать эту ошибку во время выполнения ...

В данный момент я не использую Maven.

Пример 1:

Exception in thread "main" java.lang.NoClassDefFoundError: io/socket/engineio/client/Socket$20
        at io.socket.engineio.client.Socket.close(Socket.java:757)
        ....
Caused by: java.lang.ClassNotFoundException: io.socket.engineio.client.Socket$20
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

Пример 2:

Exception in thread "main" java.lang.NoClassDefFoundError: io/lettuce/core/protocol/CommandArgs$StringArgument
        at io.lettuce.core.protocol.CommandArgs.add(CommandArgs.java:188)
        at io.lettuce.core.RedisCommandBuilder.xadd(RedisCommandBuilder.java:2097)
        ...
Caused by: java.lang.ClassNotFoundException: io.lettuce.core.protocol.CommandArgs$StringArgument
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
        ... 23 more

Пример 3:

Exception in thread "nioEventLoopGroup-2-1" java.lang.NoClassDefFoundError: org/apache/logging/log4j/core/impl/ThrowableProxy
        at org.apache.logging.log4j.core.impl.MutableLogEvent.getThrownProxy(MutableLogEvent.java:352)
        at org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter.format(ExtendedThrowablePatternConverter.java:64)
        at org.apache.logging.log4j.core.pattern.PatternFormatter.format(PatternFormatter.java:38)

Это даже случалось со мной в классах внутри моего собственного проекта (не в зависимости)!Например, если у меня есть класс A, то иногда, когда я вызываю A.run() час в рабочее время, я получаю ClassNotFoundException.Как и выше, если я перекомпилировал мой работающий JAR-файл, эта проблема может быть исправлена, но, если перекомпиляция исправила проблему, это казалось случайным.

public class A{
   public static void run() {
      // do something
   }
}

Единственное, что навсегда исправило это навсегда, былоявный вызов A.run() в начале метода main вместо гораздо более позднего времени выполнения.

...