gpt4 book ai didi

java - 在 jar 中包含库

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:09 25 4
gpt4 key购买 nike

好的,这就是我们得到的:

我们有两个库包,我们已经编译成 jars。

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.javajar cvf barwars.jar -C bin . 

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

都很好地装进了我们的 jar 里。

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

所以我们有

  • /project/src/a_pack/HelloWorld.java
  • /project/libs/starwars.jar
  • /project/libs/barwars.jar
  • /project/manifest.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();     }}

list .txt

Main-Class: a_pack.HelloWorldClass-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 文件移动到其他地方并尝试运行它,那么我会得到:

线程“main”中的异常 java.lang.NoClassDefFoundError: starwars/JarJar

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

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

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

最佳答案

可能,是的。好的做法,不。

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

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

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

关于java - 在 jar 中包含库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16764834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com