使用Gradle创建Groovy可执行JAR

时间:2012-03-17 10:00:30

标签: groovy gradle

这是我的gradle构建脚本。

apply plugin: 'groovy'

project.group = "test.tree"
archivesBaseName = "tree"
project.version = "1.0"
manifest.mainAttributes("Main-Class" : "test.tree.App")

sourceCompatibility=1.6
targetCompatibility=1.6

repositories {
    mavenCentral()
}

dependencies {
    groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.6'
    testCompile group: 'junit', name: 'junit', version: '4.8.2'
}

这个编译得很好

问题是我无法运行创建的JAR,我得到一个例外 java.lang.NoClassDefFoundError: groovy/lang/GroovyObject

所以我猜groovy插件不包含JAR中的所有必要类。

如何创建一个独立的JAR,我可以简单地运行; - )

3 个答案:

答案 0 :(得分:48)

您正在寻找的是application plugin,它允许您构建一个独立的JVM应用程序,包括所有依赖项和运行脚本。

apply plugin:'application'
mainClassName = 'test.tree.App'

修改

这应该创造你想要的uberjar:

task uberjar(type: Jar) {
    from files(sourceSets.main.output.classesDir)
    from configurations.runtime.asFileTree.files.collect { zipTree(it) }

    manifest {
        attributes 'Main-Class': 'test.tree.App'
    }
}

答案 1 :(得分:1)

我会投票给shadow gradle plugin。它能够构建超级罐子,并且功能多样,能够进行类重定位以防止dependency hell

我不会比较这两个插件,但我会说,由于增加了功能,我已经倾向于使用过去使用过应用程序的阴影。

当我厌倦了基于@Grab的groovy脚本的启动时间时,我倾向于使用shadow插件编写一个gradle构建文件,即使对于单个文件groovy脚本也是如此。一个示例gradle构建文件,能够在当前目录中构建一个常规脚本文件的超级jar。主类名称需要与脚本文件名对应:

repositories { 
  jcenter()
  mavenCentral()
}

defaultTasks = ['shadowJar']
version      = "1.0"

dependencies {
  compile "org.codehaus.groovy:groovy:2.4.7", 
          "commons-cli:commons-cli:1.2"
}

sourceSets {
  main {
    groovy {
        srcDirs = [rootDir]
    }
  }
}

project.tasks.remove jar

shadowJar {
  manifest {
    attributes 'Main-Class': 'MyGroovyScriptName'
  }

  classifier = ""
}

将在build/libs目录中生成超级jar。

答案 2 :(得分:0)

在build.gradle中添加jar块后,我遇到了同样的问题。

jar {
  manifest {
    attributes 'Main-Class': 'demo.Demo'
  }
  from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}