Gradle - 没有主要清单属性

新手上路,请多包涵

我正在用 Gradle 构建一个 JAR 文件。当我尝试运行它时出现以下错误

没有主要清单属性,在 RxJavaDemo.jar 中

我尝试操纵 manifest 属性,但我想我忘记向它添加依赖项或其他内容。我到底做错了什么?

 apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'demo.MainDashboard'

dependencies {
    compile files ("H:/Processes/Development/libraries/hikari-cp/HikariCP-2.4.1.jar")
    compile files ("H:/Processes/Development/libraries/controls-fx/controlsfx.jar")
    compile files ("H:/Processes/Development/libraries/database_connections/sqlite-jdbc-3.8.6.jar")
    compile files ("H:/Processes/Development/libraries/guava/guava-18.0.jar")
    compile files ("H:/Processes/Development/libraries/rxjava/rxjava-1.0.12.jar")
    compile files ("H:/Processes/Development/libraries/rxjava-extras/rxjava-extras-0.5.15.jar")
    compile files ("H:/Processes/Development/libraries/rxjavafx/RxJavaFX-1.0.0-RC1-SNAPSHOT.jar")
    compile files ("H:/Processes/Development/libraries/rxjavaguava/rxjava-guava-1.0.3.jar")
    compile files ("H:/Processes/Development/libraries/rxjava-jdbc/rxjava-jdbc-0.6.3.jar")
    compile files ("H:/Processes/Development/libraries/slf4j/slf4j-api-1.7.12.jar")
    compile files ("H:/Processes/Development/libraries/tom-commons/tom-commons.jar")
}

sourceSets {
    main.java.srcDir "src/main/java"
    main.resources.srcDir "src/main/resources"
}

jar {
    manifest {
    attributes(
        "Class-Path": configurations.compile.collect { it.getName() }.join(' '))
    }
    from configurations.compile.collect { entry -> zipTree(entry) }
}

原文由 tmn 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.7k
2 个回答

尝试更改您的清单属性,例如:

 jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'hello.HelloWorld'
    )
  }
}

然后只需将 'hello.helloWorld' 更改为 '<your packagename>.<the name of your Main class>' (您的 Main 类有一个 main 方法)。在这种情况下,您在清单中创建一个指向此类的属性,然后运行一个 jar。

原文由 Stanislav 发布,翻译遵循 CC BY-SA 4.0 许可协议

To make the jar file executable (so that the java -jar command works), specify the Main-Class attribute in MANIFEST.MF .

在 Gradle 中,您可以通过配置 jar 任务来完成。

  • 对于 Groovy DSL,请参阅这些答案( [1][2]
  • 对于 Kotlin DSL,您可以使用以下代码片段:
 tasks.withType<Jar> {
    manifest {
        attributes["Main-Class"] = "com.caco3.Main"
    }
}

为什么 mainClassName 没有按预期工作?

或者为什么 mainClassName 没有在清单中指定属性?

mainClassName 属性来自 application 插件。插件:

使得在开发期间在 本地启动应用程序 变得容易,并将应用程序 打包TAR 和/或 ZIP , _包括特定于操作系统的启动脚本_。

所以 application 插件并不旨在生成可执行文件 jar s

mainClassName 属性设置时,则:

  1. $ ./gradlew run 将在属性中指定的类中启动 main 方法
  2. the zip / tar archive built using distZip / distTar tasks will contain a script, which will launch the main 指定的先前类的方法。

这是设置主类的 shell 脚本行:

 $ grep Main2 gradletest
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLETEST_OPTS -classpath "\"$CLASSPATH\"" com.caco3.gradletest.Main2 "$APP_ARGS"

原文由 Denis Zavedeev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题