Ошибка подключения к дерби во встроенном режиме с зависимостями gradle: NoClassDefFoundError SystemPermission - PullRequest
1 голос
/ 02 апреля 2020

Я переношу проект в Gradle и столкнулся с проблемой дерби. Все было хорошо, пока я не добавил зависимости derby в свой build.gradle - я получаю это исключение при подключении:

Connecting to SscceDb at jdbc:derby:D:\Sscce\DB//SscceDb;create=true with props [{password=HelloStackOverflow, user=SscceDb, derby.system.home=D:\Sscce\DB}]
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/derby/shared/common/security/SystemPermission
   at org.apache.derby.iapi.jdbc.AutoloadedDriver.connect(AutoloadedDriver.java:134)
   at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
   at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)
   at org.ferriludium.curator.Sscce.scce(Sscce.java:45)
   at org.ferriludium.curator.Sscce.main(Sscce.java:54)
Caused by: java.lang.ClassNotFoundException: org.apache.derby.shared.common.security.SystemPermission
   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)
   ... 5 more

Я смотрел на несколько других похожих вопросов, но ни один из них, похоже, не соответствует моему проблема.
Вот как я определяю свою зависимость в build.gradle, что я и нашел, выполнив поиск по запросу "gradle dependency derby"

implementation 'com.google.guava:guava:28.0-jre', 'org.jsoup:jsoup:1.13.1', 'commons-io:commons-io:2.6', 'org.apache.commons:commons-lang3:3.0', 'org.apache.derby:derby:10.15.1.3', 'org.apache.derby:derbytools:10.3.1.4'

Это мой простой пример, который дублирует проблему :

private String protocol = "jdbc:derby:";
void sscce(String dbName, String storageLoc, String password) {
    Properties props = new Properties(); // connection properties
    props.put("user", dbName);
    props.put("password", password);
    props.put("derby.system.home", storageLoc);
    String dbUrl=protocol + storageLoc + "//" + dbName + ";create=true" ;
    System.out.println("Connecting to " + dbName + " at " + dbUrl+ " with props [" + props + "]"); System.out.flush();
    try {
        Connection conn = DriverManager.getConnection(dbUrl, props);     <=== This is line 45
    } catch (SQLException e) {
        System.err.println("Boom: [" + e.getLocalizedMessage() + "]");
        e.printStackTrace(System.err);
    }
}

Для некоторого контекста это работает, если у меня есть зависимость от дерби в пути к классам без использования gradle:

Connecting to SscceDb at jdbc:derby:D:\Sscce\DB//SscceDb;create=true with props [{password=SsccePwd, user=SscceDb, derby.system.home=D:\Sscce\DB}]
Connected to SscceDb at jdbc:derby:D:\Sscce\DB//SscceDb;create=true
Adapter connected to org.apache.derby.impl.jdbc.EmbedConnection@1716932897 (XID = 168), (SESSIONID = 3), (DATABASE = D:\Sscce\DB//SscceDb), (DRDAID = null) 

1 Ответ

1 голос
/ 04 апреля 2020

Решено: Я обновил версии derby и derbytools, и теперь он работает с использованием зависимостей gradle

Я решил свою проблему и теперь могу работать с использованием зависимостей derby из gradle. Я до сих пор не знаю ответа на основной вопрос о том, почему он работал с зависимостями buildpath eclipse, но не работал с зависимостями gradle.

Я собираюсь принять этот ответ, но если кто-нибудь отправит сообщение с объяснением того, почему первоначально поведение отличалось между gradle и eclipse, я приму это с моей благодарностью.

Вот моя новая строка реализации Gradle.

implementation 'com.google.guava:guava:28.0-jre', 'org.jsoup:jsoup:1.13.1', 'commons-io:commons-io:2.6', 'org.apache.commons:commons-lang3:3.0' , 'org.apache.derby:derby:10.15.2.0', 'org.apache.derby:derbytools:10.15.2.0'
...