2012-03-17 41 views
35

Đây là tập lệnh xây dựng gradle của tôi.Tạo một tệp RAR thực thi Groovy với 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' 
} 

Và điều này chỉ cần biên dịch tốt

Vấn đề là tôi không thể chạy JAR tạo ra, tôi nhận được một ngoại lệ java.lang.NoClassDefFoundError: groovy/lang/GroovyObject

Vì vậy, tôi đoán các plugin groovy không bao gồm tất cả các lớp cần thiết bên trong JAR.

Làm thế nào để tôi có thể tạo một JAR độc lập mà tôi chỉ có thể .. chạy ;-)

+0

Sau khi đọc tất cả các mẹo từ đây và cũng có thể sử dụng http://github.com/AvatarQing/groovy-executable-jar-with-gradle-example, tôi đã tạo tệp jar chứa tập lệnh groovy và tạo jar thực thi: https://github.com/krishnact/uberifier. Tệp jar là: https://github.com/krishnact/uberifier/blob/master/bin/Uberifier-1.0.0.jar?raw=true – Krishna

Trả lời

45

gì bạn đang tìm kiếm là application plugin cho phép bạn xây dựng một ứng dụng JVM độc lập bao gồm tất cả phụ thuộc và các kịch bản chạy.

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

EDIT:

này nên tạo uberjar bạn muốn:

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

Điều này rất hay, tôi thích tác vụ 'distZip', nhưng những gì tôi muốn là smt như 'distJar' nhiệm vụ -> một thị hiếu tạo ra một JAR thực thi với tất cả các lớp cần thiết (tôi, groovy rt ...) bên trong. – emesx

+1

Tôi khuyên bạn nên giữ các lớp ứng dụng của bạn tách biệt với các phụ thuộc bên ngoài. Nếu bạn thực sự muốn tạo một uberjar [đây là cách bạn có thể làm điều đó] (https://github.com/bmuschko/gradle-tomcat-plugin/blob/master/build.gradle#L26). Tất nhiên bạn sẽ sử dụng các phụ thuộc bên ngoài thay vì các tiểu dự án. –

+3

Đã tạo một dự án mẫu dựa trên mã được cung cấp bởi @Benjamin: https://github.com/bond-/gradle-groovy-jar-example – Raviteja

1

đoạn mã sau cũng là ok, plugin sử dụng khởi động mùa xuân

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

Tôi sẽ ném vào một bỏ phiếu cho số shadow gradle plugin. Nó có khả năng xây dựng lọ uber và khá linh hoạt và có khả năng những thứ như di chuyển lớp để ngăn chặn dependency hell.

Tôi sẽ không đi vào so sánh hai plugin, nhưng tôi sẽ đi xa như nói rằng tôi đã hướng tới việc sử dụng bóng tối từ việc sử dụng ứng dụng trong quá khứ vì các tính năng bổ sung.

Khi tôi cảm thấy mệt mỏi về thời gian khởi động của tập lệnh Groovy dựa trên Groovy, tôi có xu hướng viết một tệp xây dựng gradle bằng cách sử dụng plugin bóng ngay cả đối với các tập lệnh đơn lẻ. Một tệp xây dựng gradle ví dụ có khả năng xây dựng một uber jar của một tệp tập lệnh groovy trong thư mục hiện tại. Tên lớp chính cần tương ứng với tên tệp tập lệnh:

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 = "" 
} 

bình uber sẽ được tạo trong thư mục build/libs.

Các vấn đề liên quan