【问题标题】:Bundling JAR dependencies with executable JAR (Über JAR) from command line从命令行将 JAR 依赖项与可执行 JAR (Über JAR) 捆绑在一起
【发布时间】:2011-10-12 15:47:08
【问题描述】:

我正在尝试从命令行创建一个可执行的 jar。 JAR 中的主类具有我已打包到另一个普通 JAR 文件中的依赖项。

我想将依赖项 JAR 与可执行 JAR 一起打包,以便提供一个 JAR 文件。

到目前为止我尝试过的如下:

依赖Hello.class文件有模拟代码:

public class Hello {
    public String getHello() {
        return "Well hello there!!";
    }
}

我已使用以下方法将类文件打包到 hello.jar 中:

jar cvfM hello.jar Hello.class

hello.jar 内容现在是:

hello.jar -+- Hello.class

现在我有了带有模拟代码的主类:

public class Main {
    public static void main(String[] args) {
        System.out.println(new Hello().getHello());
    }
}

然后我创建一个清单文件 manifest.txt,其内容如下:

Main-Class: Main
Class-Path: hello.jar

我现在使用以下命令创建可执行 JAR:

jar cvfm main.jar manifest.txt Main.class hello.jar

main.jar 内容现在是:

main.jar -+- Main.class
          |
          +- hello.jar
          |
          +- META-INF -+- MANIFEST.MF

使用以下命令运行可执行 JAR:

java -jar main.jar

我收到 Hello 类依赖项的类加载器错误。我知道这是因为类加载器在与 main.jar 相同的路径中查找 hello.jar。因此,当我将 hello.jar 的副本放在 main.jar 旁边时,我就可以运行它了。

我需要做什么才能运行带有 hello.jar 的 main.jar

我知道你会问:“他为什么要这样做?”。我知道 ppl 主要使用 Eclipse、Ant、Maven 或其他工具来执行此操作。但请幽默我:)

【问题讨论】:

    标签: java jar classpath executable-jar


    【解决方案1】:

    不幸的是,您的方法完全错误。 没有“正常”的方法可以将一个罐子放入另一个罐子。所以你的 hello.jar 在 main.jar 中没有任何关系!关键是“正常”类加载器不会在 jar 中查找 jar 文件,因此您会得到类未找到错误。 但是:如果你想绝望地这样做,那么谷歌搜索“OneJar”并转到http://one-jar.sourceforge.net/

    【讨论】:

      【解决方案2】:

      没有简单的方法可以做到这一点。也就是说,如果要将 jar 嵌套在 jar 中,则必须编写自己的类加载器。

      有几种产品已经为您提供支持。 One-Jar 是我成功使用过的其中之一——可以轻松地编写脚本。

      这是一个关于整个主题的有趣的 SO 讨论 --

      Easiest way to merge a release into one JAR file

      【讨论】:

        【解决方案3】:

        好吧,我相信您可能会遇到 jar 生成错误。看看this link,它可能会启发你。

        预告片:

        据我所知,根据我自己的尝试,没有 指定使类加载器的类路径的方法 查看嵌入的 jar 文件。见上一段 用于描述。

        因此,您可以查看以下链接之一: classpath-including-jar-within-a-jar, java-easiest-way-to-merge-a-release-into-one-jar-file

        干杯!

        【讨论】:

          猜你喜欢
          • 2013-02-13
          • 2014-06-26
          • 2012-11-01
          • 2013-11-02
          • 1970-01-01
          • 2019-04-01
          • 2019-07-24
          • 2015-06-07
          • 2011-08-25
          相关资源
          最近更新 更多