【问题标题】:Nested jar files嵌套的 jar 文件
【发布时间】:2012-05-01 06:30:33
【问题描述】:

关于构建可执行 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 以使用这些类。这 2 个是外部库,我不想扩展它们并重新 jar a.jar 中的类文件。

这可以吗?如果是这样,什么是 jar 命令以及元文件中应该包含什么?目前的命令是

jar cmf metafile a.jar UI.class

谢谢。

【问题讨论】:

    标签: java


    【解决方案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
    

    【讨论】:

    • 我试过了,它可以工作,但除非你的 JAR 文件非常小,否则它会导致应用程序启动非常缓慢。
    • 我试过了,无法运行。问题:在文件boot-manifest.mf中,如果我保留“Main-Class:package.ClassName”,当我运行“java -jar composite.jar”时,java找不到它,如果我省略了该行,并保留只有“One-Jar-Main-Class:package.ClassName”,java抱怨清单没有“Main-class”条目。所以我被卡住了——你能举个例子说明这个文件的样子吗?谢谢,谢谢指点。
    • 非常感谢,CoolBeans,感谢您的努力。希望说明更清楚,但不要抱怨。对于阅读此线程的其他人,您可以这样做: (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-> 旧可执行文件,b.jar 和 c.jar 使用的库]。很高兴我让它运行起来了。
    【解决方案2】:

    正如人们提到的那样,有 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>
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        另一种方法是使用多种可用工具之一来创建可交付的安装程序,您的安装程序包将在安装时解压您的应用程序。

        【讨论】:

          【解决方案5】:

          Maven 用户也可以为此使用程序集插件: http://maven.apache.org/plugins/maven-assembly-plugin/usage.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-08
            • 2014-01-03
            • 1970-01-01
            • 2013-12-03
            • 1970-01-01
            • 2022-01-17
            • 2015-01-25
            • 2010-10-23
            相关资源
            最近更新 更多