运行使用Gradle构建的JAR文件时,"没有主清单属性"

use*_*877 5 java program-entry-point jar manifest gradle

我使用Gradle编写了一个小型Java应用程序来构建它.该应用程序来自本教程,包含2个类:HelloWorld(主类)和Greeter.该build.gradle文件包含2个部分(以及其他部分,目前无关紧要):

apply plugin: 'application'
mainClassName = 'hello.HelloWorld'
Run Code Online (Sandbox Code Playgroud)

dependencies {
compile "joda-time:joda-time:2.2"
}
Run Code Online (Sandbox Code Playgroud)

(这是必要的,因为HelloWorld类导入了org.joda.time.LocalTime类).我可以构建应用程序gradle build并运行它gradle run.一切都很好,我得到了结果.但是,当我尝试运行它时java -jar HelloWorld.jar,我得到了错误No main manifest attribute.在StackOverflow上找到的解决方案之一建议运行该文件

java -cp HelloWorld.jar hello.HelloWorld
Run Code Online (Sandbox Code Playgroud)

要么

java -cp HelloWorld.jar HelloWorld
Run Code Online (Sandbox Code Playgroud)

第一个返回Could not find or load main class 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
Run Code Online (Sandbox Code Playgroud)

我不知道为什么gradle不会将有关主类的信息放入清单文件中.你有什么建议吗?代码直接来自教程,所以应该没问题,但事实并非如此.我再说一遍,通过gradle运行应用程序没有任何问题.

Opa*_*pal 2

出现此错误的原因org.joda.time.LocalTime是运行时未将其添加到类路径中hello.HelloWorld

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