public class PropHolder {
public static Properties prop;
static {
//code for loading properties from file
}
}
// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
class PropHolder
это мой собственный класс. Класс находится в том же файле JAR основного класса. Так что этого не должно быть, потому что JAR отсутствует в classpath.
Когда я просматриваю файл JAR jar tf myjarfile
, я вижу там PropHolder.class
перечисленные.
Кстати: код работает нормально на моей локальной машине. Но не смог работать, когда я развернул его с каким-то скриптом на сервере Linux. Поэтому я думаю, что это не проблема кода. Но по какой-то причине. Процесс развертывания очень сложно отследить.
В чем может быть проблема?
Ответы:
Моя лучшая ставка в том, что здесь есть проблема:
Казалось бы, возникло какое-то неперехваченное исключение, которое распространялось до самого ClassLoader, пытающегося загрузить класс. Нам понадобится трассировка стека, чтобы подтвердить это.
Либо это, либо это произошло при создании
PropHolder.prop
статической переменной.источник
static
проблемы. Что нужно сделать, чтобы решить проблему?static
блока. Для его отладки обведитеtry/catch(Exception e)
весь блок и зарегистрируйте исключение. Вам придется исправить это исключение. Обычно исключение регистрируется, но его может быть трудно найти, поскольку оно регистрируется во время загрузки классов, что может произойти очень раноtry catch
блоке, и он сказалFailed to initialize ClassA
. Я думаю, что это проблемаJVM
. Я перезапустил свою систему, а затем все работало нормально. Как решить эту проблему в будущем, не перезагружая мою систему, и решить проблему простым решением.cause
если доступно. ANoClassDefFoundError
всегда ассоциируется с другой ошибкой, вам нужно будет найти ее в журналах или попытаться зарегистрировать ее более подходящим образом (например, принудительно войти в новый файл в файловой системе)Вы получаете,
java.lang.NoClassDefFoundError
что НЕ означает, что ваш класс отсутствует (в этом случае вы получитеjava.lang.ClassNotFoundException
). ClassLoader столкнулся с ошибкой при чтении определения класса при попытке чтения класса.Поместите try / catch внутри статического инициализатора и посмотрите на исключение. Если вы читаете там какие-то файлы, и они отличаются от вашей локальной среды, это, скорее всего, является причиной проблемы (возможно, файл не найден, нет разрешений и т. Д.).
источник
@Stateless
, поэтому я просто добавил соответствующую зависимость и смог продолжить. Спасибо за чаевые!NoClassDefFoundError не дает большой подсказки о том, что пошло не так внутри статического блока. Рекомендуется всегда иметь такой блок внутри статического кода инициализации {...}:
источник
У меня было то же исключение, вот как я решил проблему:
Предпосылки:
Класс Junit (и тест), который расширил другой класс.
ApplicationContext инициализируется с помощью Spring, который инициирует проект.
Контекст приложения был инициализирован в методе @Before
Решение:
Инициируйте контекст приложения из метода @BeforeClass, поскольку родительскому классу также требуются некоторые классы, которые были инициализированы из контекста приложения.
Надеюсь, это поможет.
источник
Как уже упоминалось выше, это может быть несколько вещей. В моем случае у меня была статически инициализированная переменная, которая опиралась на отсутствующую запись в моем файле свойств. Добавил отсутствующую запись в файл свойств, и проблема была решена.
источник
Всего несколько дней назад я встретил такой же вопрос, как и ваш. Весь код хорошо работает на моей локальной машине, но получается ошибка (noclassdeffound & initialize). Поэтому я публикую свое решение, но я не знаю почему, я просто выдвигаю возможность. Я надеюсь, что кто-то знает, это объяснит. @ Джон Винт Во-первых, я покажу вам мою проблему. Мой код имеет статическую переменную и статический блок оба. Когда я впервые столкнулся с этой проблемой, я попробовал решение Джона Винта и попытался поймать исключение. Однако я ничего не поймал. Поэтому я подумал, что это потому, что статические переменные (но теперь я знаю, что это одно и то же) и до сих пор ничего не нашли. Итак, я пытаюсь найти разницу между машиной Linux и моим компьютером. Затем я обнаружил, что эта проблема возникает только тогда, когда несколько потоков выполняются в одном процессе (кстати, на машине linux есть два ядра и два процесса). Это означает, что если в одном и том же процессе выполняются две задачи (обе используют код со статическим блоком или переменными), то все идет не так, но если они выполняются в разных процессах, обе они в порядке. В машине Linux я использую
чтобы выполнить задачу, и потому что моя статическая переменная - это запуск контейнера (или, может быть, вы инициализируете новый загрузчик классов), поэтому он останется до остановки jvm, а jvm остановится только после остановки всех задач в одном процессе. Каждое задание запускает новый контейнер (или загрузчик классов), и это сбивает с толку jvm. В результате происходит ошибка. Итак, как это решить? Мое решение состоит в том, чтобы добавить новую команду в команду maven и заставить каждую задачу помещаться в один и тот же контейнер.
Возможно, вы уже решили эту проблему, но все же надеетесь, что это поможет другим, кто столкнется с той же проблемой.
источник
java.lang.ExceptionInInitializerError: null
это означает, что не может найти класс в загрузчике классов или не знаю, какой из них загрузить (я полагаю). Вы встречали это?У меня было то же исключение - но только во время работы в режиме отладки, именно так я решил проблему (через 3 полных дня): в build.gradle у меня было: "multiDexEnabled true", установленный в разделе defaultConfig.
но, видимо, этого было недостаточно. но когда я изменился:
чтобы:
это решило это. надеюсь, это поможет кому-то
источник
Если вы работаете над проектом Android, убедитесь, что вы не вызываете статические методы ни для каких классов Android. Я использую только JUnit + Mockito, так что, может быть, некоторые другие фреймворки могут помочь вам вообще избежать этой проблемы, я не уверен.
Моя проблема была вызвана
Uri.parse(uriString)
как часть статического инициализатора для модульного теста. Класс Uri - это Android API, поэтому сборка тестового модуля не смогла его найти.null
Вместо этого я изменил это значение, и все вернулось к норме.источник
У меня были те же проблемы: java.lang.NoClassDefFoundError: Не удалось инициализировать класс com.xxx.HttpUtils
это проблема среды. Это означает, что свойства в application.yml неверны или пусты!
источник
Я сталкиваюсь с той же проблемой. Я добавил объект bean в статический блок, как показано ниже:
Просто потому, что процесс, инициированный моим объектом bean, вызвал NPE, у меня возникли проблемы с этим. Поэтому я думаю, что вы должны тщательно проверить статический блок кода.
источник