Создайте исполняемый JAR Groovy с Gradle
Это мой gradle build script.
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, который я могу просто запустить, -)
Ответы
Ответ 1
То, что вы ищете, это плагин приложения, который позволяет вам создавать автономное приложение JVM, включая все зависимости и сценарии запуска.
apply plugin:'application'
mainClassName = 'test.tree.App'
EDIT:
Это должно создать требуемый 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'
}
}
Ответ 2
следующий код также хорошо, используйте 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'
}
Ответ 3
Я бы выбрал голосование за теневой gradle плагин. Он способен создавать банки uber и является весьма универсальным и способным к таким вещам, как перемещение класса, чтобы предотвратить аддитивный ад.
Я не буду сравнивать двух плагинов, но я расскажу, что я тяготел к использованию тени из-за использования приложения в прошлом из-за добавленных функций.
Когда я устаю от времени запуска сценариев groovy на основе @Grab, я стараюсь писать файл сборки gradle, используя теневой плагин даже для сценариев с одним файлом groovy. Пример файла сборки gradle, способного создать банку uber файла groovy script в текущем каталоге. Имя основного класса должно соответствовать имени файла script:
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
.