等级-没有主要的显示属性

我正在用 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) }
}
141749 次浏览

尝试更改清单属性,如:

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。

FWIW-我使用以下 jar 任务将所有编译依赖项组装到 jar 文件中,并使用上述建议来正确设置类路径

apply plugin: 'java-library'


jar {
manifest {
attributes(
'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
'Main-Class': 'your.main.class.goes.here'
)
}


// You can reference any part of the dependency configurations,
// and you can have as many from statements as you need
from configurations.compile
// I just copied them into the top of the jar, so it looks like the eclipse exported
// runnable jar, but you could designate a lib directory, and reference that in the
// classpath as "lib/$it.name" instead of it.getName()
into ''
}

要使 jar文件成为可执行文件(以便 java -jar命令可以工作) ,请在 MANIFEST.MF中指定 Main-Class属性。

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

  • 对于 好极了 DSL,请看这些答案([1][2])
  • 对于 科特林 DSL,您可以使用以下代码片段:
tasks.withType<Jar> {
manifest {
attributes["Main-Class"] = "com.caco3.Main"
}
}

为什么 mainClassName不能像预期的那样工作?

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

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

使其易于 本地启动应用程序在开发过程中,和 包裹的应用程序作为一个 焦油和/或 拉上拉链 包括操作系统特定的启动脚本

因此,application插件的目标不是生成可执行的 jar

当设置 mainClassName属性时,然后:

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

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

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

为了补充 Denis Zavedeev 回答,以下是 Kotlin DSL(build.gradle.kts)的更多方法:

tasks.jar {
manifest.attributes["Main-Class"] = "com.example.MyMainClass"
}
tasks.jar {
manifest {
attributes["Main-Class"] = "com.example.MyMainClass"
}
}

附注: 要创建一个可运行的胖 JAR (也称为 uber JAR) ,请参阅 这篇文章