好的,这就是我们所拥有的:
我们有两个库包,我们已经将它们编译到 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 包含在其内部运行所需的所有内容。
这可能吗?(这是好的做法吗?)