关于构建可执行jar文件的问题。假设我们有一个包含UI.class的jar文件 a.jar 。我在归档a.jar时使用了一个图元文件来说明
Main-Class: UI
Class-Path: . b.jar c.jar
现在,如果我想将这个可执行文件a.jar发送给某人,我必须发送3个文件 - a.jar,b.jar和c.jar。用户必须将所有3个放在同一个文件夹中,然后双击 a.jar 即可。如果我可以发送单个文件(a.jar)会更简单,并且JVM可以想出从那里提取b.jar和c.jar来使用这些类。这两个是外部库,我不想扩展它们并重新包装 a.jar 中的类文件。
可以这样做吗?如果是这样,什么是jar命令以及元文件中应该包含哪些内容?目前命令是
jar cmf metafile a.jar UI.class
谢谢。
答案 0 :(得分:1)
你看过这个工具OneJar了吗?另外this是关于OneJar的好文章。
如果您决定不使用外部工具,那么您可以选择将库/助手jar放入清单中的类路径中,然后将jar本身复制到相对于主jar的目录路径中。
编辑:OP要求提供一个示例MANIFEST.MF。我从示例One-Jar example jar文件中解决了这个问题。
Manifest-Version: 1.0
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Expand: expand,doc
答案 1 :(得分:1)
有人提到的OneJar,但也(尤其是如果你使用eclipse)你可以考虑fatjar。
或者,您也可以通过使用ANT任务来实现这一目标:
<target name="dist" depends="compile,static" description="Compiles and builds jar files">
<mkdir dir="${dist}"/>
<jar destfile="${dist}/MYAPP.jar">
<zipfileset src="${dist}/MY_OTHER_APP.jar"/>
<zipfileset src="${lib}/commons-io-1.4/commons-io-1.4.jar"/>
<zipfileset src="${lib}/commons-math-2.1/commons-math-2.1.jar"/>
<fileset dir="${res}" includes="*"/>
<manifest>
<attribute name="Main-Class" value=<where your main class is>/>
</manifest>
</jar>
</target>
答案 2 :(得分:0)
OneJar只是将一些东西捆绑在一起很好,但它通常很慢且不灵活。这不是对OneJar的挖掘,它对它的作用非常好,但除非我想要一个快速简单的可分发的小程序我不会使用它。
我确实使用了一段时间但后来改为izpack。它提供了一个安装程序作为单个jar,我发现它通常工作得很好,并支持诸如Windows特定快捷方式之类的东西。将它与蚂蚁整合起来也很容易。
答案 3 :(得分:0)
另一种方法是使用几种可用工具中的一种来创建设置可交付物,安装包将在安装时解压缩您的应用程序。
答案 4 :(得分:0)
Maven用户也可以使用程序集插件: http://maven.apache.org/plugins/maven-assembly-plugin/usage.html