我正在尝试从命令行创建一个可执行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
我现在使用:
创建可执行JARjar 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或其他工具来做到这一点。但请只是幽默我:)
答案 0 :(得分:6)
遗憾的是,您的方法完全错误。 没有“正常”的方法将jar 置于另一个jar的之内。所以你的hello.jar在main.jar中无关!关键是“普通”类加载器不会在jar中查找jar文件,因此你会得到类找不到错误。 但是:如果你想要做到这一点,那么google为“OneJar”并转到http://one-jar.sourceforge.net/
答案 1 :(得分:0)
没有简单的方法可以做到这一点。也就是说,如果你想在jar中嵌入jar,你将不得不编写自己的类加载器。
有几种产品已经为您提供支持。 One-Jar就是其中之一,我已经使用了很多成功 - 可以轻松地编写脚本。
以下是关于整个主题的有趣的SO讨论 -
答案 2 :(得分:0)
好吧,我相信你可能会面临一个jar代bug。查看this link,它可能会让您感到高兴。
预告片:
据我所知,并且基于我自己的尝试,没有 指定生成类加载器的Class-Path的方法 查看嵌入式jar文件。见前一段 为了描述。
因此,您可以查看以下链接之一: classpath-including-jar-within-a-jar,java-easiest-way-to-merge-a-release-into-one-jar-file
干杯!