【问题标题】:Unable to compile using Picocli无法使用 Picocli 编译
【发布时间】:2021-04-29 19:50:53
【问题描述】:

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

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

我错过了什么?

提前致谢

【问题讨论】:

  • 我认为您应该为CheckSum 提供完全限定名称,例如com.foo.bar.CheckSum。 - 您是否指定了 CheckSum 所在的包?

标签: java picocli


【解决方案1】:

问题在于命令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

享受吧!

【讨论】:

  • 哇,非常感谢!你的产品看起来真的很好,所以我真的很沮丧不能使用它。并感谢有关 .jar 文件的信息,真的很有帮助! :)
  • 别担心!享受吧!
猜你喜欢
  • 1970-01-01
  • 2016-09-09
  • 2022-01-10
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2023-04-02
相关资源
最近更新 更多