我有一个用Eclipse构建的可执行jar文件(A.jar),它依赖于jar文件中包含的其他jar文件(B.jar),并通过jarinjarloader访问。虽然这可以访问这些jar文件中的java代码,但是当代码调用
时InputStream inStream = <Class>.getClassLoader().getResourceAsStream(propFile);
无法找到B.jar中包含的属性文件。代码在Eclipse中运行时有效,因此我知道正确的属性文件存在。
我尝试提取A.jar,然后提取B.jar,然后压缩组合文件,但这不起作用。查看Manifest文件,Main-Class是org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
我是否可以对Manifest文件进行一些更改(例如,向Rsrc-Class-Path添加一些内容)以使其生效? Rsrc-Class-Path已经包含“./”,但显然不会让属性加载器看到我的属性文件。
TIA,
格雷格
答案 0 :(得分:2)
我还建议解决嵌套的jar。我通常只是在build.xml中执行此操作来构建一个jar,并将所有库解压缩到其中:
<target name="fatjar" depends="compile">
<jar destfile="${isamjar}" filesetmanifest="mergewithoutmain">
<manifest>
<attribute name="Main-Class" value="com.xyz.Main"/>
<attribute name="Class-Path" value="."/>
</manifest>
<fileset dir="./bin"/>
<fileset dir="." includes="src/**"/>
<zipfileset excludes="META-INF/*.SF" src="${l}/derby.jar"/>
<zipfileset excludes="META-INF/*.SF" src="${l}/jconn3.jar"/>
<zipfileset excludes="META-INF/*.SF" src="${l}/log4j-1.2.9.jar"/>
<zipfileset excludes="META-INF/*.SF" src="${l}/${jar4j}"/>
</jar>
答案 1 :(得分:1)
原来Eclipse有一个我错过的设置。当导出“可运行的JAR文件”时,您可以选择“将所需的库提取到生成的JAR ”。虽然这可能会给出一些许可证问题(取决于你合并的JAR),但就我而言,它就像一个魅力,给我一个单独的(更小,因为我在各种jar文件中有很多重复的东西)已经包括了实际工作的罐子。