关于java:运行使用Gradle构建的JAR文件时,“没有主清单属性”

'No main manifest attribute' while running JAR file built with Gradle

我用GADLE编写了一个小型的Java应用程序。该应用程序来自本教程,包含两个类:helloworld(主类)和greater。build.gradle文件包含2个部分(以及其他与当前无关的部分):

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

1
2
3
dependencies {
compile"joda-time:joda-time:2.2"
}

(这是必需的,因为helloworld类导入org.joda.time.localtime类)。我可以用gradle build构建应用程序,用gradle run运行它。一切正常,我得到结果。但是,当我尝试用java -jar HelloWorld.jar运行它时,我得到了错误No main manifest attribute。StackOverflow上的一个解决方案建议将文件作为

1
java -cp HelloWorld.jar hello.HelloWorld

1
java -cp HelloWorld.jar HelloWorld

第一个返回Could not find or load main class HelloWorld,第二个返回java.lang.NotClassDefFoundError" org/joda/time/LocalTime。JAR存档包含以下文件:

1
2
3
4
5
  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运行应用程序没有问题。


发生此错误的原因是运行hello.HelloWorld时,org.joda.time.LocalTime未添加到类路径。

  • 它可以在类路径设置为:gradle run的情况下运行。
  • 您可以使用这个插件在jar中包含这个依赖项。
  • 或者用distZip任务准备分发,解压它,使用sh或bat脚本运行准备好的工件。