第0章:关于maven
1.Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
3.maven中央仓库:http://search.maven.org/
第1章:安装maven
1.安装jdk。验证java安装,执行命令“java -version”,或执行“java”和“javac”。
2.下载maven。地址:http://maven.apache.org/download.html 。建议下载3.0以上版本,如apache-maven-3.0.4.zip。
3.解压下载包,配置系统环境变量,如下:
变量名:M2_HOME 变量值:D:\software\maven\apache-maven-3.0.4 (maven根目录) |
变量名:Path 变量值:%M2_HOME%\bin; |
4.安装完成。验证方法执行“mvn -v” 。
5.修改本地仓库路径。修改maven根目录中conf文件夹中的setting.xml文件。修改<localRepository>标签中的路径,该路径指向为maven本地仓库。格式如下:
<localRepository>D:/software/repository</localRepository> |
6.IDE相关插件安装和简单项目搭建参考如下博客:
http://blog.csdn.net/oyzl68/article/details/8119086
http://www.cnblogs.com/timeng/archive/2013/05/07/maven_install.html
第2章:项目对象模型(POM)
1.项目坐标
POM定义了groupId,artifactId和version:这三项是所有项目都需要的坐标。格式如下:
<project> <modelVersion>4.0.0</modelVersion> <groupId>org.sonatype.mavenbook.ch08</groupId> <artifactId>simplest-project</artifactId> <version>1</version> </project> |
2.项目版本
Maven中的版本包含了以下部分:主版本,次版本,增量版本,和限定版本号。一个版本中,这些部分对应如下的格式:
<major version>.<minor version>.<incremental version>-<qualifier> |
1.如果一个项目依赖于SNAPSHOT,那么这个依赖很不稳定,它随时可能变化。
2.LATEST是指某个特定构件最新的发布版或者快照版(snapshot),最近被部署到某个特定仓库的构件。
3.RELEASE是指仓库中最后的一个非快照版本。
3.项目依赖
(1)项目依赖格式
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> |
(2)项目依赖范围
1.compile(编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath中可用,同时它们也会被打包。
2.provided(已提供范围)
provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web应用,你可能在编译classpath中需要可用的Servlet API来编译一个servlet,但是你不会想要在打包好的WAR中包含这个Servlet API;这个Servlet API JAR由你的应用服务器或者servlet容器提供。已提供范围的依赖在编译classpath(不是运行时)可用。它们不是传递性的,也不会被打包。
3.runtime(运行时范围)
runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API JAR,而只有在运行的时候才需要JDBC驱动实现。
4.test(测试范围)
test范围依赖 在一般的 编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
5.system(系统范围)
system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个systemPath元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的Maven仓库中引用依赖)。
(3)依赖版本界限
可以使用如下的字符来围绕一个或多个版本号,来实现版本界限。
(,)不包含量词
[,]包含量词
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>[3.8,4.0)</version> <scope>test</scope> </dependency> |
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>[,3.8.1]</version>ex-de <scope>test</scope> </dependency> |
(4)传递性依赖
一个传递性依赖就是对于一个依赖的依赖。如果project-a依赖于project-b,而后者接着依赖于project-c,那么project-c就被认为是project-a的传递性依赖。
表 :范围如何影响传递性依赖
直接范围 | 传递性范围 | |||
compile | provided | runtime | test | |
compile | compile | - | runtime | - |
provided | provided | provided | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
(5)依赖冲突解决
有很多时候你需要排除一个传递性依赖,比如当你依赖于一个项目,后者又继而依赖于另外一个项目,但你的希望是,要么整个的排除这个传递性依赖,要么用另外一个提供同样功能的依赖来替代这个传递性依赖。
<dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>3.2.5.ga</version> <exclusions> <exclusion> <groupId>javax.transaction</groupId> <artifactId>jta</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jta_1.1_spec</artifactId> <version>1.1</version> </dependency> </dependencies> |
4.项目关系
(1)多模块项目
多模块项目是那些包含一系列待构建模块的项目。一个多模块项目的打包类型总是pom,很少生成一个构件。一个模块项目的存在只是为了将很多项目归类在一起,成为一个构建。
<project> <groupId>org.sonatype.mavenbook</groupId> <artifactId>top-group</artifactId> ... <modules> <module>sub-group</module> <module>project-c</module> </modules> ... </project> |
(2)项目继承
有些情况你会想要一个项目从父POM中继承一些值。你可能正构建一个大型的系统,你不想一遍又一遍的重复同样的依赖元素。
<project> <parent> <groupId>com.training.killerapp</groupId> <artifactId>a-parent</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>project-a</artifactId> ... </project> |
第3章:maven生命周期
Maven拥有三套相互独立的生命周期,它们分别为clean,default和site。
每个生命周期包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段,用户和Maven最直接的交互方式就是调用这些生命周期阶段。
以clean生命周期为例,它包含的阶段有pre-clean, clean 和 post clean。当用户调用pre-clean的时候,只有pre-clean得以执行,当用户调用clean的时候,pre-clean和clean阶段会得以顺序执行;当用户调用post-clean的时候,pre-clean,clean,post-clean会得以顺序执行。
较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用default生命周期的某个阶段,而不会对其他生命周期产生任何影响。
1. clean 生命周期
clean生命周期的目的是清理项目,它包含三个阶段:
1)pre-clean 执行一些清理前需要完成的工作。
2)clean 清理上一次构建生成的文件。
3)post-clean 执行一些清理后需要完成的工作。
2. default 生命周期
default生命周期定义了真正构件时所需要执行的所有步骤,它是生命周期中最核心的部分,它包含的阶段如下:
1) validate 验证项目是否正确和所有需要的相关资源是否可用
2) initialize 初始化构建
3) generate-sources
4) process-sources 处理源代码
5) generate-resources
6) process-resources 处理项目主资源文件。对src/main/resources目录的内容进行变量替换等工作后,复制到项目输出的主classpath目录中。
7) compile 编译项目的主源代码
8) process-classes
9) generate-test-sources
10) process-test-sources 处理项目测试资源文件
11)generate-test-resources
12) process-test-resources 处理测试的资源文件
13)test-compile 编译项目的测试代码
14)process-test-classes
15) test 使用单元测试框架运行测试,测试代码不会被打包或部署
16)prepare-package 做好打包的准备
17)package 接受编译好的代码,打包成可发布的格式
18) pre-integration-test
19) integration-test
20) post integration-test
21) verify
22) install 将包安装到Maven本地仓库,供本地其他Maven项目使用
23)deploy 将最终的包复制到远程仓库,供其他开发人员和Maven项目使用
3. site 生命周期
site生命周期的目的是建立和发布项目站点,Maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息。该生命周期包含如下阶段:
1)pre-site 执行一些在生成项目站点之前需要完成的工作
2)site 生成项目站点文档
3)post-site 执行一些在生成项目站点之后需要完成的工作
4)site-deploy 将生成的项目站点发布到服务器上
第4章:maven属性
你可以在pom.xml文件或者资源文件中使用属性,资源文件被会Maven Resource插件的过滤特性处理。一个属性永远包含在${和}中。在任何Maven项目中都有一些隐式的属性,这些隐式的属性是:
1.project.*
Maven的项目对象模型(POM)。你可以使用该project.*前缀来引用任何在Maven的POM中的值。如:${project.artifactId}
2.settings.*
Maven Settings。你使用该settings.*前缀来引用~/.m2/settings.xml文件中Maven的 Settings的值。
3.env.*
环境变量如PATH和M2_HOME可以使用env.*前缀来引用。如:${env.M2_HOME}
4.系统属性
任何可以通过System.getProperty()方法获取的属性都可以作为Maven属性被引用。如:${java.version}
5.自定义属性
<project> ... <properties> <arbitrary.property.a>This is some text</arbitrary.property.a> <hibernate.version>3.3.0.ga</hibernate.version> </properties> ... <dependencies> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate</artifactId> <version>${hibernate.version}</version> </dependency> </dependencies> ... </project> |
第5章:常用插件
maven官网插件:http://maven.apache.org/plugins/
1.JDK編译插件
<!-- JDK編译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> |
2.源码打包插件
<!-- 源码打包插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> <version>2.1.2</version> <configuration> <attach>true</attach> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> |
3.jar包拷贝插件
<!-- 把依赖的jar包拷到lib目录下 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependency</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.basedir}/lib</outputDirectory> <overWriteReleases>true</overWriteReleases> <overWriteSnapshots>true</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> |
4. 版本打包插件
1.使用该插件必须先手动配置src/main/assembly/package.xml文件,配置例子如下:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>release</id> <formats> <format>tar.gz</format> <format>zip</format> </formats> <fileSets> <fileSet> <directory>bin</directory> <outputDirectory>/bin</outputDirectory> </fileSet> <fileSet> <directory>cfg</directory> <outputDirectory>/cfg</outputDirectory> </fileSet> </fileSets> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <useProjectArtifact>true</useProjectArtifact> </dependencySet> </dependencySets> </assembly> |
2.插件如下:
<!-- 版本打包 , 手动配置src/main/assembly/package.xml文件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.3</version> <configuration> <descriptors> <descriptor>src/main/assembly/package.xml</descriptor> </descriptors> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> |
3.该插件生成如下压缩包: