Maven in 5 Minutes Maven实战 Maven中央仓库 maven概念 pom元素描述
1.下载安装maven,解压缩后,设置环境变量M2_HOME到maven目录;在path中增加maven的bin目录。
命令行输入mvn -version验证是否安装成功
linux下安装时先检查以前是否有过IDE内嵌安装,whereis mvn
若存在mvn: /usr/bin/mvn /opt/apache-maven-3.0.4/bin/mvn /usr/share/man/man1/mvn.1.gz则重新创建链接到/usr/bin下:
ln -s /opt/apache-maven-3.0.4/bin/mvn /usr/bin/mvn
#MAVEN
export M2_HOME=/opt/apache-maven-3.0.4
export M2=$M2_HOME/bin
export MAVEN_OPTS="-Xms256m -Xmx512m"
export PATH=$M2:$PATH
复制 M2_HOME/conf/settings.xml 文件到~/.m2/settings.xml
2.网络设置
maven运行时需要网络环境。如果需要网络代理,则在maven安装目录下conf/settings.xml中找到<proxies>节点进行设置
3.在命令行中输入你要创建的工程:
mvn archetype:create -DgroupId=com.cms -DartifactId=cms
若运行成功则生成:
cms
├─pom.xml
├─src
└─main
└─java
└─com
└─cms
└─App.java
└─test
└─java
└─com
└─cms
└─AppTest.java
mvn package默认打包生成的 jar 是不能够直接运行的,因为带有 main 方法的类信息不会添加到 manifest中,生成可执行的 jar 文件,我们需要借助 maven-shade-plugin,配置该插件如下:
<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.cms</groupId> <artifactId>cms</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>cms</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.cms.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
再执行mvn package可看到cms-1.0-SNAPSHOT.jar、original-cms-1.0-SNAPSHOT.jar,前 者 是 带 有Main-Class 信息的可运行 jar,后者是原始的 jar
执行java -jar target\cms-1.0-SNAPSHOT.jar
4.maven坐标包括groupId、artifactId、version、packaging、classifier
maven:"groupId=org.testng;artifactId=testng;version=5.8;classifier=jdk15"
groupId:隶属的实际项目名与包名类似
artifactId:实际项目中的一个模块名即实际项目名
version:项目的版本
packaging[可选]:项目打包方式,默认jar
classifier[可选]:帮助定义构建输出的一些附属构件,附属构件与主构件对应,不能直接定义项目的classifier因为附属构件不是项目直接默认生成的而是由附加的插件帮助生成
5.基于spring framework的account-email实例的pom :
mvn archetype:create -DgroupId=com.cms.account -DartifactId=account-email
<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.cms.account</groupId> <artifactId>account-email</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Account Email</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> #以下为spring依赖注入必要库 <artifactId>spring-core</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-support</artifactId> <version>2.5.6</version> </dependency> <dependency> <groupId>javax.mail</groupId> #邮件实现支持库 <artifactId>mail</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.7</version> <scope>test</scope> </dependency> <dependency> <groupId>com.icegreen</groupId> #开源邮件服务测试套件 <artifactId>greenmail</artifactId> <version>1.3.1b</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> #开启java5支持 <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project>
6.maven命令:
命令行输入mvn -h ,显示mvn帮助,其中usage: mvn [options] [<goal(s)>] [<phase(s)>]表明了mvn命令的结构。options:可选的参数,goal(s): 表示maven构建的“目标”,Phase(s):阶段-表示maven构建生命周期
7.maven会执行生命周期中该阶段之前的所有命令:
- validate: 验证项目是否正确以及相关信息是否可用
- compile: 编译
- test: 通过junit进行单元测试
- package: 根据事先指定的格式(比如jar),进行打包
- integration-test: 部署到运行环境中,准备进行集成测试
- verify: 对包进行有效性性和质量检查
- install: 安装到本地代码库
- deploy: 在集成或发布环境,将包发布到远程代码库
在“默认”的生命周期之外,还有两个“阶段”:
- clean: 清除以前的构建物。
- site: 生成项目文档
8.pom.xml 文件基本节点介绍
<modelversion > : pom.xml 使用的对象模型版本
<groupId > :创建项目的组织或团体的唯一 Id
<artifactId > :项目的唯一 Id, 可视为项目名
<packaging > :打包物的扩展名,一般有 JAR,WAR,EAR 等
<version > :产品的版本号
<name > :项目的显示名,常用于 Maven 生成的文档
<url > :组织的站点,常用于 Maven 生成的文档
<de.ion > :项目的描述,常用于 Maven 生成的文档
9.常用命令
mvn archetype:create :创建 Maven 项目 mvn compile :编译源代码 mvn test-compile :编译测试代码 mvn test : 运行应用程序中的单元测试 mvn site : 生成项目相关信息的网站 mvn clean :清除目标目录中的生成结果 mvn package : 依据项目生成 jar 文件 mvn install :在本地 Repository 中安装 jar mvn eclipse:eclipse :生成 Eclipse 项目文件 mvn -Dwtpversion=1.0 eclipse:eclipse : 生成Wtp插件的Web项目 mvn -Dwtpversion=1.0 eclipse:clean : 清除Eclipse项目的配置信息(Web项目) mvn eclipse:clean : 清除eclipse的一些系统设置 mvn idea:idea : 生成Intellij idea项目文件 mvn jar:jar : 只打包jar mvn test -skipping compile -skipping test-compile : 只测试而不编译,也不测试编译 mvn jetty:run : 运行项目于jetty上 mvn -e : 显示详细错误信息 建一个 JAVA 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=demo 建一个 web 项目 : mvn archetype:create -DgroupId=com.demo -DartifactId=web-demo -DarchetypeArtifactId=maven-archetype-webapp Eclipse WTP 项目执行 : mvn eclipse:eclipse –Dwtpversion=1.0 ( wtp1.0 以上版本均可用)
一般使用情况是这样,首先通过cvs或svn下载代码到本机,然后执行mvn eclipse:eclipse生成ecllipse项目文件,然后导入到eclipse就行了;修改代码后执行mvn compile或mvn test检验,也可以下载eclipse的maven插件。更改Maven缺省的本地仓库地址:修改${user.home}/.m2/settings.xml
<settings> ... <localRepository>/opt/maven/repository</localRepository> ... </settings>
10.依赖范围
compile默认范围-编译、测试、运行三种classpath都有效,如spring-core
test只对测试classpath有效,如Junit
provided对编译、测试classpath有效,如servlet-api
runtime对测试、运行classpath有效,如JDBC驱动
system对编译、测试classpath有效,使用本地库(maven仓库之外的类库文件)与本机系统绑定,可能造成不可移植,可引用环境变量
import不会对编译、测试、运行三种classpath产生影响
11.依赖传递性
compile | test | provided | runtime | |
compile | √ | - | √ | - |
test | √ | √ | √ | √ |
provided | √ | - | - | - |
runtime | √ | - | - | √ |
路径最近者优先
A->B->C->X(1.0) A->D->X(2.0) 使用X2.0
第一声名者优先
A->B->Y(1.0) A->C->Y(2.0) 使用Y1.0
12.可选依赖
A->B、B->X(可选)、B->Y(可选) X、Y不会对A有任何影响
例如B是一个持久层隔离工具包,支持MongoDB、postgresql,在构建这个工具包时,需要这两种数据库驱动,但在使用这个工具包时只会依赖其中一种
<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.b</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>casbah_2.9.2</artifactId>
<version>2.4.1</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.account</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.cms.b</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901-1.jdbc4</version>
</dependency>
</dependencies>
</project>
13.最佳实践
传递依赖会给项目隐式的引入很多依赖,这简化了项目依赖的管理,但有时会带来问题,如项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOT版本,而SNAPSHOT的不稳定性会直接影响当前的项目,这时就需要排除该SNAPSHOT
排除传递性依赖:
A->B,由于一些原因B不想引入传递性依赖C而是自身显式地声名对项目C1.1.0的依赖
<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.account</groupId>
<artifactId>project-a</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>com.cms.b</groupId>
<artifactId>project-b</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions> #排除依赖
<exclusion>#不需要version元素
<groupId>com.cms.c</groupId>
<artifactId>project-c</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.cms.c</groupId>
<artifactId>project-c</artifactId>
<version>1.1.0</version>
</dependency>
</dependencies>
</project>
14.归类依赖
#env.X:引用环境变量${env.PATH} #project.x:.表示路径将包含相应的元素的值。例如:<project><version>1.0</version></project>可以通过${project.version}访问 #settings.x:.表示路径将包含相应的元素的值。例如:<settings><offline>false</offline></settings>可以通过${settings.offline}访问 #Java System Properties:可通过java.lang.System.getProperties()访问的所有属性都都可用作POM属性,如${java.home}
#pom中<properties/>下的<someVar>元素可直接${someVar}引用
<project...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.cms.account</groupId>
<artifactId>account-email</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-support</artifactId>
<version>${springframework.version}</version>
</dependency>
</dependencies>
</project>
15.优化依赖
已解析依赖列表mvn dependency:list
已解析依赖树mvn dependency:tree
已解析依赖分析(只会分析编译和测试需要的依赖)mvn dependency:analyze