У меня есть проект 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 вместо гораздо более позднего времени выполнения.