首页 文章

使用Gradle创建Groovy可执行JAR

提问于
浏览
38

这是我的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 回答

  • 1

    您正在寻找的是application plugin,它允许您构建一个独立的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'
        }
    }
    
  • 48

    the following code is also ok ,使用spring boot插件

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

    我会投票给shadow gradle plugin . 它能够建造超级 jar ,并且功能多样,能够像 class 搬迁一样防止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 = ""
    }
    

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

相关问题