Maven本质上是一个执行插件的框架。插件共分两类:build插件和reporting插件。

  • build插件,会在build阶段被执行,应该配置在POM的<build/>元素中。
  • reporting插件,生成站点的时候会执行,应该配置在POM的<reporting/>元素中。因为reporting插件的结果是生成的站点的一部分,所以这种插件应该是国际化和本地化的。此处更多详见 http://maven.apache.org/plugins/localization.html

但所有的插件至少都需要指明:groupId、artifactId、version。

通用配置

Maven插件都是通过指定一个<configuration>元素来配置的。而该元素中的子元素,都是Mojo中的property。

详见 http://maven.apache.org/guides/mini/guide-configuring-plugins.html

配置build插件

下面仅仅是在<build>元素中配置build插件。

使用<executions>标签

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<此处未完待续>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Maven项目支持的插件

org/apache/maven/plugins中有最新的插件列表。

核心插件

clean  负责build之后的清理工作

compiler 编译Java源码

deploy 将构建好的artifact部署到远程仓库

failsafe 在隔离的类加载器中运行JUnit集成测试

install 将构建好的artifact部署到本地仓库

resources 将资源复制到输出文件夹,以包含进JAR中。

site 为当前项目生成一个站点

surefire 在一个隔离的类加载器中运行JUnit单元测试

verifier 对集成测试有用 -- 校验特定环境的存在性

负责打包的类型/工具

ear 为当前项目生成一个EAR

jar 从当前项目构建一个JAR

rar 从当前项目构建一个RAR

war 从当前项目构建一个WAR

