问题描述
我是一名开发学生 我很想在我的项目中使用 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
享受吧!