Подтвердить что ты не робот

Создайте исполняемый 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, который я могу просто запустить, -)

4b9b3361

Ответ 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.