这是我的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,我可以简单地运行; - )
答案 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) } }
}