目录
针对一个项目来说,我们平时可能遇到各种情况,比如一开始的项目构建,如果用eclipse搭建的工程很可能在NetBeans下面无法运行,我们所使用的第三方包很可能两个成员使用版本不一致导致出现问题,包括后续的发布等等,那么如何避免这些让项目合作更加顺利呢?
Maven诞生,他来提供了标准的目录结构,提供了默认构建生命周期,统一标准完成这些基础构建配置。我们可能听过maven,本文带来他所有的功能,希望可以利用全其所提供的特性。
约定优于配置
- source code ${basedir}/src/main/java
- resources ${basedir}/src/main/resources
- Tests ${basedir}/src/test
- Complied byte code ${basedir}/target
- distributable JAR ${basedir}/target/classes
安装
- http://maven.apache.org/download.html
-
Windows 使用系统属性设置环境变量。
M2_HOME=C:\Program Files\Apache Software Foundation\apache-maven-3.2.5
M2=%M2_HOME%\bin
MAVEN_OPTS=-Xms256m -Xmx512m
- Linux 打开命令终端设置环境变量。
export M2_HOME=/usr/local/apache-maven/apache-maven-3.2.5
export M2=$M2_HOME/bin
export MAVEN_OPTS=-Xms256m -Xmx512m
- 查看maven是否配置好
mvn --version
POM
Project Object Model(POM)工程结构、配置细节、目标与插件定义与此
能够在POM中设置的配置如下:
– project dependencies
– plugins
– goals
– build profiles
– project version
– developers
– mailing list
<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.companyname.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
</project>
POM中的三要素
在仓库中的工程标识为 groupId:artifactId:version 如com.company.bank:consumer-banking:1.0
– groupId
– artifactId
– version
Super POM
所有的POM都继承自一个父POM。包含一些可以被继承的默认设置。
查看 Super POM 默认配置的一个简单方法是执行以下命令:
mvn help:effective-pom 可以看到 Maven 在执行目标时需要用到的默认工程源码目录结构、输出目录、需要的插件、仓库和报表目录
构建生命周期
当 Maven 开始构建工程,会按照所定义的阶段序列的顺序执行每个阶段注册的目标。当需要在某个特定阶段之前或之后执行目标时,可以使用 pre 和 post 来定义这个目标。
– prepare-resources 资源拷贝 本阶段可以自定义需要拷贝的资源
– compile 编译 本阶段完成源代码编译
– package 打包 本阶段根据 pom.xml 中描述的打包配置创建 JAR / WAR 包
– install 安装 本阶段在本地 / 远程仓库中安装工程包
Maven有三个标准生命周期
– clean
– default
– site
Clean 生命周期
删除构建输出等操作
- pre-clean
- clean
- post-clean
举例:我们将 maven-antrun-plugin:run 目标添加到 pre-clean、clean 和 post-clean 阶段中。这样我们可以在 clean 生命周期的各个阶段显示文本信息。
<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.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.pre-clean</id>
<phase>pre-clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>pre-clean phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.clean</id>
<phase>clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>clean phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.post-clean</id>
<phase>post-clean</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>post-clean phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
执行命令:
mvn post-clean
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO] task-segment: [post-clean]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.pre-clean}]
[INFO] Executing tasks
[echo] pre-clean phase
[INFO] Executed tasks
[INFO] [clean:clean {execution: default-clean}]
[INFO] [antrun:run {execution: id.clean}]
[INFO] Executing tasks
[echo] clean phase
[INFO] Executed tasks
[INFO] [antrun:run {execution: id.post-clean}]
[INFO] Executing tasks
[echo] post-clean phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Sat Jul 07 13:38:59 IST 2012
[INFO] Final Memory: 4M/44M
[INFO] ------------------------------------------------------------------
Default (or Build) 生命周期
主要生命周期,用于构建应用,包含以下23个阶段
当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。
不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 Maven 生命周期阶段。
- validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
- initialize 初始化构建状态,例如设置属性。
- generate-sources 生成编译阶段需要包含的任何源码文件。
- process-sources 处理源代码,例如,过滤任何值(filter any value)。
- generate-resources 生成工程包中需要包含的资源文件。
- process-resources 拷贝和处理资源文件到目的目录中,为打包阶段做准备。
- compile 编译工程源码。
- process-classes 处理编译生成的文件,例如 Java Class 字节码的加强和优化。
- generate-test-sources 生成编译阶段需要包含的任何测试源代码。
- process-test-sources 处理测试源代码,例如,过滤任何值(filter any values)。
- test-compile 编译测试源代码到测试目的目录。
- process-test-classes 处理测试代码文件编译后生成的文件。
- test 使用适当的单元测试框架(例如JUnit)运行测试。
- prepare-package 在真正打包之前,为准备打包执行任何必要的操作。
- package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
- pre-integration-test 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
- integration-test 处理和部署必须的工程包到集成测试能够运行的环境中。
- post-integration-test 在集成测试被执行后执行必要的操作。例如,清理环境。
- verify 运行检查操作来验证工程包是有效的,并满足质量要求。
- install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
- deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。
举例:我们将 maven-antrun-plugin:run 目标添加到 Build 生命周期的一部分阶段中。这样我们可以显示生命周期的文本信息。
<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.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>id.validate</id>
<phase>validate</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>validate phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.compile</id>
<phase>compile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>compile phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.test</id>
<phase>test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>test phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.package</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>package phase</echo>
</tasks>
</configuration>
</execution>
<execution>
<id>id.deploy</id>
<phase>deploy</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>deploy phase</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
执行 mvn compile
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO] task-segment: [compile]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.validate}]
[INFO] Executing tasks
[echo] validate phase
[INFO] Executed tasks
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\project\src\main\resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [antrun:run {execution: id.compile}]
[INFO] Executing tasks
[echo] compile phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Sat Jul 07 20:18:25 IST 2012
[INFO] Final Memory: 7M/64M
[INFO] ------------------------------------------------------------------