本节介绍几个maven常用的命令,以备遗忘时可以查看。
mvn -version 查看maven的版本及配置信息
mvn archetype:create -DgroupId= DartifactId= 构建java项目
mvn archetype:create -DgroupId= DartifactId= -DarchetypeArtifactId=maven-archetype-webapp 创建web项目
mvn compile 编译项目代码
mvn package 打包项目
mvn package -Dmaven.test.skip=true 打包项目时跳过单元测试
mvn test 运行单元测试
mvn clean 清除编译产生的target文件夹内容,可以配合相应命令一起使用,如mvn clean package, mvn clean test
mvn install 打包后将其安装在本地仓库
mvn deploy 打包后将其安装到pom文件中配置的远程仓库
mvn eclipse:eclipse 将maven生成eclipse项目结构
mvn eclipse:clean 清除maven项目中eclipse的项目结构
mvn site 生成站点目录
mvn dependency:list 显示所有已经解析的所有依赖
mvn dependency:tree 以树的结构展示项目中的依赖
mvn dependency:analyze 对项目中的依赖进行分析,依赖未使用,使用单未引入
mvn dependency:analyze -DfailOnWarning=true 对项目中的依赖进行分析,未使用的依赖项或未声明的已使用依赖项时,输出中都会显示警告
跳过测试的运行:你可以用mvn package -DskipTests=true。或者,您可以将该属性缩短为-DskipTests.
跳过测试的编译和运行(不建议):你可以用mvn package -Dmaven.test.skip=true。你可以把财产缩短到-Dmaven.test.skip.
调试单元测试:你可以用mvn package -Dmaven.surefire.debug.
调试集成测试:你可以用mvn package -Dmaven.failsafe.debug.
mvn tomcat:run 启动tomcat
mvn clean install 构建项目
mvn clean dependency:copy-dependencies package 清理和打包
处理并显示清理生命周期的所有阶段: mvn post-clean
介绍
POM代表项目对象模型。它是 Maven 中工作的基本单位,这是一个 XML 文件。它始终保存在该项目基本目录中的 pom.xml
文件。
POM 包含的项目是使用 Maven 来构建的,它用来包含各种配置信息。
POM 也包含了目标和插件。在执行任务或目标时,Maven 会使用当前目录中的 POM。它读取POM得到所需要的配置信息,然后执行目标。部分的配置可以在 POM 使用如下:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
- mailing list
创建一个POM之前,应该要先决定项目组(groupId),它的名字(artifactId)和版本,因为这些属性在项目仓库是唯一标识的。
POM的例子
<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.yiibai.project-group</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<project>
XML
要注意的是,每个项目只有一个POM文件。
- 所有的 POM 文件要项目元素必须有三个必填字段:
groupId
,artifactId
,version
- 在库中的项目符号是:
groupId:artifactId:version
- pom.xml 的根元素是
project
,它有三个主要的子节点。
节点 | 描述 |
---|---|
groupId | 这是项目组的编号,这在组织或项目中通常是独一无二的。 例如,一家银行集团com.company.bank 拥有所有银行相关项目。 |
artifactId | 这是项目的ID。这通常是项目的名称。 例如,consumer-banking 。 除了groupId 之外,artifactId 还定义了artifact 在存储库中的位置。 |
version |
这是项目的版本。与groupId 一起使用,artifact 在存储库中用于将版本彼此分离。 例如:com.company.bank:consumer-banking:1.0 ,com.company.bank:consumer-banking:1.1 |
超级POM
所有的POM继承自父类(尽管明确界定)。这个基础的 POM 被称为超级 POM,并包含继承默认值。 Maven使用有效的POM(超级POM加项目配置的配置)执行有关目标。它可以帮助开发人员指定最低配置的详细信息写在 pom.xml
中。虽然配置可以很容易被覆盖。 一个简单的方法来看看超级POM的默认配置,通过运行下面的命令:mvn help:effective-pom
创建一个 pom.xml
。 在下面的例子中,已经创建了一个 pom.xml
在C:\MVN\
项目文件夹中。 现在,打开命令控制台,进入包含 pom.xml
文件夹并执行以下 mvn
命令。
C:\MVN\project> mvn help:effective-pom
Maven将开始处理,并显示有效的 effective-pom
。
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'help'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.project-group:project-name:jar:1.0
[INFO] task-segment: [help:effective-pom] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] [help:effective-pom {execution: default-cli}]
[INFO]
.....
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Thu Jul 05 11:41:51 IST 2012
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------
在控制台显示结果:有效POM,继承,插值,应用配置文件。
生命周期
构建生命周期阶段的目标是执行顺序是一个良好定义的序列。
这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段:
阶段 | 处理 | 描述 |
---|---|---|
准备资源 | 资源复制 | 资源复制可以进行定制 |
编译 | 执行编译 | 源代码编译在此阶段完成 |
包装 | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
安装 | 安装 | 这一阶段在本地/远程Maven仓库安装程序包 |
默认(或生成)生命周期
这是 Maven 主要的生命周期,用于构建应用程序。它有以下 23 个阶段。
生命周期阶段 | 描述 |
---|---|
validate | 验证项目是否正确,并且所有必要的信息可用于完成构建过程 |
initialize | 建立初始化状态,例如设置属性 |
generate-sources | 产生任何的源代码包含在编译阶段 |
process-sources | 处理源代码,例如,过滤器值 |
generate-resources | 包含在包中产生的资源 |
process-resources | 复制和处理资源到目标目录,准备打包阶段 |
compile | 编译该项目的源代码 |
process-classes | 从编译生成的文件提交处理,例如:Java类的字节码增强/优化 |
generate-test-sources | 生成任何测试的源代码包含在编译阶段 |
process-test-sources | 处理测试源代码,例如,过滤器任何值 |
test-compile | 编译测试源代码到测试目标目录 |
process-test-classes | 处理测试代码文件编译生成的文件 |
test | 运行测试使用合适的单元测试框架(JUnit) |
prepare-package | 执行必要的任何操作的实际打包之前准备一个包 |
package | 提取编译后的代码,并在其分发格式打包,如JAR,WAR或EAR文件 |
pre-integration-test | 完成执行集成测试之前所需操作。例如,设置所需的环境 |
integration-test | 处理并在必要时部署软件包到集成测试可以运行的环境 |
pre-integration-test | 完成集成测试已全部执行后所需操作。例如,清理环境 |
verify | 运行任何检查,验证包是有效的,符合质量审核规定 |
install | 将包安装到本地存储库,它可以用作当地其他项目的依赖 |
deploy | 复制最终的包到远程仓库与其他开发者和项目共享 |
有涉及到Maven 生命周期值得一提几个重要概念:
-
当一个阶段是通过 Maven命令调用,例如:mvn compile,只有阶段到达并包括这个阶段才会被执行。
-
不同的 Maven 目标绑定到 Maven生命周期的不同阶段这是这取决于包类型(JAR/WAR/EAR)。
Maven多模块项目
Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。
项目结构如下:
test-hd-parent (父级)
---pom.xml
---test-hd-api (第三方接口层)
----pom.xml
---test-hd-foundation (基础工具层)
----pom.xml
---test-hd-resource (资源层)
----pom.xml
---test-hd-service (逻辑业务层)
----pom.xml
---test-hd-modules (web层)
----pom.xml
---test-hd-www (web模块1)
----pom.xml
---test-hd-admin (web模块2)
----pom.xml
创建一个父maven工程
- 新建一个maven项目,选择存储位置,并选择创建一个简单的maven工程
- 输入Group Id、Artifact Id、Packaging,packaging选择pom包
- 生成父工程,pom.xml如下
- 删除工程中的src 目录
创建子模块
- 右击父工程名---》New---》Project,然后选择新建一个maven module工程
- 设置子工程名以及父工程,再设置快速创建模式
- 得到子工程(test-hd-api,第三方接口层),设置编译的jdk
- 同理设置,子模块:test-hd-foundation(基础工具层)、test-hd-resource(资源层) 、test-hd-service(逻辑业务层)
- 新建test-hd-modules (web层),选择创建一个a simple project,输入Group Id、Artifact Id、Packaging,packaging选择pom包
创建web子模块
- web子模块在建在test-hd-modules (web层)里面,右击test-hd-modules 工程名---》New---》Project,然后选择新建一个maven module工程,设置子工程名以及父工程,选择新建web项目
- 配置maven web项目,参照:【Maven】Eclipse 使用Maven创建Java Web项目
- 同理可以配置其他的web子模块 test-hd-admin(web模块2)
配置个模块的依赖
- 在parent项目pom.xml中建立依赖管理(dependencyManagement)
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 2 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 3 <modelVersion>4.0.0</modelVersion> 4 <groupId>com.hd</groupId> 5 <artifactId>test-hd-parent</artifactId> 6 <version>0.0.1-SNAPSHOT</version> 7 <packaging>pom</packaging> 8 <modules> 9 <module>test-hd-api</module> 10 <module>test-hd-service</module> 11 <module>test-hd-resource</module> 12 <module>test-hd-foundation</module> 13 <module>test-hd-modules</module> 14 </modules> 15 16 17 <!-- maven依赖 --> 18 <dependencyManagement> 19 20 <dependencies> 21 <!-- hd --> 22 <dependency> 23 <groupId>com.hd</groupId> 24 <artifactId>test-hd-api</artifactId> 25 <version>0.0.1-SNAPSHOT</version> 26 </dependency> 27 28 <dependency> 29 <groupId>com.hd</groupId> 30 <artifactId>test-hd-service</artifactId> 31 <version>0.0.1-SNAPSHOT</version> 32 </dependency> 33 34 <dependency> 35 <groupId>com.hd</groupId> 36 <artifactId>test-hd-resource</artifactId> 37 <version>0.0.1-SNAPSHOT</version> 38 </dependency> 39 40 <dependency> 41 <groupId>com.hd</groupId> 42 <artifactId>test-hd-foundation</artifactId> 43 <version>0.0.1-SNAPSHOT</version> 44 </dependency> 45 46 <!-- Servlet --> 47 <dependency> 48 <groupId>javax.servlet</groupId> 49 <artifactId>javax.servlet-api</artifactId> 50 <version>3.0.1</version> 51 <scope>provided</scope> 52 </dependency> 53 <dependency> 54 <groupId>javax.servlet.jsp</groupId> 55 <artifactId>jsp-api</artifactId> 56 <version>2.2</version> 57 <scope>provided</scope> 58 </dependency> 59 60 <!-- jstl --> 61 <dependency> 62 <groupId>javax.servlet</groupId> 63 <artifactId>jstl</artifactId> 64 <version>1.2</version> 65 </dependency> 66 67 <dependency> 68 <groupId>taglibs</groupId> 69 <artifactId>standard</artifactId> 70 <version>1.1.2</version> 71 </dependency> 72 73 <dependency> 74 <groupId>junit</groupId> 75 <artifactId>junit</artifactId> 76 <version>3.8.1</version> 77 <scope>test</scope> 78 </dependency> 79 80 </dependencies> 81 </dependencyManagement> 82 83 </project>
- test-hd-foundation中的依赖
1 <?xml version="1.0"?> 2 <project 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 4 xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 5 <modelVersion>4.0.0</modelVersion> 6 <parent> 7 <groupId>com.hd</groupId> 8 <artifactId>test-hd-parent</artifactId> 9 <version>0.0.1-SNAPSHOT</version> 10 </parent> 11 <artifactId>test-hd-foundation</artifactId> 12 13 <dependencies> 14 15 <!-- servlet --> 16 <dependency> 17 <groupId>javax.servlet</groupId> 18 <artifactId>jstl</artifactId> 19 </dependency> 20 21 <dependency> 22 <groupId>taglibs</groupId> 23 <artifactId>standard</artifactId> 24 </dependency> 25 26 <dependency> 27 <groupId>junit</groupId> 28 <artifactId>junit</artifactId> 29 </dependency> 30 </dependencies> 31 32 <build> 33 <plugins> 34 <!-- define the project compile level --> 35 <plugin> 36 <groupId>org.apache.maven.plugins</groupId> 37 <artifactId>maven-compiler-plugin</artifactId> 38 <version>2.3.2</version> 39 <configuration> 40 <source>1.7</source> 41 <target>1.7</target> 42 </configuration> 43 </plugin> 44 </plugins> 45 </build> 46 </project>
以下几个同上
- test-hd-api中的依赖关系
- test-hd-resource中的依赖关系
- test-hd-service中的依赖关系
- test-hd-module中的依赖关系
- test-hd-www中的依赖关系
- 最后使用maven-update整个工程,右击父工程名--》Maven--》Update Project
打包和发布
- 打包,右击父工程名 test-hd-parent---->Run As--->Maven Install
- 打包web子工程,右击工程名test-hd-www--->Run As ---> Maven Build...---> Goals: clean package--->Run
- 右击工程名test-hd-www,进行刷新,找到war包,放到tomcat的webapps中,启动tomcat,即可访问工程http://localhost:8080/test-hd-www
- 可以去tomcat下面webapps》test-hd-www》WEB-INF》lib中,看到引用的jar包