akardapolov / ASH-Viewer

ASH Viewer provides a graphical view of active session history data within the Oracle and PostgreSQL DB
GNU General Public License v3.0
167 stars 72 forks source link

java.lang.NoClassDefFoundError: org/bouncycastle/jcajce/provider/BouncyCastleFipsProvider #76

Closed Mingun closed 11 months ago

Mingun commented 11 months ago

Ни последний релиз, ни самостоятельно собранная утилита не запускаются. Попытка запуска выдает:

Последний релиз:

$ java -cp .:bc-noncert-1.0.2.4.jar -jar ashv.jar 
04.12.23 13:01:37.759 [main] INFO  Main - Start application
04.12.23 13:01:38.074 [main] INFO  BasicFrame - Start instantiating new BasicFrame
Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/jcajce/provider/BouncyCastleFipsProvider
    at config.security.BCFipsConfig_Factory.newInstance(BCFipsConfig_Factory.java:25)
    at config.security.BCFipsConfig_Factory.get(BCFipsConfig_Factory.java:17)
    at config.security.BCFipsConfig_Factory.get(BCFipsConfig_Factory.java:6)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at core.manager.ConfigurationManager_Factory.get(ConfigurationManager_Factory.java:45)
    at core.manager.ConfigurationManager_Factory.get(ConfigurationManager_Factory.java:13)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at gui.actions.ConnectToDbAction_Factory.get(ConnectToDbAction_Factory.java:35)
    at gui.actions.ConnectToDbAction_Factory.get(ConnectToDbAction_Factory.java:10)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at gui.MainWindow_Factory.get(MainWindow_Factory.java:62)
    at gui.MainWindow_Factory.get(MainWindow_Factory.java:13)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at config.dagger.DaggerMainComponent.createMainWindow(DaggerMainComponent.java:215)
    at Main.main(Main.java:16)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:527)
    ... 15 more

Очень странно учитывая, что в файле bc-noncert-1.0.2.4.jar класс org/bouncycastle/jcajce/provider/BouncyCastleFipsProvider действительно есть. Так как в исходниках я не вижу класса config.security.BCFipsConfig_Factory, полагаю, что его генерирует аннотация @Inject. Непонятно, почему при этом класс не находится.

Собранный самостоятельно файл:

$ mvn clean compile
...
$ mvn clean package -DskipTests=true
...
$ java -jar ashv/target/ashv-4.0-SNAPSHOT-jar-with-dependencies.jar
04.12.23 13:53:20.858 [main] INFO  Main - Start application
04.12.23 13:53:21.176 [main] INFO  BasicFrame - Start instantiating new BasicFrame
Exception in thread "main" java.lang.NoClassDefFoundError: org/bouncycastle/jcajce/provider/BouncyCastleFipsProvider
    at config.security.BCFipsConfig_Factory.newInstance(BCFipsConfig_Factory.java:25)
    at config.security.BCFipsConfig_Factory.get(BCFipsConfig_Factory.java:17)
    at config.security.BCFipsConfig_Factory.get(BCFipsConfig_Factory.java:6)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at core.manager.ConfigurationManager_Factory.get(ConfigurationManager_Factory.java:45)
    at core.manager.ConfigurationManager_Factory.get(ConfigurationManager_Factory.java:13)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at gui.actions.ConnectToDbAction_Factory.get(ConnectToDbAction_Factory.java:35)
    at gui.actions.ConnectToDbAction_Factory.get(ConnectToDbAction_Factory.java:10)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at gui.MainWindow_Factory.get(MainWindow_Factory.java:62)
    at gui.MainWindow_Factory.get(MainWindow_Factory.java:13)
    at dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
    at config.dagger.DaggerMainComponent.createMainWindow(DaggerMainComponent.java:215)
    at Main.main(Main.java:16)
Caused by: java.lang.ClassNotFoundException: org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 15 more

Воспроизводится на Ubuntu 22.04.3 LTS на

Mingun commented 11 months ago

Нашел причину проблемы -- оказывается, если указана опция -jar, то -cp молча игнорируется. Если запускать утилиту, как

$ java -cp ashv.jar:bc-noncert-1.0.2.4.jar Main

то все работает. Странно, но с первого раза при адаптации run.bat из релиза у меня это почему-то не получилось.

Мне кажется, для таких утилит лучше собирать самодостаточный fat jar, чтобы его можно было запускать без наличия радом других зависимостей.

akardapolov commented 11 months ago

Здравствуйте,

Нашел причину проблемы Еще есть такой вариант: https://stackoverflow.com/questions/10508799/java-classpath-noclassdeffounderror

Мне кажется, для таких утилит лучше собирать самодостаточный fat jar Будет ошибка Module checksum failed, решение - загружать BC FIPS отдельным файлом. https://github.com/bcgit/bc-java/issues/1415