Maven中的插件和生命周期

Maven的核心是它的生命周期,生命周期什么都不做,因此Maven的安装文件很小。所有的事情都交给了插件来完成。比如说,Maven的default生命周期中定义了一个compile阶段,这个定义本身什么都不会做,真正编译代码的是Compiler插件,它的groupId是org.apache.maven.plugins,artifactId是maven-compiler-plugin。

如果你理解设计模式中的模板方法(Template Method)模式,那么这会变得很好理解。在模板方法模式中,父类定义了一些抽象方法,并且决定这些方法的调用顺序,子类只需要实现这些方法。比如沏茶这个用例,父类定义的抽象方法有:烧开水,洗茶杯,倒水,放茶叶,并且有一个沏茶方法来顺序调用这些方法。而子类会去实现如何烧开水,如何洗茶杯,如何倒水,如何放茶叶。实例化一个子类之后,调用沏茶方法,这些步骤就会依次执行了。同样的道理,在Maven中,生命周期定义了编译,测试,打包,部署等等阶段,而插件会去实现这些对应的阶段,如上面提到的Compiler插件实现了如何编译。

使用命令 mvn clean install 构建一个最简单的Maven项目,会看到类似如下的输出:

E:\simple-server\simple-server>mvn clean install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building simple-server Maven Webapp
[INFO] task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean]
[INFO] Deleting directory E:\simple-server\simple-server\target
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 3 source files to E:\simple-server\simple-server\target\classes
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] No sources to compile
[INFO] [surefire:test]
[INFO] No tests to run.
[INFO] [war:war]
[INFO] Packaging webapp
[INFO] Assembling webapp[simple-server] in [E:\simple-server\simple-server\target\simple-server]
[INFO] Processing war project
[INFO] Webapp assembled in[515 msecs]
[INFO] Building war: E:\simple-server\simple-server\target\simple-server.war
[INFO] [install:install]
[INFO] Installing E:\simple-server\simple-server\target\simple-server.war to C:\Documents and Settings\Administrator\.m2\repository\com\tnsoft\simple-server\1.0-SNAPSHOT\simple-server-1.0-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

该输出中加粗的地方,显示了在各个生命周期阶段中,很多插件执行的目标,它们分别是:

  • clean阶段,clean插件执行clean目标。
  • compile阶段,compiler插件执行compile目标。
  • process-test-resources阶段,resources插件执行testResources目标。
  • test-compile阶段,compiler插件执行testCompile目标。
  • test阶段,surefire插件执行test目标。
  • package阶段,war插件执行war目标。
  • install阶段,install插件执行install目标。

关于Maven主要插件的详细信息,请参考http://maven.apache.org/plugins/

此外,还可以使用如 mvn help:describe -Dfull -Dplugin=compiler 的命令查看插件的详细描述信息。

配置插件

插件可以被配置以完成一些自定义的行为,有一个对compiler的很常用的配置是:compiler插件默认是以Java 1.4的标准来编译源代码的,如果你用到了JAVA5的新特性,如泛型,那么Maven会报错,说不支持,此时,你需要配置compiler插件来支持Java 5。配置如下:

<project>
   [...]
   <build>
      [...]
     <plugins>
          <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <configuration>
                    <source>1.5</source>
                    <target>1.5</target>
               </configuration>
          </plugin>
     </plugins>
     [...]
  </build>
  [...]
</project>

这里配置了compiler插件的参数source和target。如果你运行了 mvn help:describe -Dfull -Dplugin=compiler 你会看到如下的解释:

...

[21] Name: source
Type: java.lang.String
Required: false
Directly editable: true
Description:
The -source argument for the Java compiler.

-----------------------------------------------
...

[23] Name: target
Type: java.lang.String
Required: false
Directly editable: true
Description:
The -target argument for the Java compiler.

-----------------------------------------------
....

help插件还描述了该插件有什么样的目标(goal)。

因此如何配置使用插件,你有两种参考,第一是直接看在线的文档,第二就是使用help插件来看你要配置插件的详细描述。

理解这些知识后,使用Maven插件应该不是件困难的事情了。当然,要想自己编写插件,并且将其绑定到Maven生命周期中,那是更高级的话题,留作以后讨论。

猜你喜欢

转载自juvenshun.iteye.com/blog/232916