2010-02-11 123 views
39

使用maven-jar-plugin插件的目标(请参阅here),在使用test-jar目标的maven项目之间共享通用测试代码是一个明确的解决方案。在maven项目之间共享测试资源

我需要对测试资源做类似的事情,特别是我希望在测试期间项目B的类路径中可以使用项目A的测试资源。

项目A的一个需要声明:

<!-- Package and attach test resources to the list of artifacts: --> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      <configuration> 
       <tasks> 
        <jar destfile="${project.build.directory}/test-resources.jar"> 
         <fileset dir="${project.basedir}/test-resources" /> 
        </jar> 
       </tasks> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>build-helper-maven-plugin</artifactId> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>attach-artifact</goal> 
      </goals> 
      <configuration> 
       <artifacts> 
        <artifact> 
         <file>${project.build.directory}/test-resources.jar</file> 
         <type>jar</type> 
         <classifier>test-resources</classifier> 
        </artifact> 
       </artifacts> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

而在B项目将是正常的依赖性:

<dependency> 
    <groupId>myproject.groupId</groupId> 
    <artifactId>myartifact</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <classifier>test-resources</classifier> 
    <scope>test</scope> 
</dependency> 

问:是否应该在所有情况下工作吗?没有maven-antrun-plugin(使用更多'轻量级'插件)是否可以打包资源?

+0

似乎还有需要增强测试资源的远程资源插件 - http://maven.apache.org/plugins/maven-remote-resources-plugin/index.html – cetnar 2010-02-11 21:35:01

+0

@centar:感谢有趣的插件信息,但是,你所说的是有点偏离主题:) – 2010-02-15 11:09:09

回答

33

只需使用jar:test-jar并将生成的JAR声明为依赖项(有关更多详细信息,请参阅this guide)。虽然我不明白,在这个罐子有资源类的问题,你可以随时排除所有.class文件:

<project> 
    <build> 
    <plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.2</version> 
     <executions> 
     <execution> 
      <goals> 
      <goal>test-jar</goal> 
      </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <excludes> 
      <exclude>**/*.class</exclude> 
     </excludes> 
     </configuration> 
    </plugin> 
    </plugins> 
    </build> 
</project> 

,并使用它:

<project> 
    ... 
    <dependencies> 
    <dependency> 
     <groupId>com.myco.app</groupId> 
     <artifactId>foo</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>test-jar</type> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    ... 
</project> 
+0

不应该将执行阶段设置为打包吗? – sal 2010-02-12 20:00:54

+1

@sal这是因为'jar:test-jar' *“默认绑定到生命周期阶段:'package'。”* – 2010-02-12 20:05:58

+0

@Pascal:谢谢你的提示。我同意,使用类打包资源是有意义的。 +1为你的答案,但是,原来的问题没有得到解答(如何以最佳方式单独打包测试资源?)。 – 2010-02-13 18:17:49

0

已经有一个目标是从maven构建一个test jar

假设你需要一些更灵活的东西,你可以使用jar插件来打包你的测试资源,并用主包目标来执行这个目标。在运行jar目标时

 <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
       <classifier>test-resources</classifier> 
       <includes> 
       <include>**/*.whatever-you-want</include> 
       </includes> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
任何你想要的捆绑

将被添加到该项目的名称,版本测试resources.jar。

然后,您可以通过上面使用的相同依赖项将其包含在项目中。

+0

执行'jar'目标会自动将'maven-jar-plugin'绑定到“classes d irectory“,而不是”测试类目录“。因此,上面将打包简单的普通类,'include'不会帮助所有测试资源的所有工件。对不起,但是“-1”。 – 2010-02-13 17:36:15