shade 从当前项目构建一个Uber_JAR,包含依赖。(也叫fat jar或super jar

source 从当前项目构建一个源码JAR

Maven大陆之外的插件:codehaus.org, code.google.com, misc

misc,其他的缩写。主要是指由各个项目提供的Maven插件,这里仅列出两个:

jetty

Apache Tomcat

下面用一些例子来说明使用的方法

一、WAR插件,有4种方式来使用它:

  1. 将项目package成war类型
  2. 调用 war:war goal
  3. 调用 war:exploded goal
  4. 调用 war:inplace goal

注意:当使用 war: goals时,它会假定compile阶段已经完成。

<project>
...
<build>
<!-- 在parent POM中定义版本 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
</plugin>
...
</plugins>
</pluginManagement>
<!-- 在POM 或 parent POM中使用插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
</plugin>
...
</plugins>
</build>
...
</project>
<project>
...
<groupId>com.example.projects</groupId>
<artifactId>documentedproject</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Documented Project</name>
<url>http://example.com</url>
...
</project>
  • 调用 mvn package 或者 mvn compile war:war,会在 target/ 下面生产相应版本的war文件(文件名是:artifactId-version.war)。

  • 调用 mvn compile war:exploded 则会在 target/ 下面生成非打包的war文件夹。该文件夹的名字是finalName,而finalName通常是artifactId-version形式。当然,可以通过制定 webappDirectory参数来覆盖默认。
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<webappDirectory>/sample/servlet/container/deploy/directory
</webappDirectory>
</configuration>
</plugin>
</plugins>
</build>
...
</project>
  • 调用 mvn compile war:inplace,则会在 src/main/webapp/  下面创建未打包的war文件夹

小结:4种调用方式,但实际效果是3种,区别在于最终创建的是文件还是文件夹、在什么地方创建(target/, src/main/webapp/)。

添加和过滤外部Web自由

Maven项目默认的资源文件夹是 src/main/resources,最终会出现在WAR文件的target/classes 和 WEB-INF/classes中。

WAR插件可以使用webResources参数来包含默认资源文件夹以外的资源。

添加web资源

<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<webResources>
<resource>
<!-- this is relative to the pom.xml directory -->
<directory>resource2</directory>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
...
</project>

我们的示例项目带有额外的外部资源,其结构如下:

  1. .
  2. |-- pom.xml
  3. |-- resource2
  4. | |-- external-resource.jpg
  5. | `-- image2
  6. | `-- external-resource2.jpg
  7. `-- src
  8. `-- main
  9. |-- java
  10. | `-- com
  11. | `-- example
  12. | `-- projects
  13. | `-- SampleAction.java
  14. |-- resources
  15. | `-- images
  16. | `-- sampleimage.jpg
  17. `-- webapp
  18. |-- WEB-INF
  19. | `-- web.xml
  20. |-- index.jsp
  21. `-- jsp
  22. `-- websource.jsp

最终在WAR中的结构如下:

  1. documentedproject-1.0-SNAPSHOT.war
  2. |-- META-INF
  3. | |-- MANIFEST.MF
  4. | `-- maven
  5. | `-- com.example.projects
  6. | `-- documentedproject
  7. | |-- pom.properties
  8. | `-- pom.xml
  9. |-- WEB-INF
  10. | |-- classes
  11. | | |-- com
  12. | | | `-- example
  13. | | | `-- projects
  14. | | | `-- SampleAction.class
  15. | | `-- images
  16. | | `-- sampleimage.jpg
  17. | `-- web.xml
  18. |-- external-resource.jpg
  19. |-- image2
  20. | `-- external-resource2.jpg
  21. |-- index.jsp
  22. `-- jsp
  23. `-- websource.jsp

注意: external-resource2.jpg 和 image2 都被复制到WAR的root目录下,保持了目录结构。

配置web资源

webResources 是一组资源列表。支持资源的所有选项。

web资源:

  • 能够被 includes/excludes
  • 能够被 filtered
  • 不限于默认位置 -- root of WAR

includes/excludes

想要在WAR中包含所有jpgs,可以这样设置POM:

...
<configuration>
<webResources>
<resource>
<!-- this is relative to the pom.xml directory -->
<directory>resource2</directory>
<!-- the list has a default value of ** -->
<includes>
<include>**/*.jpg</include>
</includes>
</resource>
</webResources>
</configuration>
...

想要在WAR中排除image2目录:

...
<configuration>
<webResources>
<resource>
<!-- this is relative to the pom.xml directory -->
<directory>resource2</directory>
<!-- there's no default value for this -->
<excludes>
<exclude>**/image2</exclude>
</excludes>
</resource>
</webResources>
</configuration>
...

当混合使用includes和excludes时,要小心,excludes的优先级更高

从WAR中包含或排除文件

通过 <packagingIncludes> 或 <packagingExcludes> 配置参数来实现。它们都可以接收一个逗号间隔的Ant风格文件列表。

就是说,使用 ** 来代表多级目录,使用 * 来代表文件或目录名字的一部分。

例如,排除所有WEB-INF/lib 下的JAR文件:

<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<packagingExcludes>WEB-INF/lib/*.jar</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build>
...
</project>

有时候,仅使用这种通配符是不够的。这时你可以使用正则表达式,%regex[]。

下面的例子中,我们想排除所有commons-logging和log4j JARs,但不想排除log4j-over-slf4j JAR。

<project>
...
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!-- Exclude JCL and LOG4J since all logging should go through SLF4J.
Note that we're excluding log4j-<version>.jar but keeping log4j-over-slf4j-<version>.jar -->
<packagingExcludes>
WEB-INF/lib/commons-logging-*.jar,
%regex[WEB-INF/lib/log4j-(?!over-slf4j).*.jar]
</packagingExcludes>
</configuration>
</plugin>
</plugins>
</build>
...
</project>

二、Tomcat Maven插件

注意,之前该插件是位于Codehaus上面,可惜那个网站已经over了。

现在在这里:https://tomcat.apache.org/maven-plugin-2.2/

2.2 版本新功能:

  • 支持Tomcat 7

  • 可以build executable WAR/JAR了

该插件提供了用于在Tomcat中操作WAR项目、或者使用一个内置Tomcat来运行你的WAR项目的goals。这些goals可以让你快速开发你的应用,而不必单独安装一个Tomcat实例。

关于groupId 和Mojo name的变更

自版本 2.0-beta-1 起,tomcat mojos已经被重命名为tomcat6 和 tomcat7,二者goals相同。

所以,你必须这样使用它们:

在POM中:

<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat6-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</pluginManagement>

或者在settings.xml中:

<pluginGroups>
....
<pluginGroup>org.apache.tomcat.maven</pluginGroup>
....
</pluginGroups>

goals概览

context goalscontainer goalsbuild an executable WAR/JAR

context goals

该插件提供了可以在项目的context上执行不同任务的goals -- 只要项目已经被部署到Tomcat中。如下:

  1. 重新部署一个WAR项目

      重新部署一个WAR项目取决于该项目部署的方式:

      • 当项目是使用tomcat:deploy 部署的WAR项目时,可以使用 mvn package tomcat6/7:redeploy

      • 当项目是使用tomcat:exploded部署的WAR项目时,可以使用 mvn war:exploded tomcat6/7:redeploy
      • 当项目是使用tomcat:inplace部署的WAR项目时,可以使用 mvn war:inplace tomcat6/7:redeploy
      • 想要重新部署使用tomcat:deploy部署的一个context.xml文件时,可以使用 mvn tomcat6/7:redeploy

      注意:取决于context.xml中指定的docBase,可能也会需要像上面那样调用 war:exploded 或者 war:inplace。

  2. 取消部署一个WAR项目
      mvn tomcat6/7:undeploy
  3. 启动一个WAR项目
      mvn tomcat6:start
  4. 停止一个WAR项目
      mvn tomcat6:stop
  5. 列出会话统计
      mvn tomcat6:sessions

container goals

该插件还提供了获取Tomcat容器各种信息的goals:

  1. 列出被部署的所有项目

      mvn tomcat6:list
  2. 列出服务器信息
      mvn tomcat6:info
  3. 列出JNDI资源
      mvn tomcat6:resources   --  列出所有Tomcat内可用的JNDI资源
      mvn -Dmaven.tomcat.type=my.class.name tomcat6:resources  --  列出特定类型的JNDI资源
  4. 列出安全角色
      mvn tomcat6:roles

build an executable WAR/JAR

从 2.0 版本开始,可用使用一个内置的Tomcat7来build一个可执行的WAR/JAR。

仅tomcat7 插件支持!

注意:你的项目的<packaging/>的值必须是pom或war。

需要添加至war模块的artifact

<project>
...
<packaging>war or pom</packaging>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<path>foo</path>
<!-- optional, needed only if you want to use a preconfigured server.xml
file -->
<serverXml>src/main/tomcatconf/server.xml</serverXml>
<!-- optional values which can be configurable -->
<attachArtifactClassifier>default value is exec-war but you can
customize</attachArtifactClassifier>
<attachArtifactClassifierType>default value is jar</attachArtifactClassifierType>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

需要添加至你的pom模块的artifact:

<project>
...
<packaging>war</packaging>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>exec-war-only</goal>
</goals>
<phase>package</phase>
<configuration>
<!-- optional only if you want to use a preconfigured server.xml file -->
<!-- <serverXml>src/main/tomcatconf/server.xml</serverXml> -->
<warRunDependencies>
<warRunDependency>
<dependency>
<groupId>a groupId</groupId>
<artifactId>and artifactId</artifactId>
<version>version</version>
<type>war</type>
</dependency>
<contextPath>/</contextPath>
</warRunDependency>
</warRunDependencies>
<!-- naming is disabled by default so use true to enable it -->
<enableNaming>true</enableNaming>
<!-- extra dependencies to add jdbc driver, mail jars, etc. -->
<extraDependencies>
<extraDependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.1.3.1</version>
</extraDependency>
<extraDependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</extraDependency>
</extraDependencies>
</configuration>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

生成的executable jar/war

通过上面的配置,你可以执行该生成的jar (因其内置了Tomcat容器):

     java -jar yourjar

辅助输出的参数:

usage: java -jar [path to your exec war jar]
-ajpPort <ajpPort> ajp port to use
-clientAuth enable client authentication for
https
-D <arg> key=value
-extractDirectory <extractDirectory> path to extract war content,
default value: .extract
-h,--help help
-httpPort <httpPort> http port to use
-httpProtocol <httpProtocol> http protocol to use: HTTP/1.1 or
org.apache.coyote.http11.Http11Nio
Protocol
-httpsPort <httpsPort> https port to use
-keyAlias <keyAlias> alias from keystore for ssl
-loggerName <loggerName> logger to use: slf4j to use slf4j
bridge on top of jul
-obfuscate <password> obfuscate the password and exit
-resetExtract clean previous extract directory
-serverXmlPath <serverXmlPath> server.xml to use, optional
-X,--debug debug

运行Mojo:让你的Maven war 项目更快速地运行

当开发一个war项目时,通常需要build war,然后将其部署到一个安装好的Tomcat实例中。这很耗费时间和资源,同时必须有一个本地的Tomcat实例。

而运行mojo则可以让你免于这些,只需要在你的Maven build的内置Tomcat实例中运行war即可。

注意,如果你有多个Maven项目,且在使用Maven 3,你不需要在运行goal之前install所有资源,在根模块直接使用tomcat6/7:run 即可,该插件会自动探测不同模块的build输出目录,并会使用webapp类加载器中的这些目录来替换依赖。

运行内置Tomcat

在POM中配置插件的版本,并使用 mvn tomcat6/7:run 。

<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<!-- or if you want to use tomcat 6.x <artifactId>tomcat6-maven-plugin</artifactId> -->
<version>2.2</version>
<configuration>
<!-- http port -->
<port>9090</port>
<!-- application path always starts with / -->
<path>/</path>
<!-- optional path to a context file -->
<contextFile>${tomcatContextXml}</contextFile>
<!-- optional system propoerties you want to add -->
<systemProperties>
<appserver.base>${project.build.directory}/appserver-base</appserver.base>
<appserver.home>${project.build.directory}/appserver-home</appserver.home>
<derby.system.home>${project.build.directory}/appserver-base/logs</derby.system.home>
<java.io.tmpdir>${project.build.directory}</java.io.tmpdir>
</systemProperties>
<!-- if you want to use test dependencies rather than only runtime -->
<useTestClasspath>false</useTestClasspath>
<!-- optional if you want to add some extra directories into the classloader -->
<additionalClasspathDirs>
<additionalClasspathDir></additionalClasspathDir>
</additionalClasspathDirs>
</configuration>
<!-- For any extra dependencies needed when running embedded Tomcat (not
WAR dependencies) add them below -->
<dependencies>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>\${derbyVersion}</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
</plugin>

Maven项目结构

pom.xml             (top level pom with packaging pom)
my-api/pom.xml (API project with packaging jar)
my-api-impl/pom.xml (API implementation project with packaging jar)
my-webapp/pom.xml (webapp project with packaging war)

对于上面这样的结构,需要从顶级目录运行:mvn tomcat6/7:run -pl :my-webapp -am

配合selenium mojo使用

你可以使用该mojo在Tomcat实例中启动你的项目,并针对该实例运行你的selenium测试。

下列配置会在pre-integration-test中启动一个内置的Tomcat,然后在 post-integration-test时关闭它。

<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<!-- or if you want to use tomcat 6.x <artifactId>tomcat6-maven-plugin</artifactId> -->
<version>2.2</version>
<executions>
<execution>
<id>tomcat-run</id>
<goals>
<goal>run-war-only</goal>
</goals>
<phase>pre-integration-test</phase>
<configuration>
....
<fork>true</fork>
....
</configuration>
</execution>
<execution>
<id>tomcat-shutdown</id>
<goals>
<goal>shutdown</goal>
</goals>
<phase>post-integration-test</phase>
</execution>
</executions>
</plugin>

官方文档链接:

http://maven.apache.org/plugins/index.html

Maven学习之 插件plugin的更多相关文章

  1. Maven学习(四)-- 生命周期和插件

    标签(空格分隔): 学习笔记 Maven生命周期是抽象的,不做任何实际的工作,在Maven的设计中,实际的任务都交由插件来完成. 每个构件步骤都可以绑定一个或者多个插件行为,而且Maven为大多数构建 ...

  2. maven学习(五)插件和自定义插件

    插件是可以配置在settings.xml和pom.xml中的 插件目标: 在了解插件和生命周期的绑定关系之前,先来说一下插件目标.在实际项目构建的过程中,需要经历编译.打包等等许许多多的操作,为每个操 ...

  3. MAVEN学习笔记之Maven插件的应用(4)

    MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...

  4. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  5. Maven学习笔记(六):生命周期与插件

    何为生命周期:      Maven的生命周期就是为了对全部的构建过程进行抽象和统一.Maven从大量项目和构建工具中学习和反思,然后总结了一套高度完好的.易扩展的生命周期.这个生命周期包括了项目的清 ...

  6. Maven 学习总结 (二) 之 生命周期与插件

    五.生命周期与插件 1.Maven有三套独立的生命周期:clean.default和site. clean生命周期的目的是清理项目,default生命周期的目的是构建项目,site生命周期的目的是建立 ...

  7. maven学习讲解

    参考链接:http://www.cnblogs.com/bigtall/archive/2011/03/23/1993253.html 1.前言 Maven,发音是[`meivin],"专家 ...

  8. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  9. Maven学习笔记二

    依赖范围 <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api&l ...

