2014-03-13 18 views
1

當應用程序完全自包含在一個.groovy文件中時,不會生成任何.class文件。但是,當我將這些類分離成單獨的文件並將它們放入包中時,最終會生成數百個生成的.class文件(大部分來自所有的閉包,分別編譯爲字節碼)。我有一個大的Groovy應用程序(〜2000行)使用多個.groovy文件。我應該如何處理生成的類文件?

是什麼時,所有這些文件的生成,最終搞亂的文件夾管理文件系統的最佳方法?

  1. 我應該留在一個文件中的一切嗎?這是最簡潔的方法 到文件系統,但我最終與一個大的.groovy文件和邏輯分離沒有 。
  2. 我應該將所有東西都打包成一個罐子嗎?該 將工作,但它減少了腳本 根據需要進行小的更改的靈活性。
  3. 我是否忽略.class文件?
+1

你應該保持邏輯的分離,並創建一個「/目標」文件夾w /你的構建工具(gradle或其他)來收集生成的類在標準化文件夾內。 –

+1

我一直在考慮使用gradle進行構建,但考慮到.groovy文件只能直接執行,因此它在工作流程中添加了一個步驟。我想我不能兩種方式(直接從文本和乾淨的部署靈活執行)。感謝您的建議。 – haventchecked

+1

我同意,我認爲從長遠來看,乾淨部署更加靈活和可靠。 –

回答

1

選項#2是最好的,只要您使用構建工具,如Gradle。我們的DevOps團隊使用Groovy,並提供自包含的zip文件。

作爲一個簡單的例子,看看this project

它提供warO.zip,其解壓縮到:

warO.jar 
jars/groovy-all-1.6.4.jar 
jars/guava-collections-r03.jar 
jars/guava-base-r03.jar 

由於清單設置與主類和類路徑,然後用戶可以與執行:

java -jar warO.jar

您的用戶觀衆會愛它。他們甚至不需要安裝Groovy,只需要JRE。

關於開發週期,確實對腳本的編輯速度不是很快,但通過添加Gradle任務(或簡單腳本),可以輕鬆自動執行構建,本地部署和執行的步驟。

+1

謝謝你。實際上我採用了gradle方法,它在創建一個超級瓶子方面很好。這個項目如果你很好奇https://github.com/garypaduana/Scripts/tree/master/General%20File%20Utility 當我從本地svn回購轉換到github時,仍然有很多工作正在進行中。 – haventchecked

1

建設有腳本可執行的JAR和嵌入式Groovy是與Gradle簡單。

的優點是驗證該腳本是可編譯和單元部署到生產環境之前進行測試。

下面是一個例子:

腳本/ SRC /主/常規/ script1.groovy

println "Hello World!" 

def aTestableMethod() { 
    1 + 1 
} 

腳本/ SRC /測試/常規/ script1Test.groovy

import org.junit.Test 
import static org.junit.Assert.* 

class Script1Test { 
    @Test 
    public void checkATestableMethod() { 
     def script1 = new script1() 
     assertEquals 2, script1.aTestableMethod() 
    } 
} 

scripts/build。gradle這個

apply plugin: 'groovy' 
repositories { 
    mavenCentral() 
} 
dependencies { 
    compile 'org.codehaus.groovy:groovy-all:2.2.2' 
    testCompile 'junit:junit:4.11' 
} 
jar { 
    from { 
     configurations.compile.collect { 
      it.isDirectory() ? it : zipTree(it) 
     } 
     configurations.runtime.collect { 
      it.isDirectory() ? it : zipTree(it) 
     } 
    } 
    manifest { 
     attributes 'Main-Class': 'script1' 
    } 
} 


編譯並執行:

$ gradle build 
$ java -jar build/libs/scripts/scripts.jar 
Hello World! 


Groovy Environment Manager (GVM)使得它易於安裝和管理Groovy和相關工具,包括 Gradle

+0

這不包括我的源代碼(即src/org ....)。我嘗試了很多不同的build.gradle配置,似乎缺少一些基本的東西(我曾經是一個.Net開發者)。所以總而言之,它完美地完成了我所有的依賴和元素,但是遺漏了實際的代碼,任何想法? – GarethReid

1

首先,如果您編譯.groovy文件,您將獲得相同的.class文件。

這樣一來,我想提一個替代方案,但我不建議使用它。

Groovy非常能夠在運行時編譯相關的.groovy文件。第一個要求是這些文件遵循java規範中的軟件包。例如,如果您在.groovy文件的包欄中有類Foo,則該文件必須位於./bar/Foo.groovy和根目錄「。」中。必須位於類路徑中。

第二個要求是Groovy必須能夠清楚地將類識別爲類,並且它不能是屬性。因此,例如「def a = Foo.class」就不清楚了,因爲Foo可能是一個屬性。 「import bar.Foo」使事情變得清晰。在類,接口,字段或方法頭以及catch子句和新實例表達式中使用類同樣。

第三個要求是使用GroovyClassLoader查找類。

如果您從命令行使用groovy命令,那麼情況就是這樣。 groovy命令也將當前目錄放在類路徑中。

+0

我昨天就開始使用這種方法,但後來改爲使用gradle,並且所有事情都像預期的那樣使用jar輸出很好地工作。感謝您的輸入! – haventchecked

相關問題