Java 嵌套jar文件

Java 嵌套jar文件,java,Java,关于构建可执行jar文件的问题。假设我们有一个包含UI.class的jar文件a.jar。我在存档一个.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来使用这些类,这会更简单。这两

关于构建可执行jar文件的问题。假设我们有一个包含UI.class的jar文件a.jar。我在存档一个.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命令是什么,元文件中应该包含什么?当前命令为

jar cmf metafile a.jar UI.class

谢谢。

您看过这个工具吗?这也是一篇关于OneJar的好文章

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

编辑:OP询问MANIFEST.MF示例。我从示例jar文件中处理了这个问题

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

OneJar只适合将一些东西捆绑在一起,但它通常非常缓慢且不灵活。这不是对OneJar的挖苦,它的功能非常好,但除非我想为一个小程序提供一个快速、简单的可分发版本,否则我不会使用它


我确实用了一段时间,但后来改用了。它作为一个jar提供了一个安装程序,我发现它通常工作得很好,并且还支持windows特有的快捷方式。它也很容易集成到Ant。

另一种方法可以使用几种可用工具中的一种来创建一个安装可交付文件,并且安装包将在安装时打开你的应用程序。

< P>有人提到的OnEJAR,但也可以(尤其是如果你使用Eclipse),你可以考虑。p> 或者,您也可以通过使用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>

Maven用户也可以为此使用汇编插件:

我已经尝试过这个方法,它可以工作,但除非您的JAR文件非常小,否则它会导致应用程序启动速度非常慢。我尝试过这个方法,但无法运行它。问题:在boot-manifest.mf文件中,如果我保留“Main Class:package.ClassName”,当我运行“java-jar composite.jar”时,java找不到它,如果我省略该行,只保留“One-jar Main Class:package.ClassName”,java会抱怨清单没有“Main Class”条目。所以我被卡住了-你能举一个这个文件的例子吗?谢谢你,我感谢你的指点。非常感谢,酷豆,我感谢你的努力。希望说明更清楚,但不要抱怨。对于阅读此线程的其他人,您可以这样做:(1)mkdir boot(2)mkdir boot/main(3)mkdir boot/lib(4)cp one-jar.jar boot(5)cp a.jar boot/main(6)cp b.jar boot/lib(7)cp c.jar boot/lib(7)cd boot(8)jar xvf one-jar.jar(9)jar cvmf../d.jar boot-manifest.mf。(那是一个点)。d、 jar成为新的可执行文件。[a.jar->old executable,b.jar和c.jar使用的库]。很高兴我让它运行起来了。