【问题标题】:NoClassDefFoundError for dependencies when compiling executable jar with no build tools在没有构建工具的情况下编译可执行 jar 时依赖项的 NoClassDefFoundError
【发布时间】:2021-07-31 23:12:43
【问题描述】:

我正在尝试将我的 Java 程序编译为可执行的 jar 文件,并且我尝试按照各个地方的所有说明进行操作,但遇到了问题。

类文件

我做的第一件事就是用这个命令把所有东西编译成类文件。

javac -d ./build src/main/**/*.java -cp lib/main/commons-cli-1.4/commons-cli-1.4.jar:lib/main/commons-io-2.8.0/commons-io-2.8.0.jar

这会将src/main 中的所有.java 文件(我当然不想编译测试)编译到一个名为build 的文件夹中。它还将类路径设置为代码所依赖的所有 .jar 文件(Apache Commons CLI 和 Apache Commons IO)。

Jar 文件

下一步是生成.jar 文件。为此,我使用以下命令(在cd ./build 之后)。

jar cvfm ../bin/program.jar manifest.txt .

这里,manifest.txt 位于文件夹 build 中,包含以下内容。 (根据文档的规定,它以换行符结尾。)

Main-Class: cli.Cli

这里,cli.Cli 指的是位于 src/main/cli/Cli.java 中的名为 Cli 的类,其中包含 main 方法。

运行罐子

现在我使用以下命令尝试运行生成的program.jar 文件,但出现此错误。

$ java -jar build/program.jar
Error: Unable to initialize main class cli.Cli
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/cli/ParseException

这个错误是指src/main/cli/Cli.java 中的一个导入语句,它应该与所有其他导入语句在同一个.jar 文件中。 IDE 确实可以识别导入,但我不确定为什么我无法运行该文件。这是我从Cli.java 导入的摘录。

package cli;

import java.io.IOException;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.io.FilenameUtils;
// more imports...

编辑

我尝试将清单更改为包含类路径,但这似乎没有任何帮助。我尝试了以下两个版本的清单。

相对于bin/build/

Main-Class: cli.Cli
Class-Path: ../lib/main/commons-cli-1.4/commons-cli-1.4.jar:../lib/main/commons-io-2.8.0/commons-io-2.8.0.jar

相对于工作区文件夹(这是我运行 jar 时的当前目录):

Main-Class: cli.Cli
Class-Path: lib/main/commons-cli-1.4/commons-cli-1.4.jar:lib/main/commons-io-2.8.0/commons-io-2.8.0.jar

编辑 2

我将代码更改为不使用 ParseException,但随后另一个导入导致了同样的错误。

【问题讨论】:

    标签: java jar classpath


    【解决方案1】:

    结果清单中的类路径需要用空格分隔,每个 jar 的路径都相对于bin/,如下所示:

    Main-Class: cli.Cli
    Class-Path: ../lib/main/commons-cli-1.4/commons-cli-1.4.jar ../lib/main/commons-io-2.8.0/io-2.8.0.jar program.jar
    
    

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 1970-01-01
      • 2022-08-18
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多