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