Java ClassLoader找不到预期的资源

时间:2016-12-30 21:35:01

标签: java netbeans classpath classloader

我有一个包含以下内容的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独有的。

我使用LibJar作为ProgJar中的库。

这是我在ProjJar中运行的代码片段:

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

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

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

我如何实现指定的输出?

1 个答案:

答案 0 :(得分:0)

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

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

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

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