使用Gradle构建的JAR文件运行时出现“没有主清单属性”的错误。

10 浏览
0 Comments

使用Gradle构建的JAR文件运行时出现“没有主清单属性”的错误。

我使用Gradle编写了一个小的Java应用程序进行构建。这个应用程序来自于这个教程,并包含两个类:HelloWorld(主类)和Greeter。build.gradle文件包含两个部分(以及其他部分,但目前不相关):

apply plugin: 'application'
mainClassName = 'hello.HelloWorld'

dependencies {
compile "joda-time:joda-time:2.2"
}

(这是必要的,因为HelloWorld类导入了org.joda.time.LocalTime类)。我可以使用\"gradle build\"或者\"gradle run\"构建并运行应用程序。一切都很好,并且我得到了结果。然而,当我尝试使用\"java -jar HelloWorld.jar\"运行它时,我会收到\"没有发现主清单属性\"的错误。StackOverflow上找到的一个解决方案建议以以下方式运行文件:

java -cp HelloWorld.jar hello.HelloWorld

java -cp HelloWorld.jar HelloWorld

第一个返回\"无法找到或加载主类HelloWorld\",第二个返回\"java.lang.NotClassDefFoundError org/joda/time/LocalTime\"。JAR存档中包含以下文件:

  0 Mon Jul 06 13:13:46 CEST 2015 META-INF/
 25 Mon Jul 06 13:13:46 CEST 2015 META-INF/MANIFEST.MF
  0 Mon Jul 06 13:13:46 CEST 2015 hello/
369 Mon Jul 06 13:13:46 CEST 2015 hello/Greeter.class
988 Mon Jul 06 13:13:46 CEST 2015 hello/HelloWorld.class

我不知道为什么Gradle不将关于主类的信息放入清单文件中。你有什么建议吗?这段代码直接来自于教程,所以应该没问题,但事实并非如此。我重复,通过gradle运行应用程序没有问题。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这个错误的原因是在运行 hello.HelloWorld 时没有将 org.joda.time.LocalTime 添加到类路径中。

  1. 可以使用设置类路径的命令运行: gradle run
  2. 可以使用插件将其包含在jar中。
  3. 或者使用 distZip 任务来准备一个分发包,解压缩它并使用 sh 或者 bat 脚本来运行准备好的工件。
0