2011-01-27 58 views
4

关于构建可执行jar文件的问题。假设我们有一个包含UI.class的jar文件a.jar。我已经使用在归档a.jar文件的图元文件,上面写着嵌套的jar文件

Main-Class: UI 
Class-Path: . b.jar c.jar 

现在,如果我希望将此可执行a.jar文件给别人,我有出货3个文件 - a.jar文件,b.jar和c 。罐。用户必须将所有3放在同一个文件夹中,然后双击a.jar才能工作。如果我可以发布一个单独的文件(a.jar),那么JVM就可以更简单地从中提取b.jar和c.jar来使用这些类。这两个是外部库,我不想扩展它们并重新打开a.jar中的类文件。

可以这样做吗?如果是这样,那么jar命令是什么以及metafile中应该包含哪些内容?目前的命令是

jar cmf metafile a.jar UI.class 

谢谢。

回答

1

你看过这个工具OneJar?另外this是在OneJar上阅读的好文章。

如果您决定不使用外部工具,那么您的替代方法是将库/助手罐放入清单中的类路径中,然后将罐自身复制到相对于主罐的目录路径中。

编辑:OP问一个例子MANIFEST.MF。我从示例One-Jar example jar文件中处理了这个问题。

Manifest-Version: 1.0 
Main-Class: com.simontuffs.onejar.Boot 
One-Jar-Expand: expand,doc 
+0

我已经试过这样做,它工程,但除非你的JAR文件很小,否则会导致应用程序启动速度非常慢。 – 2011-01-27 15:47:30

0

OneJar很适合将几件东西捆绑在一起,但它通常很慢且不灵活。这不是对OneJar的挖掘,它对于它的功能很棒,但除非我想要一个小程序的快速和轻松分发,否则我不会使用它。

我确实使用了它一段时间,但后来切换到izpack。它提供了一个安装程序作为一个单一的jar,我发现它通常工作得很好,并支持诸如windows特定快捷方式之类的东西。将它与蚂蚁集成也很容易。

0

另一种方式可以使用几种可用工具之一来创建安装交付件,并且安装程序包将在安装时解开应用程序。

1

有人提到OneJar,但也(尤其是如果你使用日食),你可以考虑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>