好的,这就是我们得到的:
我们有两个库包,我们已将它们编译成 jar。
package starwars;
public class JarJar {
public void JarSayHello()
{
System.out.println("Jaaaaar!!");
}
}
package barwars;
public class BarBar {
public void BarSayHello()
{
System.out.println("Baaaaa!!");
}
}
我们编译这些
javac -d bin -sourcepath src src/barwars/BarBar.java
jar cvf barwars.jar -C bin .
and
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
- /项目/清单.txt
package a_pack;
import starwars.JarJar;
import barwars.BarBar;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World");
JarJar myJar = new JarJar();
myJar.JarSayHello();
BarBar myBar = new BarBar();
myBar.BarSayHello();
}
}
清单.txt
Main-Class: a_pack.HelloWorld
Class-Path: 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 包含在其内部运行所需的所有内容。
这可能吗? (这是好的做法吗?)