Проблемы с classpath с jdk и jre?

#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, если вы ожидаете, что он будет. Может быть несколько причин, таких как:

  1. Класс недоступен в Java Classpath.

  2. Возможно, вы запускаете свою программу с помощью команды jar, а класс не был определен в атрибуте ClassPath файла манифеста.

  3. Любой сценарий запуска переопределяет переменную среды Classpath.

  4. Поскольку NoClassDefFoundError является подклассом java.lang.LinkageError, он также может возникнуть, если одна из его зависимостей, например, собственная библиотека, может быть недоступна.

  5. Проверьте наличие java.lang.Ошибка ExceptionInInitializerError в вашем файле журнала. Ошибка NoClassDefFoundError из-за сбоя статической инициализации довольно распространена.

  6. Если вы работаете в среде J2EE, то видимость класса среди нескольких загрузчиков классов также может вызвать java.lang.Ошибка NoClassDefFoundError,

Просто попробуйте запустить с параметром явно -classpath с тем classpath, который, по вашему мнению, будет работать, и если он работает, то это верный короткий признак того, что кто-то переопределяет java classpath.

если вы можете опубликовать всю трассировку стека, я могу помочь вам определить причину этой ошибки

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

1. Я добавил полную информацию о трассировке стека.

2. Как вы отметили в комментариях, вы используете jre.1.8.0_91. Пожалуйста, попробуйте использовать сам JDK (не JRE). класс будет дополнен и найден позже при правильном использовании jdk.