Skip to content
springside edited this page Apr 28, 2012 · 25 revisions

Maven已经进入成熟期,没什么大的变化了。风头会慢慢被Gradle之类的盖过去,但目前仍然是首选。

1.Sonatype

被Sonatype主管后,中央仓库用Nexus管起来了。 用http://search.maven.org 就可以方便的找到jar。另外和Sun,Hibernate几家Repository的关系也好了,所有的jar都可以在中央库找到,不需要再同时指向多个Repository。

2.测试

###2.1 区分单元测试与集成测试###

原本Maven一直没有很好的区分单元测试和集成测试的用例。因为集成用例依赖可能很多,执行又慢,很多时候我们都要Skip掉它们只运行单元测试。

后来Maven在原来的surefire插件继续负责在test阶段测试Test.java的单元测试用例, 新增了failsafe插件负责在integration-test阶段(package阶段之后)执行IT.java的集成测试。

但SpringSide在SpringSide4.0 RC2不再使用这个插件,首先因为springside是使用嵌入式Jetty,Out-Of-Container的执行功能测试用例的,所以在集成测试阶段之前的Package阶段打war包是白做的。其次继续把*IT.java用例继续放在test/java里,使得在Eclipse没有办法单独执行所有的单元测试。

所以SpringSide的综合解决办法是,用build-helper-maven-plugin插件新开一个Functional Test Source 目录test/functional,将所有功能测试用例放到这里,然后文件名依然是采用IT.java后缀,然后建不同的Profile,执行Test.java 或*IT.java.

在三个Examples项目的pom.xml中都有完整的示例,采用codehaus那个build-helper-maven-plugin新开目录的原因,是它可以让eclipse:eclipse生成的项目文件里,也包含新开的源码目录。

###2.2 Skip Test###

mvn install -Dmaven.test.skip=true 最狠的,连测试用例的编译都省掉了。

###2.3 分组执行###

TestNG的皇牌功能,可以将用例分成几组,比如超慢的Nightly组放到半夜才运行。 Junit4后来的新版也支持一个@Category的定义,但是,必须在一个TestSuite维护所有Case,或者使用一个叫ClassPathSuite的项目。

在Maven的测试插件里没这个麻烦,它会自行读取@Category标签来过滤。

pom.xml

    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.12</version>
      <configuration>
        <groups>com.mycompany.FastTests</groups>
      </configuration>
      <dependencies>
        <dependency>
	  <groupId>org.apache.maven.surefire</groupId>
	  <artifactId>surefire-junit47</artifactId>
	  <version>2.12</version>
	</dependency>
      </dependencies>
    </plugin>

TestCase中的testSlow()将不会被执行。

    public class AppTest {
      @Test
      @Category(SlowTests.class)
      public void testSlow() {
        System.out.println("slow");
      }

      @Test
      @Category(FastTests.class)
      public void testFast() {
        System.out.println("fast");
      }
    }

###2.4 透传命令行的参数到测试插件 测试插件是自己Fork一个JVM出来的,所以启动Maven时的系统参数不会直接透传到测试中,比如我想在命令行控制selenium.driver,需要这样配置

<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-failsafe-plugin</artifactId>
	<configuration>
		<systemPropertyVariables>
			<selenium.driver>${selenium.driver}</selenium.driver>
		</systemPropertyVariables>
	</configuration>
</plugin>

##3.脚本?脚本!! 虽然Maven的理想很丰满,什么都是插件,什么都是阶段,但实际项目还是有很多需要脚本干点小事情的时候,比如springside里更新本地测试数据库。这时候有几种选择,一种是用ant脚本,需要依赖包的时候用ant的maven插件,另一种是maven里用antrun插件。

因为Ant的maven插件老是被忘记下,所以springside里选择了用maven的antrun插件,另外也不搞什么阶段了,定义出独立的profile,直接运行goal: mvn antrun:run -Prefresh-db

另外,exec:java来运行Java命令也不错。

##4. parent的pom.xml 如果项目是一个Multi-SubModules结构,将公共的定义放在顶级的pom.xml里就可以了。

如果要在多个repository(git),不同的trunk(svn)间共享公共定义,就独立出一个parent的project出来。

##5. Maven与Eclipse SpringSide喜欢用mvn eclipse:eclipse -Declipse.workspace=C:\Users\myname\workspace, 这里用参数指明了eclipse的workspace,这样子如果发现依赖包也在workspace里就会进行项目依赖而不是jar包依赖。

Eclipse插件文档介绍了很多参数可以让生成的项目文件符合你的特殊需求,如支持SpringIDE。

另外sonatype还提供了m2eclipse插件,但不想太依赖插件,而且这插件也不是总是灵光。所以只是用这个插件来看pom.xml文件中的依赖关系。

返回参考手册