1. maven介绍:
maven 是一个软件构建和管理工具,Maven可以利用中心信息片断管理项目的构建、报告和文档等过程。
Maven的主要目标是允许开发人员在最短的时间内理解开发工作的完整状态。为了实现这一目标,Maven解决以下几个关注领域:
简化构建过程
提供统一的构建系统
Maven使用其项目对象模型(project object model,POM)和一组插件来构建项目。一旦您熟悉了一个Maven项目,就知道了所有Maven项目是如何构建的。这大大节省了浏览项目的时间。提供优质工程信息
Maven提供了有用的项目信息,部分来自POM,部分来自项目的源代码。
例如,Maven可以提供:
1 直接从源代码创建更改日志
2 交叉引用源
3 项目管理的邮件列表
4 项目使用的依赖项
5 单元测试报告,包括覆盖范围鼓励更好的工程实践
1 单元测试的规范
将测试源代码保存在单独且并行的代码树中
使用测试用例命名约定来定位和执行测试
让测试用例设置其环境,而不是自定义编译来进行测试准备
2 Maven还建议了一些有关如何布局项目目录结构的准则
2. maven实践:
-
工程目录结构:
src/main/java目录包含项目源代码,src/test/java目录包含测试代码,以及pom.xml文件是项目的项目对象模型(POM)。
工程目录结构.png - pom文件:
pom.xml文件是Maven中项目配置的核心。 它是一个配置文件,其中包含以所需方式构建项目所需的大多数信息。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 编译生命周期
maven有三个内置的编译生命周期:default、clean和site。default处理项目部署,clean进行处理项目清理,而site负责项目文档的创建。
每个构建生命周期都由不同的一系列构建step组成,其中一个构建step表示生命周期中的一个阶段。例如default生命周期由以下阶段组成:
- validate: 验证项目是否正确,必要信息是否可用。
- compile: 编译工程源码
- test:使用合适的单元测试框架测试编译的源代码
- package:获取编译后的代码并将其打包为可分发的格式,如JAR
- verify:对集成测试的结果进行任何检查,以确保满足质量标准
- install:将package安装到本地存储库中,以用作本地其他项目中的依赖项
- deploy: 将最终package复制部署到远程存储库
这些生命周期step按顺序执行,这意味着当使用default生命周期时,maven将首先验证项目,然后尝试编译源代码,对测试运行源代码,打包二进制文件(例如jar),对该包运行集成测试,验证集成测试,将已验证的包install到本地存储库,然后将已安装的包部署到远程存储库。
mvn verify // 此命令会有序的执行default生命周期verify之前每个阶段(validate、compile、package等)
mvn clean deploy
- build step由plugin goals组成
plugin goal代表一个特定的任务(比构建阶段更精细),它有助于项目的构建和管理。它可以绑定到零个或多个构建step。未绑定到任何构建阶段的goal可以通过直接调用在构建生命周期之外执行。goals执行顺序取决于goal自身顺序和构建step调用顺序。
mvn clean dependency:copy-dependencies package //clean和package参数是构建阶段,而dependency:copy-dependencies是plugin 的goal。
3. 工程构建生命周期设置
3.1 Packaging 打包方式设置
<packaging>jar</packaging> // war、jar、ear、pom
每个打包方式都包含要绑定到特定step的goal列表。例如,jar包将把以下goal绑定到default生命周期的构建阶段。
Phase | plugin:goal |
---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | jar:jar |
install | install:install |
deploy | deploy:deploy |
3.2 Plugins 插件
向step添加goal的另一种方式就是在项目中配置plugin。plugin是为Maven提供goal的组件。插件可以有一个或多个目标,其中每个目标表示该插件的能力。
例如,Compiler插件有两个goal:compile和 testCompile。前者编译主程序的源代码,后者编译测试代码的源代码。
plugin可以包含指示将goal绑定到哪个生命周期step的信息。仅添加插件是不够的,还必须指定作为构建的一部分运行的goal.
配置的goal将添加到所选打包方式指定的生命周期目标列表中。如果一个特定step被绑定了多个goal,则首先执行来自packaging的goal,然后执行在POM中配置的goal。
modello 插件绑定其默认的goal: modello:java到 generate-sources 阶段
因此,要使用Modello插件并让它生成源代码并将其合并到构建中,您可以在<build>的<plugins>部分的POM中添加以下内容:
<plugin>
<groupId>org.codehaus.modello</groupId>
<artifactId>modello-maven-plugin</artifactId>
<version>1.8.1</version>
<executions>
<execution>
<id>exe1</id>
<configuration>
<models>
<model>src/main/mdo/maven.mdo</model>
</models>
<version>4.0.0</version>
</configuration>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
</plugin>
每个execution都可以配置一套不同的参数,execution使用id来区分。
mvn modello:java@exec1
在当前配置下,modello:java只有在generate-sources阶段才有意义。但有些goal可以在不止一个step中使用。对于这些,您可以自己指定step。例如,假设你有一个目标 display:time:将当前时间回送到命令行,您希望它在process-test-resources阶段运行,以指示测试何时开始。配置如下:
<plugin>
<groupId>com.mycompany.example</groupId>
<artifactId>display-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>time</goal>
</goals>
</execution>
</executions>
</plugin>
3.3 内置的一些生命周期绑定的goal
Clean Lifecycle Bindings
Phase | plugin:goal |
---|---|
clean |
clean:clean |
Default Lifecycle Bindings
packaging ejb
/ ejb3
/ jar
/ par
/ rar
/ war
Phase | plugin:goal |
---|---|
process-resources |
resources:resources |
compile |
compiler:compile |
process-test-resources |
resources:testResources |
test-compile |
compiler:testCompile |
test |
surefire:test |
package |
ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
|
install |
install:install |
deploy |
deploy:deploy |
Default Lifecycle Bindings - Packaging pom
Phase | plugin:goal |
---|---|
package |
|
install |
install:install |
deploy |
deploy:deploy |