2011-07-25 78 views
4

我正在尝试从命令行创建可执行jar。 JAR中的主类具有依赖关系,我已将其打包到另一个纯JAR文件中。从命令行用可执行JAR(ÜberJAR)捆绑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.jarmain.jar相同。所以当我把的副本hello.jar并列main.jar我能够运行它。

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

我知道你会问:“他为什么试图这样做?”。我知道,大多数人使用Eclipse,Ant,Maven或其他工具来执行此操作。但请只是幽默我:)

回答

0

有没有简单的方法来做到这一点。也就是说,如果你想在罐子里放入罐子,你将不得不编写自己的类加载器。

有几种产品已经为您提供支持。 One-Jar是我使用过很多成功的产品之一 - 可以很容易地编写脚本。

这里有一个有趣等全专题讨论 -

Easiest way to merge a release into one JAR file

4

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