运行使用Gradle构建的JAR文件时'没有主清单属性'
我使用Gradle编写了一个小型Java应用程序来构建它。 该应用程序来自本教程,包含2个类:HelloWorld(主类)和Greeter。 build.gradle
文件包含2个部分(和其他部分,目前不相关):
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
运行它时,出现No main manifest attribute
的错误。 在StackOverflow上找到的一个解决方案建议将该文件作为
java -cp HelloWorld.jar hello.HelloWorld
要么
java -cp HelloWorld.jar HelloWorld
第一个返回Could not find or load main class HelloWorld
,第二个返回java.lang.NotClassDefFoundError" org/joda/time/LocalTime
归档包含以下文件:
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
distZip
任务准备一个发行distZip
,解压缩并使用sh或bat脚本运行准备的工件。 上一篇: 'No main manifest attribute' while running JAR file built with Gradle