Gradle - 无主清单属性

2022-08-31 08:25:13

我正在用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) }
}

答案 1

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

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

然后只需更改为(您的 Main 类具有 main 方法的位置)。在本例中,您在清单中创建了一个指向此类的属性,然后运行一个 jar。'hello.helloWorld''<your packagename>.<the name of your Main class>'


答案 2

要使文件可执行(以便命令正常工作),请在 中指定属性。jarjava -jarMain-ClassMANIFEST.MF

在 Gradle 中,您可以通过配置任务来执行此操作。jar

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

为什么不按预期工作?mainClassName

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

该属性来自应用程序插件。插件:mainClassName

使得在开发过程中在本地启动应用程序,以及将应用程序打包TAR 和/或 ZIP(包括特定于操作系统的启动脚本)变得容易。

因此,应用程序插件的目的不是生成可执行的jar

设置属性后,则:mainClassName

  1. $ ./gradlew run将在属性中指定的类中启动方法main
  2. 使用 / 任务构建的 / 存档将包含一个脚本,该脚本将启动指定先前类的方法。ziptardistZipdistTarmain

下面是设置主类的 shell 脚本行:

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

推荐