用Gradle创build一个Groovy可执行JAR

这是我的gradle构build脚本。

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' } 

这个编译就好了

问题是我不能运行创build的JAR,我得到一个exceptionjava.lang.NoClassDefFoundError: groovy/lang/GroovyObject

所以我猜groovy插件不包括JAR里面的所有必需的类。

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

你正在寻找的是应用程序插件 ,它允许你构build一个独立的JVM应用程序,包括所有的依赖和运行脚本。

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

编辑:

这应该创build你想要的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' } } 

下面的代码也可以 ,使用spring启动插件

 buildscript { ext { springBootVersion = '1.2.6.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } apply plugin: 'groovy' apply plugin: 'eclipse' apply plugin: 'spring-boot' sourceCompatibility = 1.8 targetCompatibility = 1.8 repositories { mavenCentral() } sourceSets { main { groovy { srcDirs = ['src'] } } /*test { groovy { srcDirs = ['test/groovy'] } }*/ } dependencies { compile "com.alibaba:fastjson:1.1.34" compile 'org.codehaus.groovy:groovy-all:2.4.5' //testCompile group: 'junit', name: 'junit', version: '4.8.2' } springBoot { backupSource = false mainClass = "com.zhb.hello.Hello" } jar{ baseName = 'hellogroovy' version = '1.1.0' } 

我会投票投票阴影gradle插件 。 这是能够build设uberjar子,是相当多才多艺的,有能力像类迁移,以防止依赖地狱 。

我不会去比较这两个插件,但我会尽量说,因为增加的function,我已经习惯使用过去的应用程序的影子。

当我厌倦了基于@Grab的groovy脚本的启动时间时,我倾向于使用shadow插件编写gradle构build文件,即使是单个文件groovy脚本。 一个示例gradle构build文件,能够在当前目录中构build一个groovy脚本文件的超级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 = "" } 

uber jar将会在build/libs目录下生成。