在具有 gradle 依赖项的嵌入式模式下连接到 derby 时出错:NoClassDefFoundError SystemPermission

Error connecting to derby in embedded mode with gradle dependencies : NoClassDefFoundError SystemPermission

我正在将项目迁移到 Gradle,并将 运行 迁移到 derby 的问题中。一切都很好,直到我将 derby 依赖项添加到我的 build.gradle - 我在连接时遇到此异常:

Connecting to SscceDb at jdbc:derby:D:\Sscce\DB//SscceDb;create=true with props [{password=HelloWhosebug, 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

我查看了其他几个类似的问题,但其中 none 似乎与我的问题相符。
这就是我在 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 方式在类路径中具有我的 derby 依赖项,则此方法有效:

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) 

已解决:我升级了 derby 和 derbytools 的版本,现在它可以使用 gradle 依赖项

我已经解决了我的问题,现在可以 运行 使用来自 gradle 的 derby 依赖项。我仍然不知道为什么它与 eclipse buildpath 依赖项一起工作但因 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'