IntelliJ:为同一模块中的源和测试指定不同的groovyc版本

时间:2012-08-30 20:08:50

标签: java groovy intellij-idea ivy spock

我正在使用IntelliJ 11.1.3IvyIDEA Plugin for IntelliJSpock 0.5(取决于Groovy 1.8.4)和Groovy 1.5.6

我有一个遵循Maven Standard Directory Layout的IntelliJ模块。输出是WAR文件。

在IntelliJ中构建此模块时,有什么方法可以告诉IntelliJ使用以下内容:

  • Groovy 1.5.6来编译src/main/groovy
  • Groovy 1.8.4来编译src/test/groovy

我需要这样做,因为实际的应用程序代码需要针对Groovy 1.5.6进行编译(长话短说:生成的WAR部署的EAR必须暂时保留在Groovy 1.5.6

当然,Test目录不会与WAR一起部署。 Test目录包含Spock测试。我正在使用Spock 0.5,这需要Groovy 1.8.x

ivy.xml

<dependency conf="compile->default" name="groovy-all" 
    org="org.codehaus.groovy" rev="1.5.6"/>

<dependency conf="test->default" name="groovy-all" 
    org="org.codehaus.groovy" rev="1.8.4"/>
<dependency conf="test->default" name="spock-core" 
    org="org.spockframework" rev="0.5-groovy-1.8"/>

我需要能够从IntelliJ运行测试。如果我使用IntelliJ构建并尝试运行Spock测试,我会得到以下结果:

org.spockframework.runtime.InvalidSpecException: 
Specification 'org.myorg.test.ProcessCaseTest' was not compiled properly 
(Spock AST transform was not run); try to do a clean build
at org.spockframework.runtime.SpecUtil.checkIsSpec(SpecUtil.java:53)

如果我删除此行:

<dependency conf="compile->default" name="groovy-all" 
    org="org.codehaus.groovy" rev="1.5.6"/>

然后我可以构建并运行Spock测试,但是我从模块中丢失了Groovy。

我认为我需要做的是告诉IntelliJ使用一个版本的Groovy来编译应用程序代码和另一个版本的Groovy来编译测试,但是我还没有找到办法来做到这一点。

我非常感谢任何人都能提供的任何帮助或见解。非常感谢你。

1 个答案:

答案 0 :(得分:3)

IDEA遵循Maven依赖模型,其中compile依赖项自动进入test类路径。您可以尝试的是重新排序IDEA模块中的依赖项,以便Groovy 1.8(应该具有范围test)出现在Groovy 1.5之前(应该具有范围compile)。无论如何,这是一个毛茸茸的事情。

PS:我建议使用Spock 0.6。