groovyc - Groovy 編譯器
1. groovyc,Groovy 編譯器
groovyc
是 Groovy 編譯器命令列工具。它讓您可以將 Groovy 原始程式碼編譯成位元組碼。它在 Java 世界中扮演與 javac
相同的角色。編譯 Groovy 腳本或類別最簡單的方式是執行下列命令
groovyc MyClass.groovy
這將產生一個 MyClass.class
檔案(以及其他 .class 檔案,具體取決於原始程式碼的內容)。groovyc
支援多個命令列開關
簡短版本 | 長版本 | 說明 | 範例 |
---|---|---|---|
-cp |
-classpath, --classpath |
指定編譯類別路徑。必須是第一個參數。 |
groovyc -cp lib/dep.jar MyClass.groovy |
--sourcepath |
尋找原始程式碼檔案的目錄。不再使用。指定此參數不會有任何效果。 |
||
--temp |
編譯器的暫存目錄 |
||
--encoding |
原始程式碼檔案的編碼 |
groovyc --encoding utf-8 script.groovy |
|
--help |
顯示命令列 groovyc 工具的說明 |
groovyc --help |
|
-d |
指定要放置已產生類別檔案的位置。 |
groovyc -d target Person.groovy |
|
-v |
--version |
顯示編譯器版本 |
groovyc -v |
-e |
--exception |
在編譯錯誤時顯示堆疊追蹤 |
groovyc -e script.groovy |
-j |
--jointCompilation* |
啟用聯合編譯 |
groovyc -j A.groovy B.java |
-b |
--basescript |
腳本的基本類別名稱 (必須衍生自 Script) |
|
--configscript |
進階編譯器設定腳本 |
groovyc --configscript config/config.groovy src/Person.groovy |
|
-Jproperty=value |
如果啟用聯合編譯,要傳遞給 |
groovyc -j -Jtarget=1.6 -Jsource=1.6 A.groovy B.java |
|
-Fflag |
如果啟用聯合編譯,要傳遞給 |
groovyc -j -Fnowarn A.groovy B.java |
|
-pa |
--parameters |
為方法參數名稱產生用於反射的元資料。需要 Java 8+。 |
groovyc --parameters Person.groovy |
-pr |
--enable-preview |
啟用 Java 預覽功能 (僅限 jdk12+)。 |
groovy --enable-preview Person.groovy |
@argfile |
從指定的檔案讀取選項和原始碼檔案。 |
groovyc @conf/args |
注意事項: * 如需聯合編譯的完整說明,請參閱 聯合編譯區段。
2. Ant 任務
請參閱 groovyc Ant 任務 文件。它允許從 Apache Ant 呼叫 Groovy 編譯器。
5. Maven 整合
在 Maven 專案中編譯 Groovy 程式碼有幾種方法。 GMavenPlus 最靈活且功能最豐富,但與大多數 Groovy 編譯器工具一樣,它在處理聯合 Java-Groovy 專案時可能會遇到困難 (與 GMaven 和 Gradle 可能有問題的原因相同)。 Groovy-Eclipse 編譯器 Maven 外掛程式 迴避了聯合編譯問題。請閱讀 這篇文章,深入探討這兩種方法的優缺點。
第三種方法是使用 Maven 的 Ant 外掛程式來編譯 groovy 專案。請注意,在以下範例中,Ant 外掛程式與建置的編譯和測試編譯階段相關聯。它會在這些階段中被呼叫,並且會執行包含的任務,在原始碼和測試目錄上執行 Groovy 編譯器。產生的 Java 類別將與從 Java 原始碼編譯的任何標準 Java 類別共存並被視為標準 Java 類別,並且對 JRE 或 JUnit 執行時間而言沒有任何不同。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycomp.MyGroovy</groupId>
<artifactId>MyGroovy</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Maven Example building a Groovy project</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.5.0</version>
<type>pom</type> <!-- required JUST since Groovy 2.5.0 -->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<configuration>
<tasks>
<mkdir dir="${basedir}/src/main/groovy"/>
<taskdef name="groovyc"
classname="org.codehaus.groovy.ant.Groovyc">
<classpath refid="maven.compile.classpath"/>
</taskdef>
<mkdir dir="${project.build.outputDirectory}"/>
<groovyc destdir="${project.build.outputDirectory}"
srcdir="${basedir}/src/main/groovy/" listfiles="true">
<classpath refid="maven.compile.classpath"/>
</groovyc>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<configuration>
<tasks>
<mkdir dir="${basedir}/src/test/groovy"/>
<taskdef name="groovyc"
classname="org.codehaus.groovy.ant.Groovyc">
<classpath refid="maven.test.classpath"/>
</taskdef>
<mkdir dir="${project.build.testOutputDirectory}"/>
<groovyc destdir="${project.build.testOutputDirectory}"
srcdir="${basedir}/src/test/groovy/" listfiles="true">
<classpath refid="maven.test.classpath"/>
</groovyc>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
這假設您有一個 Maven 專案設定,其中包含與 java src 和 test 子資料夾同層的 groovy
子資料夾。您可以使用 java
/jar
原型設定這個,然後將 java 資料夾重新命名為 groovy,或保留 java 資料夾並建立 groovy 同層資料夾。還有一個 groovy 外掛,但尚未在生產環境中測試或使用。在定義建置區段(如上述範例)後,您可以正常呼叫典型的 Maven 建置階段。例如,mvn test
會執行測試階段,編譯 Groovy 原始碼和 Groovy 測試原始碼,最後執行單元測試。如果您執行 mvn jar
,它會執行 jar 階段,在所有單元測試通過後,將所有已編譯的生產類別打包成 jar。有關 Maven 建置階段的更多詳細資訊,請參閱 Maven2 文件。
5.1. GMaven 和 GMavenPlus
5.1.1. GMaven
GMaven 是 Groovy 的原始 Maven 外掛,支援編譯和撰寫 Groovy 程式碼。
重要事項
您應該知道 GMaven 不再受支援,而且可能會在 聯合編譯時遇到困難。GMavenPlus 可以作為一個很好的替代方案,但如果您在聯合編譯時遇到問題,您可能會考慮 Groovy Eclipse maven 外掛。
5.1.2. GMavenPlus
GMavenPlus 是 GMaven 的重寫版本,目前正在積極開發中。它支援 GMaven 的大部分功能(幾個值得注意的例外是 mojo Javadoc 標籤 和對較舊 Groovy 版本的支援)。它的聯合編譯使用 stub(這表示它具有與 GMaven 和 Gradle 相同的潛在問題)。與其前身相比,它的主要優點是它支援最近的 Groovy 版本、InvokeDynamic、Android 上的 Groovy、GroovyDoc 和組態指令碼。
5.2. Groovy Eclipse Maven 外掛
Groovy-Eclipse 為 Maven 提供一個編譯器外掛。使用編譯器外掛,您可以使用 Groovy-Eclipse 編譯器編譯您的 maven 專案。一個其他地方沒有的功能是無 stub 聯合編譯。
6. 聯合編譯
聯合編譯表示 Groovy 編譯器會剖析 Groovy 原始檔、為所有原始檔建立 stub、呼叫 Java 編譯器來編譯 stub 與 Java 原始檔,然後以一般 Groovy 編譯器的方式繼續編譯。這允許在沒有限制的情況下混合 Java 與 Groovy 檔案。
可以使用命令列編譯器的 -j
旗標或使用巢狀標籤以及所有屬性和進一步的巢狀標籤(視 Ant 任務而定)來啟用聯合編譯。
重要的是要知道,如果您未啟用聯合編譯並嘗試使用 Groovy 編譯器編譯 Java 原始檔,則 Java 原始檔會被編譯為 Groovy 原始檔。在某些情況下,這可能會有效,因為大部分 Java 語法與 Groovy 相容,但有許多語意可能不同的情況。
7. Android 支援
可以在 Groovy 中撰寫 Android 應用程式。不過,這需要編譯器的特殊版本,表示您無法使用一般 groovyc 工具 來設定 Android 位元組碼的目標。特別是,Groovy 提供了針對 Android 的特定 JAR 檔,其分類器為 grooid
。為了讓事情更簡單,Gradle 外掛程式 在 Android Gradle 工具鏈中增加了對 Groovy 語言的支援。
外掛程式可以像這樣套用
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'org.codehaus.groovy:groovy-android-gradle-plugin:1.0.0'
}
}
apply plugin: 'groovyx.android'
然後您需要新增對 Groovy 編譯器 grooid
版本的相依性
dependencies {
compile 'org.codehaus.groovy:groovy:2.4.7:grooid'
}
請注意,如果 Groovy jar 沒有提供 grooid
分類器替代方案,則表示 jar 與 Android 直接相容。在這種情況下,您可以像這樣直接新增相依性
dependencies {
compile 'org.codehaus.groovy:groovy:2.4.7:grooid' // requires the grooid classifier
compile ('org.codehaus.groovy:groovy-json:2.4.7') { // no grooid version available
transitive = false // so do not depend on non-grooid version
}
}
請注意,groovy-json
的 transitive=false
參數會讓 Gradle 下載 JSON 支援 jar 而不會在 Groovy 的一般 jar 上新增相依性。
請務必前往 外掛程式首頁 以尋找最新的文件和版本。