【发布时间】: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,但随后另一个导入导致了同样的错误。
【问题讨论】: