最近接触用maven达成jar包,但是发现好多配置不知道有啥作用,查出来都是插件。Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标。
首先看下全局变量配置,下面的插件中会用到。:
<properties>
<project.build.name>toolsproject.build.name>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
一、编译插件
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.6source>
<target>1.6target>
<encoding>${project.build.sourceEncoding}encoding>
configuration>
plugin>
source: 源代码编译版本;
target: 目标平台编译版本;
encoding: 字符集编码。
二、设置资源文件的编码方式
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<version>2.4.3version>
<executions>
<execution>
<phase>compilephase>
execution>
executions>
<configuration>
<encoding>${project.build.sourceEncoding}encoding>
configuration>
plugin>
xml、properties文件都是资源文件,编码的时候遇到中文总要进行转码!用什么编码?UTF-8,那就记得强制
三、自动拷贝jar包到target目录
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<version>2.6version>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>compilephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>
<outputDirectory>${project.build.directory}/liboutputDirectory>
<excludeTransitive>falseexcludeTransitive>
<stripVersion>truestripVersion>
configuration>
execution>
executions>
plugin>
在部署war包时,需要将项目依赖的jar包,也打到war包中,因此就会用到上述插件
四、生成源代码jar包
<plugin>
<artifactId>maven-source-pluginartifactId>
<version>2.1version>
<configuration>
<attach>trueattach>
<encoding>${project.build.sourceEncoding}encoding>
configuration>
<executions>
<execution>
<phase>compilephase>
<goals>
<goal>jargoal>
goals>
execution>
executions>
plugin>
该插件主要用于在打jar包时,把源代码也打成jar包
五、将项目打成jar包
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<version>2.4version>
<configuration>
<archive>
<manifest>
<addClasspath>trueaddClasspath>
<classpathPrefix>lib/classpathPrefix>
<mainClass>com.zhengtian.tools.service.phone.MobilePhoneToolmainClass>
manifest>
archive>
configuration>
plugin>
在将项目打成jar包时,有时会需要将项目打成可以直接运行的jar包,因此就需要将项目依赖的jar包也打入jar包中,此时需要在Eclipse上安装例外一个插件,用来打可执行jar包,详情见链接 http://zheng12tian.iteye.com/blog/1765626
六、将项目打成war包
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>2.1.1version>
<configuration>
configuration>
plugin>
encoding: 强制字符集编码
warName: war包名字——platform.war
webappDirectory: 产生war前,用于存放构建war包的目录——target/platform。
warSourceDirectory: 我把web工程搞成了eclipse下的WTP类型。我不喜欢maven产生的webapp目录,更喜欢WebContent!
需要注意的是:
采用上述插件部署项目的话,使用 clean package tomcat:redeploy 命令。使用该命令前,需要先启动tomcat,实际上是为了让tomcat启动manager项目,实现动态部署
此部署方式虽然也是动态部署的范畴,但是每次修改文件后,需要手动再次重新部署,才会加载更改。
如果想让tomcat自动扫描项目的改动,自动加载,那么需要将maven工程的java全部编译的webapp目录下,然后将jar包和资源文件也打到webapp目录。最后在$CATALINA_HOME/conf /Catalina/localhost中添加一个xml文件,修改docbase为webapp目录。
Tomcat常用的部署方式介绍: http://blog.csdn.net/yangxueyong/article/details/6130065
配置描述:当你的pom文件中把你的当前项目的packaging配置为war后,maven会使用该插件将当前项目生成war文件,但是有时候我们不想要war文件,只想让maven生成当前项目的网站目录结构,尤其是在调试的时候,因为生成war文件的同时,会生成当前项目的网站目录结构,这样一来,浪费了打包的时间和磁盘的空间!
maven使用war插件生成war文件所用的目标(goal)为war,从帮助文档中可以看出,war插件还有一个目标(goal)是exploded,即,只生成目录结构,而不生成war文件。
参见:http://maven.apache.org/plugins/maven-war-plugin/plugin-info.html
可以在当前目录下直接使用mvn war:exploded,就能生成当前项目的网站目录结构。
使用mvn war:exploded
生成网站目录结构的时候,war插件会把src/main/webapp
目录下的内容全部copy到target/${finalName}
目录下,但是,有时候webapp里的一些资源部需要copy,比如我会在src/main/webapp
的js目录下放很多jQuery的插件,其中包括插件的帮助文档;但是我可能只会用到其中一部分插件。所以在生成网站目录结构的时候,我根本不需要把src/main/webapp
的js目录下的所以文件都copy到target/${finalName}
目录中,这时候就需要对exploded目标(goal)进行资源过滤了——不把没用的资源copy到网站的目录结构中去:
<plugin>
<artifactId>maven-war-pluginartifactId>
<configuration>
<warSourceExcludes>js/参考/**warSourceExcludes>
configuration>
plugin>
说明:上面的配置,使用了war插件的warSourceExcludes参数,该参数是一个String类型,需要把被排除的路径或文件使用逗号(comma)间隔开。
七、在打包时,需要清空一些指定的目录
配置描述:maven提供了很多有用插件,如mvn clean使用到的maven-clean-plugin,mvn compile使用到的maven-compile-plugin等,这些插件可以通过pom文件绑定到maven三个生命周期(life-cycle)的各阶段(phase)上,也可以在命令行(如Windows下的cmd)中单独由mvn命令调用,如mvn clean,可以调用maven-clean-plugin的clean目标(goal)。对于绑定到各阶段(phase)运行的插件的参数(parameter)可以用
标签(tag)配置,但是在该插件在命令行下单独由mvn命令调用,那么这个参数该如何使用pom文件配置呢?比如,在一个J2EE项目中,想使用mvn clean命令清除target里的内容的同时,也清除tomcat/webapp下的相应目录,该怎么办呢?这就需要在pom文件中对插件进行全局配置了。
<plugin>
<artifactId>maven-clean-pluginartifactId>
<configuration>
<verbose>trueverbose>
<filesets>
<fileset>
<directory>c:/adirectory>
fileset>
filesets>
configuration>
plugin>
插件的配置分为局部配置和全局配置,本文中对antrun和resource插件的配置是局部配置,对clean插件的配置是全局配置,能看出差别吧?
局部配置的
标签(tag)放在
标签(tag)里边,而全局配置的
标签(tag)则放在
标签(tag)里边,因为全局配置里根本就没有
标签(tag),因为全局配置针对的是该插件的全部目标(goal)配置的!
本例中,删除的是C:/a
目录,即,当用户在该maven项目中执行mvn clean后,除了删除clean插件默认的project.build.directory, project.build.outputDirectory,project.build.testOutputDirectory, 和 project.reporting.outputDirectory
目录外
(参考:http://maven.apache.org/plugins/maven-clean-plugin/clean-mojo.html#filesets),
注意,该配置仅针对本项目有效,即,用户在当前项目下使用mvn clean时,会删除C:/a目录;当用户在其他没有如此配置clean插件的maven项目中执行mvn clean时,不会删除C:/a目录。
设置fileset的目录时候用到的标签不能乱用,比如
private File directory;
private String[] includes;
private String[] excludes;
private boolean followSymlinks;
八、利用tomcat-maven-plugin插件将项目自动打包并部署到tomcat中
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>tomcat-maven-pluginartifactId>
<configuration>
<server>tomcat6-managerserver>
<path>/${project.build.name}path>
<url>http://localhost:8080/managerurl>
<username>adminusername>
<password>adminpassword>
configuration>
<executions>
<execution>
<phase>deployphase>
<goals>
<goal>deploygoal>
goals>
execution>
executions>
plugin>
plugins>
path: 是指项目部署到tomcat后的项目名称
url: 是指tomcat的manager访问地址
server: 这个是tomcat服务名称设置,需要配置maven的settings.xml文件,在servers节点中手动配置server,如下所示:
<server>
<id>tomcat6-managerid>
<username>adminusername>
<password>adminpassword>
server>
九、利用cargo-maven2-plugin插件将项目自动打包并部署到tomcat中
配置描述:使用maven做web项目时,cargo插件可以帮助你完成WAR包到服务器的部署及服务器的启动和关闭等工作,方便,快速!
<plugin>
<groupId>org.codehaus.cargogroupId>
<artifactId>cargo-maven2-pluginartifactId>
<version>1.2.0version>
<configuration>
<container>
<containerId>${server_name}containerId>
<home>${server_home}home>
container>
<configuration>
<type>existingtype>
<home>${server_home}home>
<properties>
<cargo.servlet.port>8088cargo.servlet.port>
properties>
configuration>
configuration>
plugin>
注意,如果你的tomcat服务器的端口使用的不是默认的8080(如本例中的8088),则需要使用cargo.servlet.port参数将cargo的监听端口也配置到tomcat的那个监听端口(如本例中的8088),否则使用mvn cargo:run启动的服务器会在120000毫秒(120秒)后自动关闭!
mvn cargo:start命令完成WAR包部署后,启动服务器,然后会将服务器立即关掉;
mvn cargo:run命令完成WAR包部署后,启动服务器,直到你Ctrl+C将服务器关掉;
mvn cargo:stop命令关闭服务器。
<plugin>
<groupId>org.codehaus.cargogroupId>
<artifactId>cargo-maven2-pluginartifactId>
<version>1.2.3version>
<configuration>
<container>
<containerId>tomcat6xcontainerId>
<home>E:\Program Files\tomcat-6.0.32home>
container>
<configuration>
<type>existingtype>
<home>E:\Program Files\tomcat-6.0.32home>
<properties>
<cargo.tomcat.manager.url>http://localhost:8080/managercargo.tomcat.manager.url>
<cargo.remote.username>admincargo.remote.username>
<cargo.remote.password>admincargo.remote.password>
properties>
configuration>
configuration>
plugin>
username和password: 是指tomcat的tomcat-users.xml文件中配置的,文件路径为E:\Program Files\tomcat-6.0.32\conf\tomcat-users.xml,如下所示:
<role rolename="manager"/>
<user password="admin" roles="manager" username="admin"/>
十、有时候插件检查不通过,需要人为的忽略对有些插件的检查
<pluginManagement>
<plugins>
<plugin>
<groupId>org.eclipse.m2egroupId>
<artifactId>lifecycle-mappingartifactId>
<version>1.0.0version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<versionRange>[2.0,)versionRange>
<goals>
<goal>copy-dependenciesgoal>
goals>
pluginExecutionFilter>
<action>
<ignore />
action>
pluginExecution>
pluginExecutions>
lifecycleMappingMetadata>
configuration>
plugin>
plugins>
pluginManagement>
十一、maven-resources-plugin
配置描述:把web项目的输出copy到tomcat的webapp下
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<version>2.5version>
<executions>
<execution>
<id>deploy-websiteid>
<phase>packagephase>
<goals>
<goal>copy-resourcesgoal>
goals>
<configuration>
<outputDirectory>${server_home}/webapps/${project.build.finalName}outputDirectory>
<resources>
<resource>
<directory>${project.build.directory}/${project.build.finalName}directory>
resource>
resources>
configuration>
execution>
executions>
plugin>
十二、maven-antrun-plugin
配置描述:在maven中使用antrun调用bat文件
(我这里调用的是tomcat的startup.bat文件,但是没有成功启动tomcat,提示说环境变量没配置,可我双击运行startup.bat将就可以运行,奇怪了……)
(现在知道原因了:antrun运行的bat文件,实际上是在basedir上运行bat文件里的内容,而tomcat的startup.bat文件在运行时会调用同目录下的其他bat文件,而这些bat文件在{basedir}目录下不存在!
解决方法:使用令一个bat文件,如mystartup.bat运行startup.bat,注意在运行startup.bat之前,需要在mystartup.bat文件中把目录切换到startup.bat所在的目录,搞定!
具体做法,参见:使用Maven的antrun插件启动Tomcat的两种方法:http://blog.csdn.net/lslxdx/article/details/7245695)
参见:http://markmail.org/message/c3igpnp7dvkajsrl
<plugin>
<artifactId>maven-antrun-pluginartifactId>
<executions>
<execution>
<id>start-serverid>
<phase>packagephase>
<configuration>
<tasks>
<exec
executable="${server_home}/bin/startup.bat"
>
exec>
tasks>
configuration>
<goals>
<goal>rungoal>
goals>
execution>
executions>
plugin>
参考文献:Maven学习笔记(二)——常用插件配置详解