Maven2 学习札记
2009-03-08 00:53
453 查看
Maven Build LifeCycle
http://www.diybl.com/course/3_program/java/javajs/2008521/117468.html
Maven2的主要配置pom.xml
http://www.javaresearch.org/article/61260.htm
1.
构建周期简介
术语表:
构建周期:build lifecycle
构建阶段:build phase
目标:goal
1. 概述
Maven 2.0的核心概念就是构建周期。这意味着构建和发布产品的过程都被明确的定义。
对于要进行项目构建的开发人员,这意味着只需要知道很少的命令,就可以构建任何的Maven项目,由POM确保需要的结果是正确的。
Maven包含了三个内建(built-in)的构建周期:default、clean和site。default构建周期用于处理项目的部署,clean构建周期处理项目的清理,而site构建周期则完成项目的站点文档。
2. 构建周期的构成
上述的内建的构建过程都是由一系列构建阶段(build phases)组成的,一个构建阶段代表了构建周期中的一个步骤。
例如:默认的构建周期包含以下的构建阶段(完整的构建阶段列表,请参考下文的构建周期参考)
validate:验证项目是否正确,以及所有必要的信息可用
compile:编译源代码
test:使用适当的单元测试框架(e.g.JUnit)来测试编译完成的源代码,这些测试用例应该可以测试发布的代码或者打包的代码
package:将便宜王成的代码打包成要发布的格式,例如JAR。
integration-test:处理并发布已经完成的包到集成环境,以便进行集成测试
verify:运行检查包是否正确并满足质量要求的检查
install:将package安装到本地的存储库,可以作为本地其它项目的依赖
deploy:集成测试或者释放环境的时候来完成,将最终包拷贝到远程存储库以备其他开发人员或者项目使用
这些构建阶段(以及未在此列出的构建阶段)按照顺序执行,以便完成整个default构建周期。以上面的为例子,这意味着当使用default构
建过程时,Maven首先验证项目,然后编译源代码,运行源代码测试用例,打包,运行集成测试,检查包文件,安装检查过的包文件到本地存储库,然后将安装
完成的包发布到指定的环境。
为了执行所有这些过程,可以通过调用最后一个构建阶段,也就是说,deploy:
mvn deploy
这是因为在调用构建阶段的时候,Maven不仅仅执行调用的构建阶段,而是运行优先的其他的构建阶段,也就是说,调用
mvn integration-test
时,就会运行所有它之前的构建阶段(validate,compile,package,etc.)。
其实对于一个构建过程来说,有更多的命令,我们将在下一节中进行讨论。
注意,同一个命令可以在多个模块中使用,例如:
mvn clean install
这个命令会遍历所有子项目,并运行clean,然后运行install(以及它们的前置步骤)。
3. 构建阶段的构成
虽然构建阶段只是构建周期中的一个特定的步骤,但是它所表现的职责却不一定相同,这通过定义属于构建阶段的目标(goals)来完成。
一个目标就代表了一个特定的任务(这比构建阶段更加的精确),用于构建和管理项目。可以绑定到0个或者多个构建阶段。没有绑定到任何构建阶段的目
标可以在构建周期外部直接调用。执行的顺序取决于目标和构建阶段被调用的顺序。例如下面的命令行中,clean和package参数是构建阶
段,dependency:copy-dependencies是一个目标。
mvn clean dependency:copy-dependencies package
如果上述命令被执行的话,那么首先执行clean阶段,也就是说会运行所有clean构建周期的前导阶段,加上clean阶段自身。然后运行dependency:copy-dependencies目标。最后执行package阶段。
如果目标被绑定到1个或者多个阶段,那么目标会在所有那些阶段中被调用。
一个构建阶段也可以绑定一个或者多个目标。如果构建阶段没有绑定到它的目标,构建阶段就不会执行。如果有1个或者多个目标绑定到它,他就会执行所有的目标。
4. 设置构建周期
构建周期易于使用,但是当对项目使用Maven构建时,如何对构建阶段分配任务呢?
打包
首先,也是最常用的方式是使用POM中定义的元素<package>来设置打包任务。打包的合法的值包括jar、war、ear和pom。默认的值为jar。
每种打包任务都包含了一系列的目标绑定到特定的阶段。例如,对于jar打包来说,下面的目标会绑定到default构建周期的构建阶段:
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
这是最标准的绑定集。但是,有些打包任务对它们的处理不同,例如,一个项目是纯metadata(打包的值是pom),那么将绑定目标到install和deploy阶段。
Plugins
另外一种将目标加到阶段的方法是在项目中配置插件。插件是为Maven提供目标的产品。并且,插件可能包含1个或者多个目标,每个目标都代表了插
件的所提供的功能。例如,Compiler插件有两个目标:compile和testCompile。前者用于编译main源代码,后者用于编译测试源代
码。
插件包含了目标将被绑定到哪一个构建阶段的信息。注意只添加插件是不够的,必须指定在构建过程中要运行的目标。
被配置的目标会添加到已经绑定到构建周期的目标中。如果一个构建阶段被绑定了多个目标,那么执行的顺序是,先执行打包的目标,然后执行在POM中配置的目标。注意,可以通过使用<executions>元素来更好的控制特定目标执行的顺序。
5. 构建周期参考
下面的列表列出了default,clean和site构建周期的所有构建阶段,执行的顺序和列出的顺序一致。
Clean构建周期
pre-clean:预清理项目
clean:移除前次构建过程生成的所有文件
post-clean:结束清理后的工作
Default构建周期
validate:验证项目是否正确,以及必要的信息是否可用
generate-sources:生成在编译过程中需要包含的代码
process-sources:处理源代码,例如过滤特定的值
generate-resources:生成package中包含的资源
process-resources:将资源拷贝或者处理(native2ascii)到目标目录,为打包做准备
compile:编译工程的源代码
process-classes:对编译生成的文件进行处理,例如进行字节码的增强
generate-test-sources:生成编译过程中包含的测试源代码
process-test-sources:处理测试源代码,例如过滤特定的值
generate-test-resources:创建测试用的资源
process-test-resources:将资源拷贝或者处理(native2ascii)到测试目标目录
test-compile:编译测试的源代码
process-test-classes:对测试编译生成的文件进行处理,例如进行字节码的增强
test:使用合适的测试框架运行测试代码
prepare-package:执行所有在实际打包操作前的操作,这个操作的结果一般是产生实际打包钱的所有内容,包括目录结构等
package:将编译后的代码进行打包,生成可发布格式的文件,例如JAR
pre-integration-test:执行集成测试前的操作
integration-test:处理并发布包
post-integration-test:执行集成测试结束后的操作,例如清理环境
verify:运行检查包是否合法或者满足质量要求
install:将package安装到本地的存储库,可以作为本地其它项目的依赖
deploy:集成测试或者释放环境的时候来完成,将最终包拷贝到远程存储库以备其他开发人员或者项目使用
Sit
fcc3
e构建周期
pre-site:在生成实际的项目站点前,执行必要的操作
site:生成站点的文档
post-site:执行生成站点后的操作,并准备发布站点
site-deploy:发布站点
6. 内建的构建周期绑定
有些构建阶段有默认的目标绑定。对于默认的构建周期,这些绑定依赖于packaging的值,下面是一些goal-to-build-phase绑定。
Clean构建周期绑定
clean: clean:clean
Default构建周期绑定—packaging ejb/ejb3/jar/par/rar/war
process-resources: resources:resources
compile: compilter:compile
process-test-resources: resources:testResource
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构建周期绑定—packaging ear
generate-resources ear:generateApplicationXml
process-resources resources:resources
package ear:ear
install install:install
deploy deploy:d
2. pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
快速察看:
<project>
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
基本内容:
POM包括了所有的项目信息。
maven 相关:
pom定义了最小的maven2元素,允许groupId,artifactId,version。所有需要的元素
groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为:/org/codehaus/mojo
artifactId: 项目的通用名称
version:项目的版本
packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par
classifier: 分类
POM关系:
主要为依赖,继承,合成
依赖关系:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
groupId, artifactId, version:描述了依赖的项目唯一标志
可以通过以下方式进行安装:
使用以下的命令安装:
mvn install:install-file ?Dfile=non-maven-proj.jar ?DgroupId=some.group ?DartifactId=non-maven-proj ?Dversion=1
创建自己的库,并配置,使用deploy:deploy-file
设置此依赖范围为system,定义一个系统路径。不提倡。
type:相应的依赖产品包形式,如jar,war
scope:用于限制相应的依赖范围,包括以下的几种变量:
compile :默认范围,用于编译
provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
runtime:在执行时,需要使用
test:用于test任务时使用
system:需要外在提供相应得元素。通过systemPath来取得
systemPath: 仅用于范围为system。提供相应的路径
optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用
独占性
外在告诉maven你只包括指定的项目,不包括相关的依赖。此因素主要用于解决版本冲突问题
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</exclusion>
</exclusions>
</dependency>
表示项目maven-embedder需要项目maven-core,但我们不想引用maven-core
继承关系
另一个强大的变化,maven带来的是项目继承。主要的设置:
定义父项目
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
</project>
packaging 类型,需要pom用于parent和合成多个项目。我们需要增加相应的值给父pom,用于子项目继承。主要的元素如下:
依赖型
开发者和合作者
插件列表
报表列表
插件执行使用相应的匹配ids
插件配置
子项目配置
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
</project>
relativePath可以不需要,但是用于指明parent的目录,用于快速查询。
dependencyManagement:
用于父项目配置共同的依赖关系,主要配置依赖包相同因素,如版本,scope。
合成(或者多个模块)
一个项目有多个模块,也叫做多重模块,或者合成项目。
如下的定义:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<modules>
<module>my-project1<module>
<module>my-project2<module>
</modules>
</project>
build 设置
主要用于编译设置,包括两个主要的元素,build和report
build
主要分为两部分,基本元素和扩展元素集合
注意:包括项目build和profile build
<project>
<!-- "Project Build" contains more elements than just the BaseBuild set -->
<build>...</build>
<profiles>
<profile>
<!-- "Profile Build" contains a subset of "Project Build"s elements -->
<build>...</build>
</profile>
</profiles>
</project>
基本元素
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
defaultGoal: 定义默认的目标或者阶段。如install
directory: 编译输出的目录
finalName: 生成最后的文件的样式
filter: 定义过滤,用于替换相应的属性文件,使用maven定义的属性。设置所有placehold的值
资源(resources)
你项目中需要指定的资源。如spring配置文件,log4j.properties
<project>
<build>
...
<resources>
<resource>
<targetPath>META-INF/plexus</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/plexus</directory>
<includes>
<include>configuration.xml</include>
</includes>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<testResources>
...
</testResources>
...
</build>
</project>
resources: resource的列表,用于包括所有的资源
targetPath: 指定目标路径,用于放置资源,用于build
filtering: 是否替换资源中的属性placehold
directory: 资源所在的位置
includes: 样式,包括那些资源
excludes: 排除的资源
testResources: 测试资源列表
插件
在build时,执行的插件,比较有用的部分,如使用jdk 5.0编译等等
<project>
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.0</version>
<extensions>false</extensions>
<inherited>true</inherited>
<configuration>
<classifier>test</classifier>
</configuration>
<dependencies>...</dependencies>
<executions>...</executions>
</plugin>
</plugins>
</build>
</project>
extensions: true or false,是否装载插件扩展。默认false
inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目
configuration: 指定插件配置
dependencies: 插件需要依赖的包
executions: 用于配置execution目标,一个插件可以有多个目标。
如下:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>echodir</id>
<goals>
<goal>run</goal>
</goals>
<phase>verify</phase>
<inherited>false</inherited>
<configuration>
<tasks>
<echo>Build Dir: ${project.build.directory}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
说明:
id:规定execution 的唯一标志
goals: 表示目标
phase: 表示阶段,目标将会在什么阶段执行
inherited: 和上面的元素一样,设置false maven将会拒绝执行继承给子插件
configuration: 表示此执行的配置属性
插件管理
pluginManagement:插件管理以同样的方式包括插件元素,用于在特定的项目中配置。所有继承于此项目的子项目都能使用。主要定义插件的共同元素
扩展元素集合
主要包括以下的元素:
Directories
用于设置各种目录结构,如下:
<build>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
...
</build>
Extensions
表示需要扩展的插件,必须包括进相应的build路径。
<project>
<build>
...
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-3</version>
</extension>
</extensions>
...
</build>
</project>
Reporting
用于在site阶段输出报表。特定的maven 插件能输出相应的定制和配置报表。
<reporting>
<plugins>
<plugin>
<outputDirectory>${basedir}/target/site</outputDirectory>
<artifactId>maven-project-info-reports-plugin</artifactId>
<reportSets>
<reportSet></reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
Report Sets
用于配置不同的目标,应用于不同的报表
<reporting>
<plugins>
<plugin>
...
<reportSets>
<reportSet>
<id>sunlink</id>
<reports>
<report>javadoc</report>
</reports>
<inherited>true</inherited>
<configuration>
<links>
<link>http://java.sun.com/j2se/1.5.0/docs/api/</link>;
</links>
</configuration>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
更多的项目信息
name:项目除了artifactId外,可以定义多个名称
description: 项目描述
url: 项目url
inceptionYear:创始年份
Licenses
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>;
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
Organization
配置组织信息
<organization>
<name>Codehaus Mojo</name>
<url>http://mojo.codehaus.org</url>;
</organization>
Developers
配置开发者信息
<developers>
<developer>
<id>eric</id>
<name>Eric</name>
<email>eredmond@codehaus.org</email>
<url>http://eric.propellors.net</url>;
<organization>Codehaus</organization>
<organizationUrl>http://mojo.codehaus.org</organizationUrl>;
<roles>
<role>architect</role>
<role>developer</role>
</roles>
<timezone>-6</timezone>
<properties>
<picUrl>http://tinyurl.com/prv4t</picUrl>;
</properties>
</developer>
</developers>
Contributors
<contributors>
<contributor>
<name>Noelle</name>
<email>some.name@gmail.com</email>
<url>http://noellemarie.com</url>;
<organization>Noelle Marie</organization>
<organizationUrl>http://noellemarie.com</organizationUrl>;
<roles>
<role>tester</role>
</roles>
<timezone>-5</timezone>
<properties>
<gtalk>some.name@gmail.com</gtalk>
</properties>
</contributor>
</contributors>
环境设置
Issue Management
定义相关的bug跟踪系统,如bugzilla,testtrack,clearQuest等
<issueManagement>
<system>Bugzilla</system>
<url>http://127.0.0.1/bugzilla</url>;
</issueManagement>
Continuous Integration Management
连续整合管理,基于triggers或者timings
<ciManagement>
<system>continuum</system>
<url>http://127.0.0.1:8080/continuum</url>;
<notifiers>
<notifier>
<type>mail</type>
<sendOnError>true</sendOnError>
<sendOnFailure>true</sendOnFailure>
<sendOnSuccess>false</sendOnSuccess>
<sendOnWarning>false</sendOnWarning>
<configuration><address>continuum@127.0.0.1</address></configuration>
</notifier>
</notifiers>
</ciManagement>
Mailing Lists
<mailingLists>
<mailingList>
<name>User List</name>
<subscribe>user-subscribe@127.0.0.1</subscribe>
<unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
<post>user@127.0.0.1</post>
<archive>http://127.0.0.1/user/</archive>;
<otherArchives>
<otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>;
</otherArchives>
</mailingList>
</mailingLists>
SCM
软件配置管理,如cvs 和svn
<scm>
<connection>scm:svn:http://127.0.0.1/svn/my-project</connection>;
<developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>;
<tag>HEAD</tag>
<url>http://127.0.0.1/websvn/my-project</url>;
</scm>
Repositories
配置同setting.xml中的开发库
Plugin Repositories
配置同 repositories
Distribution Management
用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置
1 配置到文件系统
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>file://${basedir}/target/deploy</url>
</repository>
</distributionManagement>
2 使用ssh2配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>scp://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
3 使用sftp配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>sftp://ftpserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
4 使用外在的ssh配置
编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>scpexe://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh-external</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
5 使用ftp配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>ftp://ftpserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
repository 对应于你的开发库,用户信息通过settings.xml中的server取得
Profiles
类似于settings.xml中的profiles,增加了几个元素,如下的样式:
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
http://www.diybl.com/course/3_program/java/javajs/2008521/117468.html
Maven2的主要配置pom.xml
http://www.javaresearch.org/article/61260.htm
1.
构建周期简介
术语表:
构建周期:build lifecycle
构建阶段:build phase
目标:goal
1. 概述
Maven 2.0的核心概念就是构建周期。这意味着构建和发布产品的过程都被明确的定义。
对于要进行项目构建的开发人员,这意味着只需要知道很少的命令,就可以构建任何的Maven项目,由POM确保需要的结果是正确的。
Maven包含了三个内建(built-in)的构建周期:default、clean和site。default构建周期用于处理项目的部署,clean构建周期处理项目的清理,而site构建周期则完成项目的站点文档。
2. 构建周期的构成
上述的内建的构建过程都是由一系列构建阶段(build phases)组成的,一个构建阶段代表了构建周期中的一个步骤。
例如:默认的构建周期包含以下的构建阶段(完整的构建阶段列表,请参考下文的构建周期参考)
validate:验证项目是否正确,以及所有必要的信息可用
compile:编译源代码
test:使用适当的单元测试框架(e.g.JUnit)来测试编译完成的源代码,这些测试用例应该可以测试发布的代码或者打包的代码
package:将便宜王成的代码打包成要发布的格式,例如JAR。
integration-test:处理并发布已经完成的包到集成环境,以便进行集成测试
verify:运行检查包是否正确并满足质量要求的检查
install:将package安装到本地的存储库,可以作为本地其它项目的依赖
deploy:集成测试或者释放环境的时候来完成,将最终包拷贝到远程存储库以备其他开发人员或者项目使用
这些构建阶段(以及未在此列出的构建阶段)按照顺序执行,以便完成整个default构建周期。以上面的为例子,这意味着当使用default构
建过程时,Maven首先验证项目,然后编译源代码,运行源代码测试用例,打包,运行集成测试,检查包文件,安装检查过的包文件到本地存储库,然后将安装
完成的包发布到指定的环境。
为了执行所有这些过程,可以通过调用最后一个构建阶段,也就是说,deploy:
mvn deploy
这是因为在调用构建阶段的时候,Maven不仅仅执行调用的构建阶段,而是运行优先的其他的构建阶段,也就是说,调用
mvn integration-test
时,就会运行所有它之前的构建阶段(validate,compile,package,etc.)。
其实对于一个构建过程来说,有更多的命令,我们将在下一节中进行讨论。
注意,同一个命令可以在多个模块中使用,例如:
mvn clean install
这个命令会遍历所有子项目,并运行clean,然后运行install(以及它们的前置步骤)。
3. 构建阶段的构成
虽然构建阶段只是构建周期中的一个特定的步骤,但是它所表现的职责却不一定相同,这通过定义属于构建阶段的目标(goals)来完成。
一个目标就代表了一个特定的任务(这比构建阶段更加的精确),用于构建和管理项目。可以绑定到0个或者多个构建阶段。没有绑定到任何构建阶段的目
标可以在构建周期外部直接调用。执行的顺序取决于目标和构建阶段被调用的顺序。例如下面的命令行中,clean和package参数是构建阶
段,dependency:copy-dependencies是一个目标。
mvn clean dependency:copy-dependencies package
如果上述命令被执行的话,那么首先执行clean阶段,也就是说会运行所有clean构建周期的前导阶段,加上clean阶段自身。然后运行dependency:copy-dependencies目标。最后执行package阶段。
如果目标被绑定到1个或者多个阶段,那么目标会在所有那些阶段中被调用。
一个构建阶段也可以绑定一个或者多个目标。如果构建阶段没有绑定到它的目标,构建阶段就不会执行。如果有1个或者多个目标绑定到它,他就会执行所有的目标。
4. 设置构建周期
构建周期易于使用,但是当对项目使用Maven构建时,如何对构建阶段分配任务呢?
打包
首先,也是最常用的方式是使用POM中定义的元素<package>来设置打包任务。打包的合法的值包括jar、war、ear和pom。默认的值为jar。
每种打包任务都包含了一系列的目标绑定到特定的阶段。例如,对于jar打包来说,下面的目标会绑定到default构建周期的构建阶段:
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
这是最标准的绑定集。但是,有些打包任务对它们的处理不同,例如,一个项目是纯metadata(打包的值是pom),那么将绑定目标到install和deploy阶段。
Plugins
另外一种将目标加到阶段的方法是在项目中配置插件。插件是为Maven提供目标的产品。并且,插件可能包含1个或者多个目标,每个目标都代表了插
件的所提供的功能。例如,Compiler插件有两个目标:compile和testCompile。前者用于编译main源代码,后者用于编译测试源代
码。
插件包含了目标将被绑定到哪一个构建阶段的信息。注意只添加插件是不够的,必须指定在构建过程中要运行的目标。
被配置的目标会添加到已经绑定到构建周期的目标中。如果一个构建阶段被绑定了多个目标,那么执行的顺序是,先执行打包的目标,然后执行在POM中配置的目标。注意,可以通过使用<executions>元素来更好的控制特定目标执行的顺序。
5. 构建周期参考
下面的列表列出了default,clean和site构建周期的所有构建阶段,执行的顺序和列出的顺序一致。
Clean构建周期
pre-clean:预清理项目
clean:移除前次构建过程生成的所有文件
post-clean:结束清理后的工作
Default构建周期
validate:验证项目是否正确,以及必要的信息是否可用
generate-sources:生成在编译过程中需要包含的代码
process-sources:处理源代码,例如过滤特定的值
generate-resources:生成package中包含的资源
process-resources:将资源拷贝或者处理(native2ascii)到目标目录,为打包做准备
compile:编译工程的源代码
process-classes:对编译生成的文件进行处理,例如进行字节码的增强
generate-test-sources:生成编译过程中包含的测试源代码
process-test-sources:处理测试源代码,例如过滤特定的值
generate-test-resources:创建测试用的资源
process-test-resources:将资源拷贝或者处理(native2ascii)到测试目标目录
test-compile:编译测试的源代码
process-test-classes:对测试编译生成的文件进行处理,例如进行字节码的增强
test:使用合适的测试框架运行测试代码
prepare-package:执行所有在实际打包操作前的操作,这个操作的结果一般是产生实际打包钱的所有内容,包括目录结构等
package:将编译后的代码进行打包,生成可发布格式的文件,例如JAR
pre-integration-test:执行集成测试前的操作
integration-test:处理并发布包
post-integration-test:执行集成测试结束后的操作,例如清理环境
verify:运行检查包是否合法或者满足质量要求
install:将package安装到本地的存储库,可以作为本地其它项目的依赖
deploy:集成测试或者释放环境的时候来完成,将最终包拷贝到远程存储库以备其他开发人员或者项目使用
Sit
fcc3
e构建周期
pre-site:在生成实际的项目站点前,执行必要的操作
site:生成站点的文档
post-site:执行生成站点后的操作,并准备发布站点
site-deploy:发布站点
6. 内建的构建周期绑定
有些构建阶段有默认的目标绑定。对于默认的构建周期,这些绑定依赖于packaging的值,下面是一些goal-to-build-phase绑定。
Clean构建周期绑定
clean: clean:clean
Default构建周期绑定—packaging ejb/ejb3/jar/par/rar/war
process-resources: resources:resources
compile: compilter:compile
process-test-resources: resources:testResource
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构建周期绑定—packaging ear
generate-resources ear:generateApplicationXml
process-resources resources:resources
package ear:ear
install install:install
deploy deploy:d
2. pom作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
快速察看:
<project>
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
基本内容:
POM包括了所有的项目信息。
maven 相关:
pom定义了最小的maven2元素,允许groupId,artifactId,version。所有需要的元素
groupId:项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如org.codehaus.mojo生成的相对路径为:/org/codehaus/mojo
artifactId: 项目的通用名称
version:项目的版本
packaging: 打包的机制,如pom, jar, maven-plugin, ejb, war, ear, rar, par
classifier: 分类
POM关系:
主要为依赖,继承,合成
依赖关系:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
groupId, artifactId, version:描述了依赖的项目唯一标志
可以通过以下方式进行安装:
使用以下的命令安装:
mvn install:install-file ?Dfile=non-maven-proj.jar ?DgroupId=some.group ?DartifactId=non-maven-proj ?Dversion=1
创建自己的库,并配置,使用deploy:deploy-file
设置此依赖范围为system,定义一个系统路径。不提倡。
type:相应的依赖产品包形式,如jar,war
scope:用于限制相应的依赖范围,包括以下的几种变量:
compile :默认范围,用于编译
provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
runtime:在执行时,需要使用
test:用于test任务时使用
system:需要外在提供相应得元素。通过systemPath来取得
systemPath: 仅用于范围为system。提供相应的路径
optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用
独占性
外在告诉maven你只包括指定的项目,不包括相关的依赖。此因素主要用于解决版本冲突问题
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>2.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
</exclusion>
</exclusions>
</dependency>
表示项目maven-embedder需要项目maven-core,但我们不想引用maven-core
继承关系
另一个强大的变化,maven带来的是项目继承。主要的设置:
定义父项目
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<packaging>pom</packaging>
</project>
packaging 类型,需要pom用于parent和合成多个项目。我们需要增加相应的值给父pom,用于子项目继承。主要的元素如下:
依赖型
开发者和合作者
插件列表
报表列表
插件执行使用相应的匹配ids
插件配置
子项目配置
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
</project>
relativePath可以不需要,但是用于指明parent的目录,用于快速查询。
dependencyManagement:
用于父项目配置共同的依赖关系,主要配置依赖包相同因素,如版本,scope。
合成(或者多个模块)
一个项目有多个模块,也叫做多重模块,或者合成项目。
如下的定义:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<modules>
<module>my-project1<module>
<module>my-project2<module>
</modules>
</project>
build 设置
主要用于编译设置,包括两个主要的元素,build和report
build
主要分为两部分,基本元素和扩展元素集合
注意:包括项目build和profile build
<project>
<!-- "Project Build" contains more elements than just the BaseBuild set -->
<build>...</build>
<profiles>
<profile>
<!-- "Profile Build" contains a subset of "Project Build"s elements -->
<build>...</build>
</profile>
</profiles>
</project>
基本元素
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${artifactId}-${version}</finalName>
<filters>
<filter>filters/filter1.properties</filter>
</filters>
...
</build>
defaultGoal: 定义默认的目标或者阶段。如install
directory: 编译输出的目录
finalName: 生成最后的文件的样式
filter: 定义过滤,用于替换相应的属性文件,使用maven定义的属性。设置所有placehold的值
资源(resources)
你项目中需要指定的资源。如spring配置文件,log4j.properties
<project>
<build>
...
<resources>
<resource>
<targetPath>META-INF/plexus</targetPath>
<filtering>false</filtering>
<directory>${basedir}/src/main/plexus</directory>
<includes>
<include>configuration.xml</include>
</includes>
<excludes>
<exclude>**/*.properties</exclude>
</excludes>
</resource>
</resources>
<testResources>
...
</testResources>
...
</build>
</project>
resources: resource的列表,用于包括所有的资源
targetPath: 指定目标路径,用于放置资源,用于build
filtering: 是否替换资源中的属性placehold
directory: 资源所在的位置
includes: 样式,包括那些资源
excludes: 排除的资源
testResources: 测试资源列表
插件
在build时,执行的插件,比较有用的部分,如使用jdk 5.0编译等等
<project>
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.0</version>
<extensions>false</extensions>
<inherited>true</inherited>
<configuration>
<classifier>test</classifier>
</configuration>
<dependencies>...</dependencies>
<executions>...</executions>
</plugin>
</plugins>
</build>
</project>
extensions: true or false,是否装载插件扩展。默认false
inherited: true or false,是否此插件配置将会应用于poms,那些继承于此的项目
configuration: 指定插件配置
dependencies: 插件需要依赖的包
executions: 用于配置execution目标,一个插件可以有多个目标。
如下:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>echodir</id>
<goals>
<goal>run</goal>
</goals>
<phase>verify</phase>
<inherited>false</inherited>
<configuration>
<tasks>
<echo>Build Dir: ${project.build.directory}</echo>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
说明:
id:规定execution 的唯一标志
goals: 表示目标
phase: 表示阶段,目标将会在什么阶段执行
inherited: 和上面的元素一样,设置false maven将会拒绝执行继承给子插件
configuration: 表示此执行的配置属性
插件管理
pluginManagement:插件管理以同样的方式包括插件元素,用于在特定的项目中配置。所有继承于此项目的子项目都能使用。主要定义插件的共同元素
扩展元素集合
主要包括以下的元素:
Directories
用于设置各种目录结构,如下:
<build>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
...
</build>
Extensions
表示需要扩展的插件,必须包括进相应的build路径。
<project>
<build>
...
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-3</version>
</extension>
</extensions>
...
</build>
</project>
Reporting
用于在site阶段输出报表。特定的maven 插件能输出相应的定制和配置报表。
<reporting>
<plugins>
<plugin>
<outputDirectory>${basedir}/target/site</outputDirectory>
<artifactId>maven-project-info-reports-plugin</artifactId>
<reportSets>
<reportSet></reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
Report Sets
用于配置不同的目标,应用于不同的报表
<reporting>
<plugins>
<plugin>
...
<reportSets>
<reportSet>
<id>sunlink</id>
<reports>
<report>javadoc</report>
</reports>
<inherited>true</inherited>
<configuration>
<links>
<link>http://java.sun.com/j2se/1.5.0/docs/api/</link>;
</links>
</configuration>
</reportSet>
</reportSets>
</plugin>
</plugins>
</reporting>
更多的项目信息
name:项目除了artifactId外,可以定义多个名称
description: 项目描述
url: 项目url
inceptionYear:创始年份
Licenses
<licenses>
<license>
<name>Apache 2</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>;
<distribution>repo</distribution>
<comments>A business-friendly OSS license</comments>
</license>
</licenses>
Organization
配置组织信息
<organization>
<name>Codehaus Mojo</name>
<url>http://mojo.codehaus.org</url>;
</organization>
Developers
配置开发者信息
<developers>
<developer>
<id>eric</id>
<name>Eric</name>
<email>eredmond@codehaus.org</email>
<url>http://eric.propellors.net</url>;
<organization>Codehaus</organization>
<organizationUrl>http://mojo.codehaus.org</organizationUrl>;
<roles>
<role>architect</role>
<role>developer</role>
</roles>
<timezone>-6</timezone>
<properties>
<picUrl>http://tinyurl.com/prv4t</picUrl>;
</properties>
</developer>
</developers>
Contributors
<contributors>
<contributor>
<name>Noelle</name>
<email>some.name@gmail.com</email>
<url>http://noellemarie.com</url>;
<organization>Noelle Marie</organization>
<organizationUrl>http://noellemarie.com</organizationUrl>;
<roles>
<role>tester</role>
</roles>
<timezone>-5</timezone>
<properties>
<gtalk>some.name@gmail.com</gtalk>
</properties>
</contributor>
</contributors>
环境设置
Issue Management
定义相关的bug跟踪系统,如bugzilla,testtrack,clearQuest等
<issueManagement>
<system>Bugzilla</system>
<url>http://127.0.0.1/bugzilla</url>;
</issueManagement>
Continuous Integration Management
连续整合管理,基于triggers或者timings
<ciManagement>
<system>continuum</system>
<url>http://127.0.0.1:8080/continuum</url>;
<notifiers>
<notifier>
<type>mail</type>
<sendOnError>true</sendOnError>
<sendOnFailure>true</sendOnFailure>
<sendOnSuccess>false</sendOnSuccess>
<sendOnWarning>false</sendOnWarning>
<configuration><address>continuum@127.0.0.1</address></configuration>
</notifier>
</notifiers>
</ciManagement>
Mailing Lists
<mailingLists>
<mailingList>
<name>User List</name>
<subscribe>user-subscribe@127.0.0.1</subscribe>
<unsubscribe>user-unsubscribe@127.0.0.1</unsubscribe>
<post>user@127.0.0.1</post>
<archive>http://127.0.0.1/user/</archive>;
<otherArchives>
<otherArchive>http://base.google.com/base/1/127.0.0.1</otherArchive>;
</otherArchives>
</mailingList>
</mailingLists>
SCM
软件配置管理,如cvs 和svn
<scm>
<connection>scm:svn:http://127.0.0.1/svn/my-project</connection>;
<developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>;
<tag>HEAD</tag>
<url>http://127.0.0.1/websvn/my-project</url>;
</scm>
Repositories
配置同setting.xml中的开发库
Plugin Repositories
配置同 repositories
Distribution Management
用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置
1 配置到文件系统
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>file://${basedir}/target/deploy</url>
</repository>
</distributionManagement>
2 使用ssh2配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>scp://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
3 使用sftp配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>sftp://ftpserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
4 使用外在的ssh配置
编译扩展用于指定使用wagon外在ssh提供,用于提供你的文件到相应的远程服务器。
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>scpexe://sshserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ssh-external</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
5 使用ftp配置
<distributionManagement>
<repository>
<id>proficio-repository</id>
<name>Proficio Repository</name>
<url>ftp://ftpserver.yourcompany.com/deploy</url>
</repository>
</distributionManagement>
<build>
<extensions>
<extension>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-ftp</artifactId>
<version>1.0-alpha-6</version>
</extension>
</extensions>
</build>
repository 对应于你的开发库,用户信息通过settings.xml中的server取得
Profiles
类似于settings.xml中的profiles,增加了几个元素,如下的样式:
<profiles>
<profile>
<id>test</id>
<activation>...</activation>
<build>...</build>
<modules>...</modules>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<dependencies>...</dependencies>
<reporting>...</reporting>
<dependencyManagement>...</dependencyManagement>
<distributionManagement>...</distributionManagement>
</profile>
</profiles>
相关文章推荐
- Windows在各种情况下的响应的消息(大集合)-【学习札记】
- maven--学习
- pom文件中maven-assembly-plugin插件学习
- Maven学习笔记(二)——Eclipse插件安装(m2eclipse)
- 学习如何用Maven部署项目
- WinProc窗口过程定义函数解析-【学习札记】
- maven的学习---聚合工程的创建(四)
- JasperReport学习札记6-JRXML的标签
- Maven 学习笔记一
- maven学习--进阶篇
- maven学习之仓库(五)
- Maven学习笔记
- 18.02.09,web学习第五十五天,还有半年,努力吧青年 bos第一天 maven,svn,easyui
- Python学习札记(3)——关于Boa-constructor的问题
- Maven学习,使用笔记
- 学习笔记之maven2学习总结(1,入门起步与实践) [ 光影人像 东海陈光剑 的博客 ]
- 【hadoop】Hadoop学习笔记(八):如何使用Maven构建《hadoop权威指南3》随书的源码包
- 学习笔记 - maven 常用命令
- 使用Nexus2.x为Maven3.x搭建私服构件仓库-----学习笔记
- Maven学习总结(38)——Maven下载失败文件夹批量删除问题的两种解决方法