问题 如何使用'java'命令从gradle执行jar中的主类


我有这些文件 <project_root> 夹:

./build.gradle
./build/libs/vh-1.0-SNAPSHOT.jar
./libs/groovy-all-2.1.7.jar
./src/main/groovy/vh/Main.groovy

在里面 build.gradle 文件,我有这个任务:

task vh( type:Exec ) {
    commandLine 'java -cp libs/groovy-all-2.1.7.jar:build/libs/' +
            project.name + '-' + version + '.jar vh.Main'
}

Main.groovy 文件很简单:

package vh

class Main {
    static void main( String[] args ) {
        println 'Hello, World!'
    }

}

插入字符串值后,命令行为:

java -cp libs/groovy-all-2.1.7.jar:build/libs/vh-1.0-SNAPSHOT.jar vh.Main

如果我直接从shell运行命令,我得到正确的输出。但是,如果我跑 gradle vh,它会失败。那么,我该如何使它工作?非常感谢你。


2890
2017-10-01 04:06


起源



答案:


Exec.commandLine 期待一个 名单 值:可执行文件的一个值,每个参数的另一个值。要执行Java代码,最好使用 JavaExec 任务:

task vh(type: JavaExec) {
    main = "vh.Main"
    classpath = files("libs/groovy-all-2.1.7.jar", "build/libs/${project.name}-${version}.jar")
} 

通常,您不必像这样对类路径进行硬编码。例如,如果您正在使用 groovy 插件,和 groovy-all 已被宣布为 compile 依赖(并且知道第二个Jar是从 main 来源),你宁愿这样做:

classpath = sourceSets.main.runtimeClasspath

要了解更多关于 Exec 和 JavaExec 任务类型,请咨询 Gradle构建语言参考


13
2017-10-01 05:32



非常感谢。你的解决方案比原来的好得多。 - JBT


答案:


Exec.commandLine 期待一个 名单 值:可执行文件的一个值,每个参数的另一个值。要执行Java代码,最好使用 JavaExec 任务:

task vh(type: JavaExec) {
    main = "vh.Main"
    classpath = files("libs/groovy-all-2.1.7.jar", "build/libs/${project.name}-${version}.jar")
} 

通常,您不必像这样对类路径进行硬编码。例如,如果您正在使用 groovy 插件,和 groovy-all 已被宣布为 compile 依赖(并且知道第二个Jar是从 main 来源),你宁愿这样做:

classpath = sourceSets.main.runtimeClasspath

要了解更多关于 Exec 和 JavaExec 任务类型,请咨询 Gradle构建语言参考


13
2017-10-01 05:32



非常感谢。你的解决方案比原来的好得多。 - JBT