2017-01-10 21 views
0

我想從我的第一個groovy腳本中創建一個jar。我的項目結構如下:爲什麼我需要指定'來自文件'?

- build.gradle 
- src\main\groovy\app\Test.groovy 

我原來的劇本的gradle:

apply plugin: 'groovy' 
apply plugin: 'java' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile 'org.codehaus.groovy:groovy-all:2.3.11' 
    testCompile group: 'junit', name: 'junit', version: '4.11' 
} 

sourceSets.main.groovy.srcDirs = ["src/main/groovy"] 

jar { 
    manifest { 
     attributes('Main-Class': 'app.Test') 
    } 
} 

從我讀的指南,這應該創建一個可運行的罐子。當我嘗試運行它,雖然我總是

Error: Could not find or load main class app.Test 

我現在發現,我需要將以下兩行添加到罐子任務的錯誤:

from files(sourceSets.main.output.classesDir) 
from configurations.runtime.asFileTree.files.collect { zipTree(it) } 

奇怪的是,如果我用一個Test.java類(相同的內容)替換groovy腳本,我不需要這兩個額外的行來運行jar。 我找不到爲什麼我需要他們或他們到底做了什麼。任何人都可以解釋,或提供文檔鏈接?

我是新來的,請幫我解決我的錯誤。


EDIT

通過tim_yates建議的代碼被轉換與下列內容到Test.jar的: META-INF/MANIFEST.MF

Manifest-Version: 1.0 
Main-Class: app.Test 

應用程序/的Test.class

package app; 

import groovy.lang.GroovyObject; 
import groovy.lang.MetaClass; 
import org.codehaus.groovy.runtime.callsite.CallSite; 

public class Test implements GroovyObject { 
    public Test() { 
     CallSite[] var1 = $getCallSiteArray(); 
     MetaClass var2 = this.$getStaticMetaClass(); 
     this.metaClass = var2; 
    } 

    public static void main(String... args) { 
     CallSite[] var1 = $getCallSiteArray(); 
     var1[0].callStatic(Test.class, "Hi!"); 
    } 
} 

我執行以下聲明:

java -jar test.jar 

這會導致上述錯誤消息。

回答

0

你一定要記住,這個罐子包含Groovy編譯的類。答案在於你在開始時顯示的反編譯源代碼。它導入Groovy運行時類。

如果您只是運行java -jar test.jar這些類不在類路徑中。 要麼在命令行的類路徑中包含groovy,要麼使用Gradle應用程序插件來構建一個包含所有應用程序依賴關係的fat JAR(這可能更適用於runnable jar)。

apply plugin: 'groovy' 
apply plugin: 'application' 

mainClassName='app.Test' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile  'org.codehaus.groovy:groovy-all:2.4.7' 
    testCompile 'junit:junit:4.12' 
} 

task uberjar(type: Jar,dependsOn:[':compileJava',':compileGroovy']) { 
    from files(sourceSets.main.output.classesDir) 
    from configurations.runtime.asFileTree.files.collect { zipTree(it) } 

    manifest { 
     attributes 'Main-Class': mainClassName 
    } 
} 

然後建立與gradle uberjar

+0

謝謝 - 有道理。 –

0

假設Test.groovy看起來像:

package app 

class Test { 
    static main(args) { 
     println "Hi!" 
    } 
} 

然後你只需要下面的生成腳本:

apply plugin: 'groovy' 

repositories { 
    mavenCentral() 
} 

dependencies { 
    compile  'org.codehaus.groovy:groovy-all:2.4.7' 
    testCompile 'junit:junit:4.12' 
} 

jar { 
    manifest { 
     attributes('Main-Class': 'app.Test') 
    } 
} 
+0

我與那些確切的文件內容,嘗試了(同一個項目設置爲我如上所述)你的罐子,但錯誤是一樣的(無法找到或加載主類app.Test)。 –

+0

打賭你沒有在你的腳本的頂部有'package app' –

+0

正如我所說 - 我有完全相同的文件內容,包括包的定義。 –

相關問題