#java
#java
Вопрос:
У меня есть некоторые проблемы, такие как java.lang.NoClassDefFoundError: Could not initialize class java.time.zone.ZoneRulesProvider
java.lang.NoClassDefFoundError: Could not initialize class java.time.zone.ZoneRulesProvider
java.time.ZoneRegion.ofId(ZoneRegion.java:120)
java.time.ZoneId.of(ZoneId.java:411)
java.time.ZoneId.of(ZoneId.java:359)
java.time.ZoneId.of(ZoneId.java:315)
java.util.TimeZone.toZoneId(TimeZone.java:556)
com.impossibl.postgres.system.BasicContext.updateSystemParameter(BasicContext.java:824)
com.impossibl.postgres.system.BasicContext.access$000(BasicContext.java:103)
com.impossibl.postgres.system.BasicContext$ServerConnectionListener.parameterStatusChanged(BasicContext.java:128)
java.util.HashMap.forEach(HashMap.java:1280)
com.impossibl.postgres.protocol.v30.ServerConnectionFactory.connect(ServerConnectionFactory.java:240)
com.impossibl.postgres.protocol.v30.ServerConnectionFactory.connect(ServerConnectionFactory.java:158)
com.impossibl.postgres.protocol.v30.ServerConnectionFactory.connect(ServerConnectionFactory.java:139)
com.impossibl.postgres.system.BasicContext.<init>(BasicContext.java:213)
com.impossibl.postgres.jdbc.PGDirectConnection.<init>(PGDirectConnection.java:233)
com.impossibl.postgres.jdbc.ConnectionUtil.createConnection(ConnectionUtil.java:317)
com.impossibl.postgres.jdbc.AbstractDataSource.createConnection(AbstractDataSource.java:142)
com.impossibl.postgres.jdbc.PGDataSource.getConnection(PGDataSource.java:71)
com.impossibl.postgres.jdbc.PGDataSource.getConnection(PGDataSource.java:63)
msms.ListenNotify.<init>(ListenNotify.java:71)
msms.HelloWorldServlet.doGet(HelloWorldServlet.java:37)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
с установкой PATH=/opt/java/jdk1.8.0_91/jre/bin
и JAVA_HOME=/opt/java/jdk1.8.0_91/jre
. Это хороший стиль, которому нужно следовать.?
Где, как с PATH=/opt/java/jdk1.8.0_91/bin
только, не возникает никаких проблем с ZoneRulesProvider.
С чем я предпочитаю работать, и дайте мне знать о наилучшем и предпочтительном стиле настройки переменных env.?
Комментарии:
1. Извините, не связано с вашим вопросом, но реальный вопрос заключается в том, почему вы используете JDK 8 в 2020 году? — я предполагаю, что вы работаете над каким-то древним проектом, а не над новым?
2.
NoClassDefFoundError
управляется CLASSPATH, а не PATH. Вот руководство: docs.oracle.com/javase/tutorial/essential/environment/… (Также обратите внимание, что файлы Jar имеют свой собственный внутренний путь к классу и на них не влияет переменная среды CLASSPATH.)3. @Leun4m Java 8 находится на расширенной поддержке до 2030 года. Вполне разумно, что некоторые производственные среды все еще будут требовать этого.
4. @markspace да, я знаю, о чем ты говоришь. Я просто хочу повысить осведомленность на случай, если кто-то свободно создает новый проект, не осознавая, что он использует старый JDK…
Ответ №1:
Очевидной причиной NoClassDefFoundError является то, что определенный класс недоступен в Classpath, поэтому вам нужно добавить его в Classpath или вам нужно проверить, почему он недоступен в Classpath, если вы ожидаете, что он будет. Может быть несколько причин, таких как:
-
Класс недоступен в Java Classpath.
-
Возможно, вы запускаете свою программу с помощью команды jar, а класс не был определен в атрибуте ClassPath файла манифеста.
-
Любой сценарий запуска переопределяет переменную среды Classpath.
-
Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может возникнуть, если одна из его зависимостей, например, собственная библиотека, может быть недоступна.
-
Проверьте наличие java.lang.Ошибка ExceptionInInitializerError в вашем файле журнала. Ошибка NoClassDefFoundError из-за сбоя статической инициализации довольно распространена.
-
Если вы работаете в среде J2EE, то видимость класса среди нескольких загрузчиков классов также может вызвать java.lang.Ошибка NoClassDefFoundError,
Просто попробуйте запустить с параметром явно -classpath с тем classpath, который, по вашему мнению, будет работать, и если он работает, то это верный короткий признак того, что кто-то переопределяет java classpath.
если вы можете опубликовать всю трассировку стека, я могу помочь вам определить причину этой ошибки
Комментарии:
1. Я добавил полную информацию о трассировке стека.
2. Как вы отметили в комментариях, вы используете jre.1.8.0_91. Пожалуйста, попробуйте использовать сам JDK (не JRE). класс будет дополнен и найден позже при правильном использовании jdk.