首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Picocli编译

无法使用Picocli编译
EN

Stack Overflow用户
提问于 2021-01-26 00:42:29
回答 1查看 2.1K关注 0票数 1

我是一个开发学生,我很想在我的项目中使用Picocli,不幸的是,我不知道如何使用Picocli编译,我试着按照这里给出的https://picocli.info/https://picocli.info/quick-guide.html指令编译,但是编译步骤没有详细说明。我没有使用Gradle或Maven,但它们并没有按需要列出。

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

代码语言:javascript
复制
jar cf checksum.jar Checksum.java ; jar cf picocli-4.6.1.jar CommandLine.java && echo "hello" >  hello

然后,我只需复制粘贴这个给定命令:https://picocli.info/#_running_the_application

代码语言:javascript
复制
java -cp "picocli-4.6.1.jar:checksum.jar" CheckSum --algorithm SHA-1 hello

并得到以下结果:

代码语言:javascript
复制
Error: Could not find or load main class CheckSum
Caused by: java.lang.ClassNotFoundException: CheckSum

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

代码语言:javascript
复制
java CheckSum -jar picocli-4.6.1.jar

但是,错误输出如下所示:

代码语言:javascript
复制
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

女巫,我不明白,因为我增加了依赖性。

我错过了什么?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-26 01:19:55

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

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

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

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

代码语言:javascript
复制
javac -cp .;picocli-4.6.1.jar Checksum.java

Linux使用:作为路径分隔符,而不是;,因此在Linux上,要编译的命令是:

代码语言:javascript
复制
javac -cp .:picocli-4.6.1.jar Checksum.java

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

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

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

在Windows上:

代码语言:javascript
复制
java -cp .;picocli-4.6.1.jar Checksum

在Linux上:

代码语言:javascript
复制
java -cp .:picocli-4.6.1.jar Checksum

注意,在使用java运行程序时,您指定的是类名Checksum,而不是文件名Checksum.class

您可以将参数传递给Checksum程序,方法是在紧接类名之后的命令行上传递它们:

代码语言:javascript
复制
java -cp .:picocli-4.6.1.jar Checksum --algorithm=SHA-1 /path/to/hello

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

代码语言:javascript
复制
javac -cp picocli-4.6.1.jar:otherlib.jar -d /destination/path /path/to/source/*.java 

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

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

代码语言:javascript
复制
jar -cvf MyJar.jar /destination/path/*.class /destination/path2/*.class

享受吧!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65894401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档