从命令行将JAR依赖项与可执行JAR(ÜberJAR)捆绑在一起

时间:2011-07-25 14:27:12

标签: java jar classpath executable-jar

我正在尝试从命令行创建一个可执行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或其他工具来做到这一点。但请只是幽默我:)

3 个答案:

答案 0 :(得分:6)

遗憾的是,您的方法完全错误。 没有“正常”的方法将jar 置于另一个jar的之内。所以你的hello.jar在main.jar中无关!关键是“普通”类加载器不会在jar中查找jar文件,因此你会得到类找不到错误。 但是:如果你想要做到这一点,那么google为“OneJar”并转到http://one-jar.sourceforge.net/

答案 1 :(得分:0)

没有简单的方法可以做到这一点。也就是说,如果你想在jar中嵌入jar,你将不得不编写自己的类加载器。

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

以下是关于整个主题的有趣的SO讨论 -

Easiest way to merge a release into one JAR file

答案 2 :(得分:0)

好吧,我相信你可能会面临一个jar代bug。查看this link,它可能会让您感到高兴。

预告片:

  

据我所知,并且基于我自己的尝试,没有   指定生成类加载器的Class-Path的方法   查看嵌入式jar文件。见前一段   为了描述。

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

干杯!