【问题标题】:Java ClassLoader Not Finding Expected ResourceJava ClassLoader 未找到预期的资源
【发布时间】:2016-12-30 21:35:00
【问题描述】:

我有一个包含以下内容的 jar 文件:

LibJar Contents

dir1
   |dir1-1
   |     |Class1-1-1
   |     |LClass1-1-2
   |Ldir1-2
         |LClass1-2-1
Ldir2
   |LClass2-1

我的 java 程序(我们可以称它为 ProgJar,但我也在 Netbeans IDE 中运行它)具有以下包结构:

ProgJar

dir1
   |dir1-1
   |     |Class-1-1
   |     |PClass1-1-2        Different file name from LibJar
Pdir2
   |PClass2-1

ProgJar 和 LibJar 之间唯一共享的包结构是“dir1/dir1-1/Class1-1-1”。以 P 为前缀的其他所有内容对于 ProgJar 都是唯一的,而以 L 为前缀的所有内容对于 LibJar 都是唯一的。

我在 ProgJar 中使用 LibJar 作为库。

这是我在 ProjJar 中运行的代码的 sn-p:

ClassLoader clP = Pdir2.PClass2-1.class.getClassLoader();
ClassLoader clL = Ldir2.LClass2-1.class.getClassLoader();

URL u1 = clP.getResource("dir1/dir1-1");
URL u2 = clL.getResource("dir1/dir1-1");

System.out.printf(u1.toExternalForm());
System.out.printf(u2.toExternalForm());

当我在 Netbeans 中运行它时,我得到以下输出:

Netbeans Output:
jar:file:/C:/path/to/project/lib/LibJar.jar!/dir1/dir1-1
jar:file:/C:/path/to/project/lib/LibJar.jar!/dir1/dir1-1

当我以 ProgJar 作为 netbeans 之外的内置 jar 运行时,我得到:

Jar Output:
jar:file:/C:/path/to/ProgJar/ProgJar.jar!/dir1/dir1-1
jar:file:/C:/path/to/ProgJar/ProgJar.jar!/dir1/dir1-1

我希望看到的是以下内容:

Netbeans Output:
jar:file:/C:/path/to/project/build/classes/dir1/dir1-1
jar:file:/C:/path/to/project/lib/LibJar.jar!/dir1/dir1-1

Jar Output:
jar:file:/C:/path/to/ProgJar/ProgJar.jar!/dir1/dir1-1
jar:file:/C:/path/to/ProgJar/libs/LibJar.jar!/dir1/dir1-1

我阅读了几篇不同的文章,但这篇文章似乎与这个特定问题有些相关:

http://jeewanthad.blogspot.com/2014/02/how-to-solve-java-classpath-hell-with.html

我怎样才能达到我指定的输出?

【问题讨论】:

    标签: java netbeans classpath classloader


    【解决方案1】:

    下面的代码没有做你期望它做的事情:

    ClassLoader clP = Pdir2.PClass2-1.class.getClassLoader();
    ClassLoader clL = Ldir2.LClass2-1.class.getClassLoader();
    

    这里 clP 和 clL 是相同的 Classloader 实例(具体是您的系统/应用程序类加载器)。要验证,只需查看 (clP == clL) 应该返回 true。

    您想要做的是,使用自定义类加载器(URLClassLoader 应该做的)来加载您的库。然后,加载您的 ProgJar 的系统类加载器和您的自定义类加载器将不同。然后您的其余代码应该按预期工作。

    【讨论】:

    • 我会试一试并报告。
    • 您的问题有进展吗?
    • 我还没来得及尝试这个。这周我会努力做到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2019-04-30
    • 2013-06-22
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多