11

好的,这就是我们所拥有的:

我们有两个库包,我们已经将它们编译到 jar 中。

包装星球大战;
公共类罐子{

    公共无效 JarSayHello()
    {
        System.out.println("Jaaaaar!!");
    }

}

包barwars;
公共类 BarBar {

    公共无效 BarSayHello()
    {
        System.out.println("咩!!");
    }

}

我们编译这些

javac -d bin -sourcepath src src/barwars/BarBar.java
jar cvf barwars.jar -C bin 。

javac -d bin -sourcepath src src/starwars/JarJar.java
jar cvf starwars.jar -C bin 。

对我们来说,一切都很好地装进罐子里。

现在我们想将这两个 jar 包含到另一个 java 项目中。

所以我们有

  • /project/src/a_pack/HelloWorld.java
  • /project/libs/starwars.jar
  • /project/libs/barwars.jar
  • /project/manifest.txt
包 a_pack;
导入starwars.JarJar;
导入 barwars.BarBar;

公共类 HelloWorld {

    公共静态无效主要(字符串[]参数){    
        System.out.println("你好,世界");         
        JarJar myJar = new JarJar();
        myJar.JarSayHello();        
        BarBar myBar = new BarBar();
        myBar.BarSayHello();
    }

}

清单.txt

主类:a_pack.HelloWorld
类路径:libs/starwars.jar libs/barwars.jar

现在我们编译它:

javac -d bin -sourcepath src -cp "libs/starwars.jar;libs/*" src/a_pack/HelloWorld.java
jar cvfm helloworld.jar manifest.txt -C bin 。

这编译并运行良好。

现在我有两个问题。

首先 - 如果我将此 jar 文件移动到其他地方并尝试运行它,那么我将得到:

Exception in thread "main" java.lang.NoClassDefFoundError: starwars/JarJar

现在我可以通过将 libs 文件夹移动到我移动 jar 的任何位置来解决这个问题。但这让我觉得很乱(如果那个位置已经有一个 libs 文件夹怎么办?)。

理想情况下,我想做的是将引用的 jar 包含在 jar 中,因此有一个 jar 包含在其内部运行所需的所有内容。

这可能吗?(这是好的做法吗?)

4

1 回答 1

8

可能,是的。好习惯,不。

罐子只是 zip 文件,因此您可以解压缩并重新压缩到您喜欢的内容。更大的问题是随着您的项目变得越来越大,管理所有这些单独的 jar。

大多数项目不使用命令行编译。相反,IDE 可以让您的 jar 保持最新。大多数现代 Java 项目使用 Maven 或 Ivy 将 jars 放在存储库中,并根据需要将它们取出。

查看 Eclipse、Netbeans 或 Intellij 的 IDE。并查看 Maven 以构建您的项目。

于 2013-05-27T00:10:13.580 回答