基于Eclipse和Maven的Groovy开发
插件 | 说明 |
Groovy Eclipse |
Update Site:http://dist.springsource.org/release/GRECLIPSE/e4.3/ 安装全部组件 该插件自带了一组Groovy编译器,其优势是不需要生成Groovy类的存根 |
m2e Configurator for Groovy Eclipse |
此插件包含在上面的Update Site中,与m2eclipse集成,可以方便在Eclipse中,以Maven为中心管理Groovy工程。 该插件与AspectJ、Scala不兼容,因此你不能在同一工程中使用这些语言 |
groovy-eclipse-compiler |
一个Maven插件,允许使用Groovy Eclipse编译器来编译Maven工程中的Groovy代码,并将工程配置为Groovy Project。该插件需要上述的m2e Configurator才能正常工作。 |
gmavenplus-plugin |
即GMavenPlus,一个Maven插件,是GMaven的代替者,包括了比groovy-eclipse-compiler更丰富的功能:
该插件目前缺乏对应的m2e connector,无法在Eclipse中正常使用 |
定位到Window ⇨ Preferences -Groovy进行设置:
- Groovy Content Assist options... :可以让代码风格更加Groovy化,根据需要设置
- Compiler子菜单:可以切换Groovy编译器版本,必须和Groovy运行时依赖的版本保持兼容
- Formatter子菜单:设置代码格式化规则,可以设置的内容很少:
- Position of the opening braces:起始括号是否换行
- Remove unnecessary semicolons:移除不必要的分号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.3.7</version> </dependency> <!-- 如果要支持Project Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.14.8</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <!-- maven-compiler-plugin 实际不做任何编译工作,它总是把工作委派给真正的编译器,例如javac/groovyc--> <compilerId>groovy-eclipse-compiler</compilerId> <!-- 如果要支持Project Lombok,添加: --> <verbose>true</verbose> <compilerArguments> <javaAgentClass>lombok.core.Agent</javaAgentClass> </compilerArguments> <fork>true</fork> </configuration> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-eclipse-compiler</artifactId> <version>2.9.1-01</version> </dependency> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-eclipse-batch</artifactId> <version>2.3.7-01</version> </dependency> </dependencies> </plugin> <plugin> <!-- 为Groovy源文件分配单独的存放目录 --> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>1.5</version> <executions> <execution> <id>add-source</id> <phase>generate-sources</phase> <goals> <goal>add-source</goal> </goals> <configuration> <sources> <source>src/main/groovy</source> </sources> </configuration> </execution> <execution> <id>add-test-source</id> <phase>generate-test-sources</phase> <goals> <goal>add-test-source</goal> </goals> <configuration> <sources> <source>src/test/groovy</source> </sources> </configuration> </execution> </executions> </plugin> </plugins> </build> |
将上述内容添加到一个Maven工程的POM中以后,Update Project,该工程自动变为 Groovy Project,工程结构如下:
Goal | 说明 |
gplus:addSources | 把Groovy源码加到工程main源码清单 |
gplus:addTestSources | 把Groovy测试源码加到工程test源码清单 |
gplus:compile | 编译main源代码,如果要支持InvokeDynamic,必须使用1.5.0+或者 2.0.0-beta-3+的Groovy |
gplus:console | 开启一个关联到当前工程的Console窗口 |
gplus:shell | 开启一个关联到当前工程的Shell |
gplus:execute | 执行关联到当前工程的Groovy脚本(包括POM或者外部的) |
gplus:generateStubs |
为main Groovy源码生成存根,并添加到Maven源码目录,供Java编译器发现 之所以需要存根,是因为Java编译器无法识别Groovy代码,如果存在Java对Groovy的调用,需要生成被调用类的空壳(不含方法实现),以便Java编译的通过 |
gplus:groovydoc | 为main 代码生成GroovyDoc |
gplus:removeStubs | 从工程中移除Groovy存根(Stub) |
gplus:removeTestStubs |
可以把executie目录绑定到任何阶段,如果不绑定,可以运行命令 mvn gplus:execute 手工执行。
使用下面的POM配置可以包含Groovy脚本到pom.xml中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> <version>1.5</version> <executions> <execution> <goals> <goal>execute</goal> </goals> </execution> </executions> <configuration> <scripts> <script> <![CDATA[ //Script content ]]> </script> <!-- 亦可外链脚本文件 --> <script>file:///${project.basedir}/src/main/resources/scr.groovy</script> </scripts> </configuration> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.3.7</version> <scope>runtime</scope> </dependency> </dependencies> </plugin> |
目标compile附加到Maven声明周期的相应阶段,只需要执行默认的 mvn compile ,就可以编译Groovy源码。
下面是一个典型的POM配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
<build> <plugins> <plugin> <groupId>org.codehaus.gmavenplus</groupId> <artifactId>gmavenplus-plugin</artifactId> <version>1.5</version> <executions> <execution> <goals> <!-- 添加Groovy源码到Maven的main源码清单,打包source jar时有用 --> <goal>addSources</goal> <!-- 添加Groovy源码到Maven的test源码清单,打包source jar时有用 --> <goal>addTestSources</goal> <!-- 生成main Groovy代码的Java Stub,这些存根随即被加到main源码清单,以便Java编译器可以使用之 --> <!-- 如果不进行Java/Groovy混合编程,可以忽略这一目标 --> <goal>generateStubs</goal> <!-- 在编译Groovy main源码前,Java main代码会和Stub一起被编译 --> <!-- 编译Groovy main源码 --> <goal>compile</goal> <!-- 移除main存根,因为存根只在编译Java代码时用到,如果不移除,导致souce jar中包含存根代码 --> <goal>removeStubs</goal> <!-- 生成test源码的存根 --> <goal>testGenerateStubs</goal> <!-- 编译test源码,与main源码类似 --> <goal>testCompile</goal> <!-- 移除test存根 --> <goal>removeTestStubs</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>attach-sources</id> <goals> <!-- 使用该目标,防止Groovy源码和Java Stub都被包含到source jar --> <goal>jar-no-fork</goal> <goal>test-jar-no-fork</goal> </goals> </execution> </executions> <configuration> <!-- 添加下面的配置以支持JDK 1.7+的InvokeDynamic特性,但是目标JVM必须为JDK 1.7+--> <invokeDynamic>true</invokeDynamic> <!-- 可以使用Groovy配置脚本(configuration script)--> <configScript>config.groovy</configScript> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.3.7</version> </dependency> </dependencies> |
如果是纯粹的Groovy工程,不包含Java代码,可以这样配置Goal:
1 2 3 4 5 6 |
<goals> <goal>addSources</goal> <goal>addTestSources</goal> <goal>compile</goal> <goal>testCompile</goal> </goals> |
要为Android平台编译Groovy,只需要指定适用于该平台的Groovy的JAR即可:
1 2 3 4 5 6 |
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>2.4.4</version> <classifier>grooid</classifier> </dependency> |
如果你的Groovy源码不使用标准的.groovy扩展名,或者不存放在src/[main|test]/groovy目录下,必须通知GMavenPlus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<configuration> <sources> <source> <directory>${project.basedir}/src/main/groovy</directory> <includes> <include>**/*.groovy</include> </includes> </source> <source> <directory>${project.basedir}/src/additional</directory> <includes> <include>groovy/**/*.groovy</include> <include>gvy/**/*.gvy</include> </includes> </source> </sources> <testSources> <testSource> <directory>${project.basedir}/src/test/groovy</directory> <includes> <include>**/*.groovy</include> </includes> </testSource> </testSources> </configuration> |
如果可以调试正规化的Groovy类(与Java类一样,遵循存储路径与类全限定名称的对应关系),但是不能调试脚本,可能是因为当前脚本不在Classpath下面。
解决办法:编写脚本时,要进行包声明,例如: package cc.gmem.study.groovy
Leave a Reply