Я переношу проект в 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)