Answers:
如果您试图创建一个包含应用程序及其所需库的jar,则有两种方法(我知道)。第一个是One-Jar,它使用特殊的类加载器来允许jar的嵌套。第二个是UberJar(或Shade),它会爆炸包含的库并将所有类放在顶级jar中。
我还应该提到UberJar和Shade分别是Maven1和Maven2的插件。如下所述,您还可以使用Assembly插件(实际上功能更强大,但更难正确配置)。
您不想使用那些“分解JAR内容”解决方案。它们绝对使查看东西变得更加困难(因为所有内容都在同一级别爆炸)。此外,可能存在命名冲突(如果人们使用适当的软件包,则不会发生,但您不能始终对此进行控制)。
您想要的功能是Sun排名前25位的RFE之一:RFE 4648386,Sun以其无穷的智慧将其指定为低优先级。我们只能希望太阳醒来...
同时,我遇到的最好的解决方案(希望Sun将其复制到JDK中)是使用自定义类加载器JarClassLoader。
activation.jar
)。
经过研究,我发现不需要Maven或任何第三方扩展/程序的方法。
您可以在清单文件中使用“类路径”。
例如:
创建清单文件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
代表create archive
f
表示您要指定文件
v
用于冗长的输入,
m
表示我们将传递自定义清单文件
确保在jar包中包含lib。您应该能够以正常方式运行jar。
基于: http //www.ibm.com/developerworks/library/j-5things6/
您需要了解的类路径中的所有其他信息你觉得这里
custom_lib.jar
移开,罐子就无法执行了:(
使用zipgroupfileset标记(使用与文件集标记相同的属性);它将解压缩目录中的所有文件并将其添加到新的存档文件中。详细信息:http : //ant.apache.org/manual/Tasks/zip.html
这是解决jar-in-a-jar问题的一种非常有用的方法-我知道,因为我在尝试弄清楚该怎么做的同时,已经在这个Google StackOverflow问题上进行了搜索。如果您想将一个jar或jar的一个文件夹打包到一个用Ant构建的jar中,那么就不用理会所有这些类路径或第三方插件,您要做的就是(在Ant中):
<jar destfile="your.jar" basedir="java/dir">
...
<zipgroupfileset dir="dir/of/jars" />
</jar>
如果您正在使用ant进行构建(我正在使用eclipse中的ant),则可以通过对ant进行添加来添加额外的jar文件。如果您有一个由多个人维护的项目,则不一定是最好的方法,但是它可以工作一个人的项目,很容易。
例如,我建立.jar文件的目标是:
<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
<manifest>
<attribute name="Author" value="ntg"/>
................................
<attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
</manifest>
</jar>
我只添加了一行即可:
<jar ....">
<zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
<manifest>
................................
</manifest>
</jar>
哪里
<property name="external-lib-dir"
value="C:\...\eclipseWorkspace\Filter\external\...\lib" />
是外部罐子的目录。就是这样...
我将maven用于我的Java构建,其中有一个名为maven程序集插件的插件。
它确实满足您的要求,但是像其他一些建议所描述的一样-本质上分解了所有依赖的jar,并将它们重新组合到单个jar中
Winstone相当不错http://blog.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/。但不适用于复杂的网站。这很遗憾,因为只需包含插件即可。
好吧,如果您使用的是Eclipse,则有一种非常简单的方法。
将项目导出为“可运行”的Jar文件(在Eclipse中右键单击项目文件夹,选择“导出...”)。配置导出设置时,请确保选择“将所需的库提取到生成的Jar中”。请记住,选择“提取...”而不是 “打包所需的库...”。
另外:您必须在导出设置中选择运行配置。因此,您总是可以在某个类中创建一个空的main(),并将其用于运行配置。
无论如何,它不能保证 100%的时间都能正常工作-因为您会注意到一条弹出消息,提示您确保检查所包含的Jar文件的许可证以及有关不复制签名文件的信息。但是,我这样做已经很多年了,从未遇到过问题。
解压缩到Uber-dir对我有用,因为我们所有人都应该使用root:\ java,并且在带有版本控制的软件包中包含出口代码。即ca.tecreations-1.0.0。可以签名,因为罐子从其下载位置是完整的。第三方签名完整无缺,提取到c:\ java。这是我的项目目录。从启动器运行,因此java -cp c:\ java Launcher