是否可以指定classpath
包含另一个JAR文件中包含的JAR文件的Java ?
如果您正在尝试创建包含应用程序及其所需库的单个jar,则有两种方法(我知道)可以执行此操作.第一个是One-Jar,它使用一个特殊的类加载器来允许嵌套jar.第二个是UberJar(或Shade),它会爆炸包含的库并将所有类放在顶级jar中.
我还要提一下,UberJar和Shade分别是Maven1和Maven2的插件.如下所述,您还可以使用程序集插件(实际上它更强大,但更难以正确配置).
您不想使用那些"爆炸JAR内容"解决方案.他们肯定会更难看到东西(因为一切都在同一水平爆炸).此外,可能存在命名冲突(如果人们使用正确的包,则不应该发生,但您不能总是控制它).
您想要的功能是25大Sun RFE之一:RFE 4648386,Sun以其无限的智慧指定为低优先级.我们只能希望Sun醒来......
同时,我遇到的最佳解决方案(我希望Sun将在JDK中复制)是使用自定义类加载器JarClassLoader.
经过一些研究,我找到了不需要maven或任何第三方扩展/程序的方法.
您可以在清单文件中使用"Class-Path".
例如:
创建清单文件MANIFEST.MF
Manifest-Version: 1.0 Created-By: Bundle Class-Path: ./custom_lib.jar Main-Class: YourMainClass
编译所有类并运行 jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar
c
代表创建存档
f
表示您要指定文件
v
是为了详细输入
m
意味着我们将传递自定义清单文件
确保在jar包中包含lib.你应该能够以正常方式运行jar.
基于:http://www.ibm.com/developerworks/library/j-5things6/
您在这里找到关于类路径的所有其他信息
使用zipgroupfileset标记(使用与fileset标记相同的属性); 它将解压缩目录中的所有文件并添加到新的存档文件中.更多信息:http://ant.apache.org/manual/Tasks/zip.html
这是解决jar-in-a-jar问题的一种非常有用的方法 - 我知道,因为我在搜索这个确切的StackOverflow问题的同时试图弄清楚要做什么.如果你想将jar或jar文件夹打包到你的一个带有Ant的jar中,那么就忘记所有这些类路径或第三方插件,你要做的就是这个(在Ant中):
...
如果你正在使用ant构建(我正在使用eclipse中的ant),你可以通过对ant添加它们来添加额外的jar文件...如果你有一个由多人维护的项目但不是最好的方法对于一个人项目而且很容易.
例如,构建.jar文件的目标是:
................................
我刚刚添加了一行来制作它:
................................
哪里
是与外部罐子的dir.就是这样......
不是没有编写自己的类加载器.您可以将jar添加到jar的类路径中,但它们必须位于同一位置,而不是包含在主jar中.