Apache Maven [‘meɪv(ə)n] 是一个软件项目管理和综合工具。基于项目对象模型(POM,Project Object Model)的概念,Maven可以从一个中心资料片管理项目构建,报告和文件。
1 安装
- 到Maven官方网站下载 Maven 的 zip 文件,如: apache-maven-3.3.3-bin.zip,解压。
- 添加环境变量
M2_HOME
和MAVEN_HOME
,并追加到环境变量PATH
中。
2 配置
2.1 Maven settings.xml
当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用settings.xml中的settings元素来确定这些配置。这包含了本地仓库位置,远程仓库服务器以及认证信息等。
settings.xml
存在于两个地方:
1.安装的地方:$M2_HOME/conf/settings.xml
2.用户的目录:${user.home}/.m2/settings.xml
前者又被叫做全局配置,后者被称为用户配置。如果两者都存在,它们的内容将被合并,并且用户范围的settings.xml
优先。
2.2 profile介绍
profile可以让我们定义一系列的配置信息,然后指定其激活条件。这样我们就可以定义多个profile,然后每个profile对应不同的激活条件和配置信息,从而达到不同环境使用不同配置信息的效果。
profile定义在pom.xml中。
Maven操作时,可以使用-P参数显式地指定当前激活哪一个profile。如
# 激活 develop profile
$ mvn package -P develop
# 查看当前牌激活状态的profile
$ mvn help:active-profiles
查看当前处于激活状态的profile
$ mvn help:active-profiles
3 中央存储库
Maven默认一个中央存储库:http://repo1.maven.org/maven2/
3.1 依赖库查询顺序:
Maven的依赖库查询顺序为:
- 在 Maven 本地资源库中搜索,如果没有找到,进入第 2 步,否则退出。
- 在 Maven 中央存储库搜索,如果没有找到,进入第 3 步,否则退出。
- 在 Maven 的远程存储库搜索,如果没有找到,提示错误信息,否则退出。
3.2 自定义的jar安装到本地资源库
例如,文件kaptcha-version.jar在C盘。则发出命令如下:
mvn install:install-file -Dfile=c:\kaptcha-{version}.jar -DgroupId=biz.superalloy -DartifactId=leonProfile -Dversion={version} -Dpackaging=jar
命令执行完成后,kaptcha-version.jar将被复制到Maven本地资源库。
安装完毕后,就在pom.xml中声明kaptcha的坐标。
<dependency>
<groupId>biz.superalloy</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3</version>
<dependency>
4 使用Maven创建Java项目
4.1 创建项目
mvn archetype:generate -DgroupId=biz.superalloy -DartifactId=myMvnProject -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
archetype:generate用来生成项目结构
FirstMvnProject
|-src
|---main
|-----java
|-------biz
|---------superalloy
|-----------App.java
|---test|-----java
|-------biz
|---------supealloy
|-----------AppTest.java
|-pom.xml
4.2 生成Eclipse项目
终端进入FirstMvnProject,键入以下命令使其成为一个Eclipse项目。
mvn eclipse:eclipse
以上命令会自动下载更新相关资源和配置信息(读取pom.xml文件),并产生 Eclipse IDE所要求的所有项目文件。
4.3 Maven打包
mvn package
命令会编译Maven项目,运行单元测试并打包项目成一个pom.xml中元素定义的文件。
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Maven 坐标 -->
<groupId>biz.superalloy</groupId>
<artifactId>FirstMvnProject</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 包元素定义打包时(mvn package)输出jar文件 -->
<packaging>jar</packaging>
<name>FirstMvnProject</name>
<url>http://maven.apache.org</url>
<!-- 依赖 -->
<dependencies>
<!-- 坐标从中心仓库查 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
5 使用Maven创建Web项目
5.1. 命令
mvn archetype:generate -DgroupId=biz.superalloy -DartifactId=FirstWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
5.2. Eclipse IDE支持
终端进入FirstWebApp,以下命令将项目转化为Eclipse项目,-Dwtpversion=2.0生成Wtp插件的Web项目
mvn eclipse:eclipse -Dwtpversion=2.0
注意,为方便起见,声明 maven-eclipse-plugin,并配置wtpversion 来避免输入参数 -Dwtpversion=2.0。现在,每次使用 mvn eclipse:eclipse,Maven将这个项目导入转换为 Eclipse Web 项目。
之前:
mvn eclipse:eclipse –> Eclipse Java project (JAR)
mvn eclipse:eclipse -Dwtpversion=2.0 –> Eclipse Java web project (WAR)
之后:
mvn eclipse:eclipse –> Eclipse Java web project (WAR)
6 Maven POM
POM代表项目对象模型(Project Object Model)。它是工作在Maven中的基本单位。这是一个XML文件。它始终保存在该项目基本目录中的pom.xml文件。
创建一个POM之前,我们应该先决定项目组(groupId),它的名字(artifactId)和版本(version),因为这些属性在项目仓库是唯一标识的。
例:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>biz.superalloy</groupId>
<artifactId>FirstWebApp</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>FirstWebApp</name>
<url>http://www.superalloy.biz</url>
</project>
应当指出,每个项目应该有一个单一的POM文件。
- 所有的POM文件要项目元素必须三个必填字段:groupId, artifactId, version
- 在库中的项目符号是:groupId:artifactId:version
- pom.xml的根元素是project,它有三个主要的子节点:
节点 | 描述 |
---|---|
groupId | This is an Id of project’s group.This is generally unique amongst an organization or a project. For example, a banking group com.company.bank has all bank related projects. |
artifactId | This is an Id of the project. This is generally name of the project. For example, consumer-banking. Along with the groupId, the artifactId defines the artifact’s location within the repository. |
version | This is the version of the project. Along with the groupId, It is used within an artifact’s repository to separate versions from each other. For example: com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1. |
6.1 超级POM
所有的POM继承自父类(尽管明确界定)。这个基础的POM被称为超级POM(superpom),并包含继承默认值。
通过以下命令显示**有效的**effective-pom。
mvn help:effective-pom
Maven3的超级POM位置:
${M2_HOME}/lib/maven-model-builder-version.jar
,打开该文件,能找到超级POM:\org\apache\maven\model\pom-4.0.0.xml
,它是所有Maven POM的父POM,所有Maven项目继承该配置。
7 Maven Web应用
7.1 创建
使用Maven原型-web应用插件。
mvn archetype:generate -DgroupId=biz.superalloy -DartifactId=MyWebApp -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
Maven会开始处理,并建立完整的基于Web的Java应用程序项目结构。
7.2 清空、编译、打包、安装到本地库
进入MyWebApp目录,执行下面命令
mvn clean install
Maven将开始建设项目。以上命令实际先后执行了四个命令。
mvn clean
mvn compile
mvn package
mvn install
Maven项目,在pom.xml中添加依赖后,需要更新依赖包才能引用
# -e 详细异常, -U 强制更新
mvn clean install -e -U
查看依赖树:
mvn dependency:tree
7.3 部署Web应用程序
复制创建的MyWebApp.war到web服务器(如tomcat)的webapp目录下,然后重新启动Web服务器。
7.4 测试Web应用程序
使用URL运行Web应用程序:http://localhost:8080/MyWebApp/index.jsp (htt://:/MyWebApp/index.jsp)验证输出。
8. Eclipse集成Maven
Eclispe提供了一个插件m2eclipse无缝将Maven和Eclipse集成在一起。
8.1 Eclipse版本Luna Service Release 2 (4.4.2)和Mars.2 Release (4.5.2)都自动集成了m2eclipse插件。
从Help -> Install New Software -> already installed弹窗中可以看到Installled Software。
8.2 较低版本的Eclipse需要手动安装m2e插件
eclipse安装插件的方法为:
Help -> Install New Software弹窗
在弹窗的Work with:中键入“Available Software Sites”,键入Site后,下面会自动扫描中可用的插件,选择想要的进行安装。
可用站点(Available Software)可以从Windows -> Preferences -> Install/Update -> Available Software中添加更多的可用站点。要注意站点上的插件与eclipse版本的兼容性。
关于eclipse,可以从http://www.eclipse.org/downloads/packages/下载不同版本的包,目前已测试确认,Neon版本需要JDK8支持,Luna和Mars可以使用JDK7.
8.3 Eclipse集成Maven成功后的表现
1.可以新建和导入maven项目;
2.右击maven项目 -> properties -> Java Build Path -> Libraries可以看到eclipse已经添加maven的依赖关系;
3.运行Maven命令: 右击maven项目 -> Debug As -> Maven ** ,点击Maven build…在Goals中可以创建新的命令。
8.4 构建Maven 项目
File -> New -> Ohter -> Maven -> Maven Project -> Catalog:Internal, Filter:webapp, 选择maven-archetype-webapp
右击项目 -> properites -> Project Facets可以看到项目为web2.3 java1.5 要想修改成为我们需要的版本,
通过打开
appname/.settings/org.eclipse.wst.common.project.facet.core.xml
进行
修改前:
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="java" version="1.5"/>
<installed facet="jst.web" version="2.3"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>
可以改为:
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<runtime name="Apache Tomcat v7.0"/>
<fixed facet="wst.jsdt.web"/>
<fixed facet="jst.web"/>
<fixed facet="java"/>
<installed facet="wst.jsdt.web" version="1.0"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="java" version="1.7"/>
</faceted-project>
但是这里特别要注意web版本与tomcat的兼容性,Tomcat7.0不支持Dynamic Web Module3.1,仅支持3.0及以下,3.1的war文件不能通过eclipse加载到tomcat7服务器上。
9 转换基于Maven的Web应用支持Eclipse IDE
9.1 执行命令mvn eclipse:eclipse -Dwtpversion=1.5
一般的Java项目,使用
mvn eclipse:eclipse
对于Web应用程序,需要额外的参数,使其支持Eclipse WTP,应该使用
mvn eclipse:eclipse -Dwtpversion=2.0
mvn eclipse:eclipse命令会重写pom.xml。
标准Eclipse的.classpath
和 .project
文件被创建。还有一个新的 .setting
文件夹,里面包含两个文件 org.eclipse.wst.common.component
和 org.eclipse.wst.common.project.facet.core.xml
,用来支持Eclipse。
org.eclipse.wst.common.component
<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
<wb-module deploy-name="MyWebApp">
<wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
<wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
<property name="context-root" value="MyWebApp"/>
<property name="java-output-path" value="/MyWebApp/target/classes"/>
</wb-module>
</project-modules>
org.eclipse.wst.common.project.facet.core.xml
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="wst.jsdt.web"/>
<installed facet="java" version="1.5"/>
<installed facet="jst.web" version="2.3"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>
9.2 导入到Eclipse IDE
步骤:
File -> General -> Existing Projects into Workspace -> Select root directory框中选择根路径-> 然后在上面Projects:中会列出根路径下的所有项目 -> 勾选项目后Finish。
9.3 特别注意点:
- 上述操作顺序不能错,一个干净的Maven Web应用从远程仓库克隆到本地后,先终端切到项目根路径下执行命令mvn eclipse:eclipse -Dwtpversion=1.5,然后再进行导入,上述导入时要注意导入“Existing Projects into Workspace”,不可以是别的具体类型项目,因为后面通过编译将其确定为Web应用。
- 命令参数-Dwtpversion可以等于1.5也可以等于2.0,决定了Eclipse WTP的版本,实践中注意版本区别和与Eclipse版本的兼容性。
- 导入之后要使其运行,还必须有下面重要的有顺序的两步:
- 第一先编译,右击主项目 -> Debug As -> Debug Configurations -> Maven Build 中执行 mvn clean package命令进行清除、编译、打包。
- 第二是发布,右击server -> publish 发布之后,服务器会自动启动部署,完成后服务器关闭。
以上正常后,就可以手动启动server运行了。
10 部署基于Maven的War文件到Tomcat
10.1 Tomcat认证
在tomcat-users.xml中添加manager权限
%TOMCAT_PATH%/conf/tomcat-users.xml
<tomcat-users>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="password" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
</tomcat-users>
10.2 Maven的Server配置
在settings.xml(先读~/.m2/settings.xml)中配置server(id可以任意填写,但username和password必须tomcat-users.xml一致):
~/.m/settings.xml
%M2_HOME%/conf/settings.xml
<server>
<id>tomcat7</id>
<username>admin</username>
<password>password</password>
</server>
10.3 在Web项目的pom.xml文件的节点中,添加tomcat7的maven插件
<plugin>
节点必须放在<build>
下。
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 注意此处的url -->
<url>http://localhost:8080/manager/text</url>
<server>tomcat7</server><!-- 此处的名字必须和setting.xml中配置的ID一致 -->
<path>/ThirdWebApp</path><!-- 此处的名字是项目发布的工程名-->
</configuration>
</plugin>
</plugins>
</build>
10.4 发布到Tomcat命令
以下命令用来操纵Tomcat War 文件(必须事先启动Tomcat服务器)。
mvn tomcat7:deploy
mvn tomcat7:undeploy
mvn tomcat7:redeploy
注意:
- 是mvn tomcat7:deploy,不是mvn tomcat:deploy
- 执行以上命令时,必须先启动tomcat
- 当执行mvn undeploy,出现:
[INFO] FAIL - Unable to delete [D:\apache-tomcat-7.0.57\webapps\ThirdWebApp]. The continued presence of this file may cause problems.
解决如下(From stackoverflow):
This is very common in Windows environment but there is a solution :
Open context.xml from /tomcat/conf folder and modify the context to match this :
<Context antiResourceLocking="true">
11 一些Maven命令
# 下载依赖库的源码包
mvn dependency:sources
# 查看maven项目的依赖
mvn dependency:tree