不能 运行 一个 jar 文件,从 groovy 编译的代码构建 gradle

Can't run a jar-file, built from groovy-code compiled with gradle

我正在尝试编译(使用 gradle)并执行(使用 java 1.8 运行时)一个小的 groovy 程序(参见 helloWorld.groovy, 下面).

但是当我尝试调用它时,我得到 错误:无法找到或加载 main class helloWorld

我错过了什么?


编译:

lexu> gradle clean jar
:clean
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar

BUILD SUCCESSFUL

Total time: 0.555 secs

执行:

lexu> java -jar ./build/libs/helloWorld.jar 
Error: Could not find or load main class helloWorld

helloWorld.groovy:

class helloWorld {    
   static void main(String[] args) {
      println('Hello World'); 
   }
}

build.gradle:

apply plugin: 'groovy'
apply plugin: 'application'
mainClassName = "helloWorld"
archivesBaseName = 'helloWorld';
configurations {provided;  inlib;}
repositories {mavenCentral()}
dependencies {compile 'org.codehaus.groovy:groovy-all:2.4.7'}
jar {
  manifest {
    attributes(
      'Class-Path': configurations.compile.collect { it.getName() }.join(' '),
      'Main-Class': 'helloWorld'
    )
  }
}

您的设置存在一些问题。

  1. 没有破坏,但在这里值得一提:Convention 说明你的文件名,类 应该是大写的:HelloWorld.groovy

  2. gradle 假定您的源文件位于 src/main/java 下,或者在本例中为 src/main/groovy。您可以根据自己的喜好配置 gradle groovy plugin - project layout:


sourceSets {
    main {
        groovy {
            srcDirs = ['src/groovy']
        }
    }
}

  1. 您需要在 jar 存档中包含 groovy 的所有运行时依赖项。为此,让我们使用名为 uberjar.
  2. 的扩展任务

build.gradle:

apply plugin: 'groovy'
apply plugin: 'application'
mainClassName = "HelloWorld"
archivesBaseName = 'HelloWorld';
configurations {provided;  inlib;}
repositories {mavenCentral()}
dependencies {compile 'org.codehaus.groovy:groovy-all:2.4.7'}

task uberjar(type: Jar,dependsOn:[':compileJava',':compileGroovy']) {
    from files(sourceSets.main.output.classesDir)
    from configurations.runtime.asFileTree.files.collect { zipTree(it) }

    manifest {
        attributes 'Main-Class': mainClassName
    }
}

HelloWorld.groovy:

class HelloWorld {
   static void main(String[] args) {
      println('Hello World');
   }
}