无法使用 Picocli 编译

问题描述

我是一名开发学生 我很想在我的项目中使用 Picocli,不幸的是我不明白如何使用 Picocli 进行编译 我尝试按照此处 https://picocli.info/ 或此处 https://picocli.info/quick-guide.html 给出的说明进行操作,但未详细说明编译步骤。我没有使用 Gradle 或 Maven,但它们并未真正按要求列出。

这是它如何尝试编译 picocli.info 网页中给出的校验和示例:

jar cf checksum.jar Checksum.java ; jar cf picocli-4.6.1.jar CommandLine.java && echo "hello" >  hello

然后我简单地复制粘贴这个给定的命令:https://picocli.info/#_running_the_application

java -cp "picocli-4.6.1.jar:checksum.jar" CheckSum --algorithm SHA-1 hello

并得到以下结果:

Error: Could not find or load main class CheckSum
Caused by: java.lang.ClassNotFoundException: CheckSum

我尝试自己编译所有内容,然后像这样添加 .jar:

java CheckSum -jar picocli-4.6.1.jar

但是错误输出如下所示:

Exception in thread "main" java.lang.NoClassDefFoundError: picocli/CommandLine
at CheckSum.main(Checksum.java:33)
Caused by: java.lang.ClassNotFoundException: picocli.CommandLine
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more

我不明白,因为我添加了依赖项。

我错过了什么?

提前致谢

解决方法

问题是命令 jar cf checksum.jar Checksum.java 只创建一个包含 Checksum.java 源文件的 jar 文件(jar 文件与 zip 文件非常相似)。

您要做的是先编译源代码。之后,我们可以将生成的 Checksum.class 文件(注意 .class 扩展名而不是 .java 扩展名)放在 checksum.jar 中。 Java SDK 包含可用于编译源代码的 javac 工具。详细步骤如下。

首先,打开终端窗口并导航到包含 Checksum.java 源文件和 picocli-4.6.1.jar 库的目录。

现在,编译命令(在 Windows 上)是:

javac -cp .;picocli-4.6.1.jar Checksum.java

Linux 使用 : 作为路径分隔符而不是 ;,所以在 Linux 上,编译命令是:

javac -cp .:picocli-4.6.1.jar Checksum.java

-cp 选项允许您指定类路径,其中应包含目录和 jar/zip 文件,其中包含您的项目使用/依赖的任何其他类文件。由于 Checksum.java 使用 picocli 类,我们将 picocli jar 放在类路径中。当当前目录包含任何类时,还将当前目录 . 添加到类路径。我现在只是习惯性地加了 .

现在,如果您列出当前目录中的文件,您应该看到已在此目录中创建了一个文件 Checksum.class

我们的 Checksum 类有一个 main 方法,因此我们现在可以使用 java 工具运行程序:

在 Windows 上:

java -cp .;picocli-4.6.1.jar Checksum

在 Linux 上:

java -cp .:picocli-4.6.1.jar Checksum

请注意,当运行带有 java 的程序时,您指定的是类名 Checksum,而不是文件名 Checksum.class

您可以将参数传递给 Checksum 程序,方法是在命令行中紧跟在类名之后:

java -cp .:picocli-4.6.1.jar Checksum --algorithm=SHA-1 /path/to/hello

当您的项目增长时,您可能希望将源代码和编译后的类文件保存在不同的目录中。 javac 编译实用程序有一个 -d 选项,您可以在其中指定已编译类文件的目的地。例如:

javac -cp picocli-4.6.1.jar:otherlib.jar -d /destination/path /path/to/source/*.java 

这应该为指定目标目录中的指定源文件生成 .class 文件(在上面的示例中为 /destination/path)。

当您有许多类文件时,您可能希望将它们捆绑在一个 jar 文件中。您可以为此使用 jar 命令。在为已编译的类文件创建 jar 时,我经常使用选项 -v(详细)-c(创建)-f(jar 文件名)。例如:

jar -cvf MyJar.jar /destination/path/*.class /destination/path2/*.class

享受吧!

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...