【问题标题】:'No main manifest attribute' while running JAR file built with Gradle运行使用 Gradle 构建的 JAR 文件时出现“无主清单属性”
【发布时间】:2015-09-23 13:15:32
【问题描述】:

我使用 Gradle 编写了一个小型 Java 应用程序来构建它。该应用来自this tutorial,包含 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。 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 运行应用程序没有任何问题。

【问题讨论】:

标签: java jar gradle manifest main


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 2017-08-18
    • 2018-06-17
    • 2016-08-19
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多