简介
Apache Maven是一个软件项目管理和理解工具。基于项目对象模型(POM)的概念,Maven可以从一个中央信息管理项目的构建,报告和文档的软件项目管理工具。
Apache Maven一个潜在的基于java的Apache Ant的构建工具的替代者。ant脚本是可以直接运行在maven中的。maven和ant最大的差别就是在于maven的编译以及所有的脚本都有一个基础,就是POM(project object model),这个模型定义了项目的方方面面,然后各式各样的脚本在这个模型上工作,而ant完全是自己定义。
Maven它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期,一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
Maven主要做的是两件事:
1.统一开发规范与工具
1.统一管理jar包
Maven的安装
安装maven超级简单,总共分三步:
- 下载 Maven ,其实就是一个压缩包,解压一下。下载地址
1、bin目录
包含了mvn运行的脚本,bat结尾的是windows批处理脚本
2、boot目录
只有一个文件 plexus-classworlds-2.5.2.jar,是一个类加载器框架,Maven使用他加载自己的类库。
3、conf目录
settings.xml 文件
4、lib目录
Maven运行时需要的Java类库
- 配置一下环境变量
有两个环境变量可以配置:
MAVEN_HOME = 你自己的Maven安装地址
在path变量末尾加入“%MAVEN_HOME%\bin;”
如果想让 Maven 跑得更快点,可以根据自己的情况来设置 MAVEN_OPTS
MAVEN_OPTS = -Xms128m -Xmx512m(可选)
- 最后,验证是否安装成功
现在我们打开 cmd,输入:
mvn -v
Maven 安装成功!
了解Maven仓库
使用 Maven 给我们带来的最直接的好处,就是统一管理jar 包,那么这些 jar 包存放在 本地仓库 中,默认地址位于 C:\Users\用户名.m2 目录下(当然也可以修改这个默认地址,当我们第一次输入mvn -v ,maven会在用户目录创建一个.m2的目录,这个是maven的本地仓库。)
我们可以将本地仓库理解“缓存”,目的是存放jar包。开发项目时项目首先会从本地仓库中获取 jar 包,当无法获取指定 jar 包的时候,本地仓库会从 远程仓库(或 中央仓库) 中下载 jar 包,并“缓存”到本地仓库中以备将来使用。
远程仓库(中央仓库)是 Maven 官方组织公布在互联网上的一个站点,里面收录了目前绝大多数主流的jar包,可通过 http://search.maven.org/ 来访问。这样一来,本地仓库会随着项目的积累越来越大。
Nexus是Maven仓库管理器,也可以叫Maven的私服,搭建私服可以加快构建速度,减少节省外网带宽。
修改本地仓库位置配置
本地仓库,在执行第一次mvn -v是会默认在用户文件夹生成.m2文件夹,我们可以通过maven的安装目录下面的conf文件夹里面的settings.xml来改变
依据该配置,Maven就会将下载的类库保存到D:\maven\repository中
为了保持核心的配置文件不变,我们可以将settings.xml文件拷贝到.m2目录下面。以后只要对这个文件做修改就可以了,maven会优先读取.m2下面的配置文件。(可选)
Eclipse的Maven项目
Eclipse安装Maven
打开eclipse,菜单“Help”-“Install New Software...”
在Work with 地址栏输入:http://download.eclipse.org/releases/oxygen (注意:oxygen是eclipse对应的版本名称),稍等片刻
配置Maven
Window --> Preferences
点击 Add 按钮,添加本地 maven 的安装路径值
点击 Browse 按钮,选到你 maven 的 setting.xml 配置文件
Eclipse的创建 Maven项目
选择新建项目,下载Maven项目
groupId、artifactId、version确定一个唯一的Maven
1、groupId
顾名思义,这个应该是公司名或是组织名。一般来说groupId是由三个部分组成,每个部分之间以"."分隔,第一部分是项目用途,比如用于商业的就是"com",用于非营利性组织的就 是"org";第二部分是公司名,比如"tengxun"、"baidu"、"alibaba";第三部分是你的项目名
2、artifactId
可以认为是Maven构建的项目名,比如你的项目中有子项目,就可以使用"项目名-子项目名"的命名方式
3、version
版本号,SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本。在Maven中很重要的一点是,groupId、artifactId、version三个元素生成了一个Maven项目的基本坐标,这非常重要,我在使用和研究Maven的时候多次感受到了这点。
4、packing
项目打包的类型,可以使jar、war、rar、ear、pom,默认是jar
Maven项目的标准目录
src
-main
–bin 脚本库
–java java源代码文件
–resources 资源库,会自动复制到classes目录里
–filters 资源过滤文件
–assembly 组件的描述配置(如何打包)
–config 配置文件
–webapp web应用的目录。WEB-INF、css、js等
-test
–java 单元测试java源代码文件
–resources 测试需要用的资源库
–filters 测试资源过滤库
-site Site(一些文档)
target
-classes 项目主体输出目录
-test-classes项目测试输出目录
-site 项目site输出目录
工程根目录下就只有src和target两个目录
target是有存放项目构建后的文件和目录,jar包、war包、编译的class文件等
target里的所有内容都是maven构建的时候生成的
框中的src/main/java
和src/test/java
还有src/main/resources
和src/test/resources
其实就是src
里面的内容,只是为了开发方便调试,引用出来。
Maven pom.xml配置详解
新建的maven项目的pom.xml配置如下:
POM基础
1.Maven的声明
2.POM的关系,依赖,继承,模块, 属性
3.构建
4.报告
5.项目详细信息
6.环境设置
Maven命令
- 创建Maven的普通java项目:
mvn archetype:create -DgroupId=packageName -DartifactId=projectName - 创建Maven的Web项目:
mvn archetype:create -DgroupId=packageName -DartifactId=webappName-DarchetypeArtifactId=maven-archetype-webapp - 编译源代码: mvn compile
- 编译测试代码:mvn test-compile
- 运行测试:mvn test
- 产生site:mvn site
- 打包:mvn package
- 在本地Repository中安装jar:mvn install
- 清除产生的项目:mvn clean
- 生成eclipse项目:mvn eclipse:eclipse
- 生成idea项目:mvn idea:idea
- 组合使用goal命令,如只打包不测试:mvn -Dtest package
- 编译测试的内容:mvn test-compile
- 只打jar包: mvn jar:jar
- 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
( -skipping 的灵活运用,当然也可以用于其他组合命令) - 清除eclipse的一些系统设置:mvn eclipse:clean
POM的关系补充说明
parent
父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是../pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom。
parent使用dependencyManagement定义依赖关系
继承自该项目的所有子项目的默认依赖信息。这部分的依赖信息不会被立即解析,而是当子项目声明一个依赖(必须描述groupID和artifactID信息),如果groupID和artifactID以外的一些信息没有描述,则通过groupID和artifactID匹配到这里的依赖,并使用这里的依赖信息。
......
modules
模块是这个POM列出的项目,并作为一个组来执行,不需要考虑模块间依赖关系。一个POM打包的项目可以通过将它们列为模块来集合一组项目的构建,这些模块是目录的相对路径或这些项目的POM文件。 (Ps:继承和模块的区别:继承父不知子,但子知父。模块父知子,但子不知父。所以在具体的项目中一般都是继承和模块融合使用)
properties
值 someVar> properties>的值作为$ {someVar}
Maven属性是值占位符,就像Ant中的属性一样。它们的值可以在POM中的任何地方通过使用符号${properties}来访问,或者它们可以被插件用作默认值
4.0.0
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
一个典型的pom.xml文件配置如下:
4.0.0
com.winner.trade
trade-core
1.0.0-SNAPSHOT
jar
...
com.winner.trade
trade-test
1.0.0-SNAPSHOT
test
false
org.slf4j
slf4j-api
UTF-8
1.5
1.5
...
构建配置
myPorjectName
${basedir}/target
install
../filter.properties
resources
true
src/main/resources
**/*.properties
**/*.xml
jdbc.properties
${basedir}\src\main\java
${basedir}\src\main\scripts
${basedir}\src\test\java
${basedir}\target\classes
${basedir}\target\test-classes
org.apache.maven.wagon
wagon-ssh
2.8
maven-assembly-plugin
2.5.5
assembly
package
single
false
${finalName}
false
assembly.xml
false
...
true
...
报告
http://java.sun.com/j2se/1.5.0/docs/api/
sunlink
javadoc
项目信息配置
banseon-maven
http://www.clf.com/
A maven project to study maven.
Demo
[email protected]
[email protected]
[email protected]
http:/hi.clf.com/
HELLO WORLD
banseon
[email protected]
Project Manager
Architect
demo
http://hi.clf.com/
No
-5
Apache 2
http://www.clf.com/LICENSE-2.0.txt
repo
Abusiness-friendly OSS license
scm:svn:http://svn.baidu.com/banseon/maven/
scm:svn:http://svn.baidu.com/banseon/maven/
http://svn.baidu.com/banseon
demo
http://www.clf.com/
分发配置
true
repo-id
repo-name
file://${basedir}/target/deploy
site-id
site-name
scp://svn.baidu.com/banseon:/var/www/localhost/banseon-web
仓库
repo-id
repo-name
http://192.168.1.169:9999/repository/
default
profile配置
false
1.7
Windows XP
Windows
x86
5.1.2600
mavenVersion
2.0.3
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/
POM 4.0的一个新功能是项目能够根据所在的环境来改变设置,profile元素包含两个任选的活化(轮廓触发器)和设定变化的向POM制成如果所选择的文档已被激活。例如,为测试环境构建的项目可能会指向与最终部署不同的数据库。或者依赖关系可以根据所使用的JDK版本从不同的存储库中提取。
profile配置项在setting.xml中也有,是pom.xml中profile元素的裁剪版本,包含了id,activation, repositories, pluginRepositories和 properties元素。这里的profile元素只包含这五个子元素是因为setting.xml只关心构建系统这个整体(这正是settings.xml文件的角色定位),而非单独的项目对象模型设置。如果一个settings中的profile被激活,它的值会覆盖任何其它定义在POM中或者profile.xml中的带有相同id的profile。
pom.xml中的profile可以看做pom.xml的副本,拥有与pom.xml相同的子元素与配置方法。它包含可选的activation(profile的触发器)和一系列的changes。例如test过程可能会指向不同的数据库(相对最终的deployment)或者不同的dependencies或者不同的repositories,并且是根据不同的JDK来改变的。只需要其中一个成立就可以激活profile,如果第一个条件满足了,那么后面就不会在进行匹配。
环境配置
jira
http://jira.clf.com/