我有一个包含以下内容的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
我如何实现指定的输出?
答案 0 :(得分:0)
下面的代码没有做你期望它做的事情:
ClassLoader clP = Pdir2.PClass2-1.class.getClassLoader();
ClassLoader clL = Ldir2.LClass2-1.class.getClassLoader();
这里clP和clL是相同的Classloader实例(系统/应用程序类加载器是特定的)。要验证,只需看到(clP == clL)
应该返回true。
您要做的是,使用自定义类加载器(URLClassLoader应该这样做)来加载您的库。然后,加载ProgJar的系统类加载器和您的自定义类加载器会有所不同。然后其余的代码应该按预期工作。