gpt4 book ai didi

java - jar 内的 NoClassDefFoundError

转载 作者:行者123 更新时间:2023-12-02 09:16:28 27 4
gpt4 key购买 nike

上下文

为了学习使用 ant,我做了一个小型概念验证项目:

我创建了一个小 JAR 文件,其中仅包含一个类,您可以在此处看到:

public class Dummy {

private String name;

public Dummy(String name) {
this.name = name;
}

public String getName() {
return name;
}
}

我制作了一个 JAR,名为 ​​lib/dummy.jar 。这是它的 list :

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.5
Created-By: 1.8.0_232-b09 (Oracle Corporation)
Class-Path:

项目

现在,我想在如下所示的主类中使用该 JAR:

public class Main {
public static void main(String[] args) {
Dummy f = new Dummy("Hello, World!");
System.out.println(f.getName());
}
}

我可以毫无问题地编译它(如果我在类路径中包含我的 JAR)。

然后,我尝试制作该主类的 JAR。 JAR 包含以下内容:

META-INF/
|- MANIFEST.MF
Main.class
dummy.jar

list 包含:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.10.5
Created-By: 1.8.0_232-b09 (Oracle Corporation)
Main-Class: Main
Class-Path: dummy.jar

JAR 已成功创建。

问题

如果我尝试运行 JAR,我会得到一个 Exception in thread "main" java.lang.NoClassDefFoundError: Dummy

代码应该可以工作,因为如果我包含我的初始 dummy.jar在运行时的类路径中,一切正常。 (java -cp build/jar/run-me.jar:lib/dummy.jar Main)

为什么我单独运行 JAR 时它不起作用?

build.xml

如果有任何用处,这是我的 build.xml (很高兴在评论中接受改进):

<project default="all">
<path id="build.classpath">
<fileset dir="lib">
<include name="**/*.jar" />
</fileset>
</path>
<pathconvert property="mf.classpath" pathsep=" ">
<path refid="build.classpath" />
<flattenmapper />
</pathconvert>

<target name="all" depends="compile,jar,run" />

<target name="compile">
<mkdir dir="build/classes" />
<javac srcdir="src" destdir="build/classes" includeantruntime="false">
<classpath>
<fileset dir="lib">
<include name="**/*.jar" />
</fileset>
</classpath>
</javac>
</target>

<target name="jar">
<mkdir dir="build/jar" />
<jar destfile="build/jar/run-me.jar" basedir="build/classes">
<manifest>
<attribute name="Main-Class" value="Main" />
<attribute name="Class-Path" value="${mf.classpath}" />
</manifest>
<path id="build.classpath">
<fileset dir="lib">
<include name="**/*.jar" />
<include name="**/*.zip" />
</fileset>
</path>
</jar>
</target>

<target name="run">
<java jar="build/jar/run-me.jar" fork="true"></java>
</target>

<target name="clean">
<delete dir="build" />
</target>
</project>

最佳答案

Class-Path: dummy.jar 表示它在与 run-me 相同的文件夹中查找 dummy.jar .jar。它不会在内部run-me.jar寻找它。

由于run-me.jar位于build/jar中,而dummy.jar位于lib中,您需要指定 Class-Path: ../../lib/dummy.jar 才能正常工作。

最好保留Class-Path: dummy.jar,并在运行时将两个 jar 文件放在同一文件夹中。

关于java - jar 内的 NoClassDefFoundError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58948144/

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