随机推荐

  1. android学习笔记54——ContentProvider

    ContentProvider ContentProvider用于实现数据共享. ContentProvider是不同应用程序之间进行数据交换的标准API,其以某种Uri的形式对外提供数据,允许其他应 ...

  2. spring Transaction Propagation 事务传播

    spring Transaction中有一个很重要的属性:Propagation.主要用来配置当前需要执行的方法,与当前是否有transaction之间的关系. 我晓得有点儿抽象,这也是为什么我想要写 ...

  3. linux iostat 性能指标说明

    Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视. 它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况. ...

  4. ThinkPHP5.0完全开发手册

    http://www.kancloud.cn/manual/thinkphp5/118006 www  WEB部署目录(或者子目录) ├─composer.json         composer定 ...

  5. Blackfin DSP(四):BF533 EBIU之SDRAM

    BF533的SDRAM控制器最大支持128M bytes的SDRAM空间:总线宽度可以配置为4位.8位.16位.处理器与SDRAM的连线包括数据总线D[0:15].地址总线A[1:19].SDRAM刷 ...

  6. VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称 <转>

    昨天写了一个很小的winform程序,其中引用了自己写的两个dll文件. 本来认为轻松搞定,结果一编译居然提示:未能找到类型或命名空间名称..... 于是删掉两个dll重新引用,再编译结果依旧!很是郁 ...

  7. APP自适应的例子

    <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" ...

  8. JQuery的Ajax跨域请求原理概述及实例

    今天在项目中需要做远程数据加载并渲染页面,直到开发阶段才意识到ajax跨域请求的问题,隐约记得Jquery有提过一个ajax跨域请求的解决方式,于是即刻翻出Jquery的API出来研究,发 JQuer ...

  9. 百度地图API示例之添加/删除工具条、比例尺控件

    代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" cont ...

  10. A required class was missing while executing org.apache.maven.plugins:maven-war-plugin:2.1.1:war

    完美解决方案: http://stackoverflow.com/questions/18442753/a-required-class-was-missing-while-executing-org ...