1

我是一名开发学生,我很想在我的项目中使用 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

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

我错过了什么?

提前致谢

4

1 回答 1

1

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

相反,您要做的是先编译源代码。之后,我们可以将生成的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

当您的项目增长时,您可能希望将源代码和编译的类文件保存在不同的目录中。javaccompile 实用程序有一个选项,您可以在-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

享受!

于 2021-01-26T01:19:55.310 回答