Java 在带有渐变依赖项的嵌入式模式下连接到derby时出错:NoClassDefFoundError SystemPermission

Java 在带有渐变依赖项的嵌入式模式下连接到derby时出错:NoClassDefFoundError SystemPermission,java,gradle,derby,Java,Gradle,Derby,我正在将一个项目迁移到Gradle,但derby遇到了一个问题。在我将derby依赖项添加到build.gradle之前,一切都很顺利-我在connect上遇到了一个例外: Connecting to SscceDb at jdbc:derby:D:\Sscce\DB//SscceDb;create=true with props [{password=HelloStackOverflow, user=SscceDb, derby.system.home=D:\Sscce\DB}] Except

我正在将一个项目迁移到Gradle,但derby遇到了一个问题。在我将derby依赖项添加到build.gradle之前,一切都很顺利-我在connect上遇到了一个例外:

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”找到的

这是我的简单示例,它重复了这个问题:

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);
    }
}

解决:我升级了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'

您问题的这一部分使您的类路径中似乎有两个不同版本的Derby,这是有意的吗?”org.apache.derby:derby:10.15.1.3','org.apache.derby:derbytools:10.3.1.4'谢谢,你是对的-但我仍然不明白为什么连接到eclipse构建路径中的相同依赖项起作用,但在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) 
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'