MAVEN的生命周期和插件
maven是通过插件来实现功能的。所谓的生命周期就是我们在构建项目时,maven默认需要是想的一些功能,而每一个功能就通过插件的某一功能来实现。
每个插件会有一个或多个功能,每个功能会实现一个目标(例如:生成test,compile,jar,rar,war)。
1.maven的插件
先介绍maven的插件,理解了插件的作用,然后了解maven默认生命周期。就能很快掌握maven插件的使用。
插件的使用命令。goal:插件目标,就是可以做成哪些事,例如:检验,打包,测试等等
mvn pluginname:goal
从一个maven官网提供的source插件介绍。这个插件能将源码打包,可以对不同的源码进行打包。从下面图中,我们可以知道有很多goal
然后我们在pom.xml中配置如下,这个插件默认的phase是package,先不配置phase。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</build>
使用命令:
mvn clean install
查看输出,插件并没有运行。直接使用插件
mvn source:jar
直接就生成了一个包文件,但是只运行了插件,没有运行其它的编译,测试功能。 修改下插件的phrase和goal,
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<outputDirectory>/absolute/path/to/the/output/directory</outputDirectory>
<finalName>filename-of-generated-jar-file</finalName>
<attach>false</attach>
</configuration>
<executions>
<execution>
<id>source-jar</id>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
<execution>
<id>test-source-jar</id>
<phase>test-compile</phase>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
执行maven的默认命令
mvn package
从打印日志可以看出,在compiler和test-compiler后,使用了source插件。
从这里可以看出来,如果没有绑定和插件是不会插入到maven默认的生命周期的。
总结:一个插件有多个功能(goal),插件实现一个功能(goal)就是一个生命周期。要在MAVEN默认的生命周期中使用插件,就需要使用配置<phase>和<goal>。否则,就只能通过插件命令source:jar,但是这个命令只会执行source:jar的功能。在我们使用插件的时候,为了将其插入到maven的默认生命周期中,都需要设置<phase>和<goal>。
2.maven的生命周期
maven有3个大的生命周期:clean,default,site。我们平时用的是clean,default周期。这么多生命周期,就是通过多个插件的多个功能实现的。下面整理的表,记录了这些生命周期名,作用,对应的插件,以对应的插件命令(和默认命令分清)。
clean的生命周期:
生命周期 | 作用 | 插件 | 命令 |
pre-clean | 执行清理前的工作 | maven-clean-plugin | clean:clean |
clean | 清理上一次构建生成的所有文件 | maven-clean-plugin | clean:clean |
post-clean | 执行清理后的工作 | maven-clean-plugin | clean:clean |
site的生命周期:
生命周期 | 作用 | 插件 | 命令 |
pre-site | 生成前的工作 | mave-site-plugin | site:site |
site | 生成项目的站点文件 | mave-site-plugin | site:site |
post-site | 生成后的工作 | maven-site-plugin | site:site |
site-deploy | 发布生成的站点文档 | maven-site-plugin | site-deploy |
default的生命周期:
生命周期 | 作用 | 插件 | 命令 |
validate | 检测工程信息 | ||
initialize | 初始化构建信息 | ||
generate-sources | 在target中生成源码 | ||
process-sourcess | 操作源码,过滤掉${}这些信息 | ||
generate-resources | 生成资源文件 | maven-plugin-plugin | plugin:descriptor |
process-resources | 复制资源文件和源码到目标文件夹 | maven-resources-plugin | resources:resources |
compile | 编译源码 | maven-compiler-plugin | compiler:compile |
process-classes | 编译后的文件处理 | ||
generate-test-sources | 生成测试的源码文件 | ||
process-test-sources | 处理源码文件 | ||
generate-test-resources | 生成测试的资源文件 | ||
process-test-resources | 处理测试的资源文件 | maven-resources-plugin | resources:testresources |
test-compile | 编译测试 | maven-compiler-plugin | compiler:testCompile |
process-compile | 处理测试文件 | ||
test | 测试 | maven-surefire-plugin | surefire:test |
prepare-package | 打包前的准备工作 | ||
package | 打包 | 不同的打包有不同的文件 | |
pre-integration-test | 集成测试前的准备 | ||
integration-test | 集成测试 | ||
post-integration-test | 继承测试的后续处理 | ||
verify | 运行检测 | maven-verifier-plugin | verifier:verify |
install | 生成到本地库 | maven-install-plugin | install:install |
deploy | 发布到远程库 | maven-deploy-plugin | deploy:deploy |
3.jetty插件的使用
第三方插件的使用,就是在maven默认的生命周期中插入一个生命周期(插件实现一个目标)。下面使用jetty插件实现一下
a、使用:
在pom中设置:
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>test</id>
<properties>
<test.name>test</test.name>
<test.password>test</test.password>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<test.name>release</test.name>
<test.password>release</test.password>
</properties>
</profile>
</profiles>
<build>
<finalName>test-web</finalName>
<resources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.8.v20160314</version>
<configuration>
<scanIntervalSeconds>3</scanIntervalSeconds>
<stopKey>foo</stopKey>
<stopPort>9999</stopPort>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8000</port>
</connector>
</connectors>
</configuration>
</plugin>
</plugins>
</build>
在src/main/resources中创建db.properties文件,内容如下
test.name=${test.name}
test.password=${test.password}
创建一个servlet
public class ThredServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 786750866880663272L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Properties pro = new Properties();
pro.load(this.getClass().getResourceAsStream("/db.properties"));
req.setAttribute("test.password", pro.get("test.password"));
req.setAttribute("test.name", pro.getProperty("test.name"));
PrintWriter out = resp.getWriter();
out.write("test.password:--" + pro.getProperty("test.password") + "\n\t");
out.write("test.name:--" + pro.getProperty("test.name"));
out.flush();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
然后执行:
mvn jetty:run -P test
输出
接着执行
mvn jetty:run -P dev
输出
这样,通过<profile>可以很方便的在设置的环境中做开发,不用每次都去配置,节约时间。也不需要发布到tomcat中,每次都需要重启tomcat,相当浪费事件。
b、jetty的配置信息
从log中我们,发现jetty会先编译,测试,然后在运行。从下图可以看出jetty运行时加载的数据:class(class文件和property文件),web.xml,webapp(jsp,html)等信息
jetty默认的class(class文件和property文件),web.xml,webapp(jsp,html)加载地址
resources in ${project.basedir}/src/main/webapp
classes in ${project.build.outputDirectory}
web.xml in ${project.basedir}/src/main/webapp/WEB-INF/
可以直接设置
<webApp>
<!-- context地址:就是模块的地址 -->
<contextPath>/</contextPath>
<!-- webapp地址 -->
<baseResource>src/main/webapp</baseResource>
<!-- web.xml地址 -->
<descriptor>${project.basedir}/src/over/webapp/web.xml</descriptor>
</webApp>
c、jetty的war包执行
上面配置还是很麻烦,jetty提供了一个简单的配置。可以直接加载运行war包,也就是jetty会先编译,测试,打包,运行。不许要指定其它的文件信息,直接运行war包
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.3.8.v20160314</version>
<configuration>
<war>${project.basedir}/target/mycustom.war</war>
</configuration>
</plugin>
执行命令
mvn jetty:run-war -P test