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

问题描述 投票:1回答:1

我正在将项目迁移到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中指定依赖项的方式,这是通过搜索“ gradledependency 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);
    }
}

对于一些上下文,如果我以非渐进的方式在类路径中有我的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) 
java gradle derby
1个回答
1
投票

已解决:我升级了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'
© www.soinside.com 2019 - 2024. All rights reserved.