【问题标题】:jar file with all the dependeny libraries unpacked解压所有依赖库的jar文件
【发布时间】:2014-04-20 08:32:28
【问题描述】:

我正在尝试使用所有依赖项 jar 文件来构建我的应用程序 jar(非可执行 jar)以解包。

只是为了解释我的问题,在eclipse中,导出runnable/executable jar,有一个选项 “将所需的库提取到生成的 Jar 中”

请帮助我也为不可运行的 jar 提供相同的选项。

谢谢

【问题讨论】:

    标签: java eclipse jar


    【解决方案1】:

    没有。

    正如背景:在 JAR 文件(有时称为 fat jar 或 app jar)中打包依赖项不是原生 Java 机制,而是通过使用自定义 ClassLoaders 或打包在 JAR 中的启动脚本进行移植。

    如果您使用 Eclipse 创建一个可运行的 JAR 文件,它会使用一个包装器来运行您的应用程序,该应用程序可以读取打包的库。如果您打开导出的 JAR 文件并查看它的 Manifest,您可以看到这一点:

    Manifest-Version: 1.0
    Rsrc-Class-Path: ./ [removed]
    Class-Path: .
    Rsrc-Main-Class: com.example.Test
    Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
    

    JarRsrcLoader 位于您的应用程序主类和 Java 运行时之间,然后可以在执行代码之前加载打包的依赖项。在库中,没有 Eclipse 可以挂钩的钩子,因为加载是由使用您的库的人完成的,您无法控制加载过程。

    有一些机制可以将 JAR 文件组合成一个文件,方法是解压缩依赖项,然后将它们重新打包到 JAR 中。例如看这里:How to combine two Jar files

    请注意,通过重新打包第 3 方 JAR,您可能会遇到签名类或元数据冲突的问题。

    如果您想正确发布库和/或管理依赖项,我建议您研究构建系统,例如 Maven (http://maven.apache.org/) 或 Gradle (http://www.gradle.org/)。我个人更喜欢 Gradle。

    编辑:这个项目看起来很有希望:https://github.com/puniverse/capsule

    【讨论】:

      【解决方案2】:

      使用Capsule。它可以做你想做的一切,包括在清单中设置 JVM 配置。

      使用 capsule,您可以选择将所有 JAR 和本机库直接打包到 capsule JAR 中,或者您可以在 Manifest 中指定您的 Maven 依赖项,并在第一次启动 capsule 时下载它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-10
        相关资源
        最近更新 更多