Maven是一个项目管理和构建自动化工具。但是对于我们程序员来说,我们最关心的是它的项目构建功能,它定义了项目开发的几个标准步骤:编译,发布,单元测试及部署以帮助项目开发
最简单的时候场景是,在pom.xml里设置对第三方jar包的依赖,而不用所有用到的jar包都复制到工程lib目录,再配置javapath。
它所有的项目都有如下的结构:
目录 | 目的 |
${basedir} | 存放 pom.xml和所有的子目录 |
${basedir}/src/main/java | 项目的 java源代码 |
${basedir}/src/main/resources | 项目的资源,比如说 数据源配置文件,spring配置文件 |
${basedir}/src/test/java | 项目的测试类,比如说 JUnit代码 |
${basedir}/src/test/resources | 测试使用的资源 |
一个 maven 项目在默认情况下会产生 JAR 文件,另外,编译后 的 classes 会放在${basedir}/target/classes 下面, JAR 文件会放在 ${basedir}/target 下面。
当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库。这样在你下次使用的时候就不需要从远程下载了。如果你所需要的jar包版本在本地仓库没有,而且也不存在于远程仓库,Maven在构建的时候会报错
1.maven仓库:
1.1查看maven*仓库地址:
打开$home\apache-maven-3.2.1\lib中的maven-model-builder-3.2.1.jar,找到pom.xml,
地址就是http://repo.maven.apache.org/maven2
1.2修改本地仓库
在D盘下新建m2\repository文件夹
可以通过修改${user.home}/.m2/settings.xml配置本地仓库路径
修改Maven安装目录下的 conf/文件夹内的setting.xml文件,新增一行:
<localRepository>D:\m2\repository</localRepository>
(表示本地仓库的地址为:D:\m2\repository)
将setting.xml复制一份到
D:\m2\repository目录下
1.2.1 修改Eclipse中的maven配置
1.打开eclipse点击windows->preferences->maven->installations下add一个已经安装到D:\maven\目录下的maven,如:D:\maven\apache-maven-3.3.3
2.打开eclipse点击windows->preferences->maven->User setting下修改user setting选项为:D:\m2\repository\settings.xml,并点击update settings。并点击下面的reindex按钮更新索引。
3.点击配置窗口的apply按钮,突出配置窗口。
1.3 修改远程仓库
阿里云*仓库:http://maven.aliyun.com/nexus/content/groups/public/
修改maven根目录下的conf文件夹中的setting.xml文件,内容如下:
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>2.maven坐标
groupId,artifactId,version
这三个元素组成了Maven的坐标,它相当为项目在Maven世界中的ID。
其中:
Group Id:项目名
Artifact Id:项目模块名
Version:项目的版本号,后缀SNASHOT为快照的意思,表示版本不稳定
mvn命令
mvn插件地址:http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/
cmd中输入mvn:报
即要求mvn命令需要配合插件命令或生命周期阶段使用
2.1 以自动生成项目骨架为例
使用插件maven-archetype-plugin
在http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/ (org/apache/maven/plugins是groupid)
执行分析: mvn help:describe -Dplugins=org.apache.maven.plugins:maven-archetype-plugin
执行成功,内容如下:
其中可以用别名goal prefix定位插件,即可以用mvn help:describe -Dplugin=archetype (一般mvn的前缀是中间那个单词)
另外,该插件有8个功能,archetype:create archetype:generate等
注意:
命令运行很慢的解决方案
问题:生成项目骨架时,需要模板文件,默认的模板文件需要到中心仓库下载大约5M的XML文件(http://repo.maven.apache.org/maven2/archetype-catalog.xml),因为*仓库在国外,导致运行很慢
解决办法:方法1:将此文件下载,放到本地仓库,用mvn archetype:generate -DarchetypeCatalog=local
方法2:使用内置的原型文件 mvn archetype:generate -DarchetypeCatalog=internal
- 创建一个简单的java工程:mvn archetype:generate
- 创建一个简单的Java工程:mvn archetype:create -DgroupId=com.mycompany.example -DartifactId=Example
- 创 建一个java的web工程:mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=com.mycompany.app -DartifactId=my-webapp
2.2 将项目导入eclipse
eclipse识别项目,需要项目根目录下面有.classpath和.project文件
在mvn plugin中http://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/plugins/查找eclipse
cmd中查看插件详情:mvn help:describe -Dplugin=eclipse
执行eclipse:eclipse目标,生成eclipse配置文件
然后ide就可以导入了。
如IDE报M2_REPO错误,需要在build path中添加M2_REPO变量,指向MAVEN本地仓库地址
2.3编译执行
分析插件:mvn help:describe -Dplugin=compiler,使用compiler:compile目标
执行mvn compiler:compile
- 打包:mvn package
- 编译:mvn compile
- 编译测试程序:mvn test-compile
- 清空:mvn clean
- 运行测试:mvn test
- 生成站点目录: mvn site
- 生成站点目录并发布:mvn site-deploy
- 安装当前工程的输出文件到本地仓库: mvn install
- 安 装指定文件到本地仓库:mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>
- 查看实际pom信息: mvn help:effective-pom
- 分析项目的依赖信息:mvn dependency:analyze 或 mvn dependency:tree
- 跳过测试运行maven任务: mvn -Dmaven.test.skip=true XXX
- 生成eclipse项目文件: mvn eclipse:eclipse
- 查看帮助信息:mvn help:help 或 mvn help:help -Ddetail=true
- 查看插件的帮助信息:mvn <plug-in>:help,比如:mvn dependency:help 或 mvn ant:help 等等。
2.4 添加需要依赖包,配置pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
其中groupid、artifactId、version是三坐标,定位jar包
dependencies
项目依赖,由1到N个dependency组成,每个dependency包含了一个坐标和依赖范围scope
其中scope默认为compile,表示该依赖对主代码和测试代码都有效,
test则表示该依赖只对测试有效,即测试代码中可以使用Junit-3.8.1.jar中的内容,主代码不能使用
找需要的jar资源:http://mvnrepository.com/
加入pom.xml中
执行mvn eclipse:eclipse
3.maven命令
插件命令
生命周期阶段命令
关系:
生命周期阶段命令是插件命令的有序集合
Maven有三套相互独立的生命周期
- Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
- Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
- Site Lifecycle 生成项目报告,站点,发布站点。
它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有点绕?要知道有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行一些需要在clean之后立刻完成的工作
mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入。
下面看一下Site生命周期的各个阶段:
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,
最后,来看一下Maven的最重要的Default生命周期,绝大部分工作都发生在这个生命周期中,这里,我只解释一些比较重要和常用的阶段:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources 复制并处理资源文件,至目标目录,准备打包。
- compile 编译项目的源代码。
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources 复制并处理资源文件,至目标测试目录。
- test-compile 编译测试源代码。
- process-test-classes
- test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
- prepare-package
- package 接受编译好的代码,打包成可发布的格式,如 JAR 。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install 将包安装至本地仓库,以让其它项目依赖。
- deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
记住,运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。
此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要
Project Object Model,项目对象模型。
通过xml格式保存的pom.xml文件。
作用类似ant的build.xml文件,功能更强大。
该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。
POM间的关系
依赖关系列表(dependency list)是POM的重要部分。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
...
</dependencies>
如何查到依赖的类库?
一般可以通过这个网站:http://www.mvnrepository.com/
比如查询hibernate,可以找到结果列表中的hibernate类库条目。
http://www.mvnrepository.com/artifact/org.hibernate/hibernate-core
点击版本,即http://www.mvnrepository.com/artifact/org.hibernate/hibernate-core/5.2.5.Final
复制文章中的:
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.5.Final</version>
</dependency>
到pom.xml文件中即可。
是否还需要找到hibernate依赖的pom?
不需要,hibernate也会有pom,maven会通过它的pom自动找到它依赖的类库。
继承关系
继承其他pom.xml配置的内容。
maven提供了一个类似java.lang.Object的*父pom.xml文件。
可以通过下面命令查看当前pom.xml受到超pom.xml文件的影响:
安装第三方包
经常有第三方包,因为一些原因,在网上repository上没有,需要自己动手安装。
比如sun某些版本的jar文件,比如oracle的驱动。
已oracle驱动程序为例,比如驱动路径为c:/driver/ojdbc14.jar,是10.2.0.3.0版本
在该网址能够查到:http://www.mvnrepository.com/artifact/com.oracle/ojdbc14 artifactId和groupId。
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.3.0 -Dpackaging=jar -Dfile=c:/driver/ojdbc14.jar
这样就可以在pom中依赖引用了:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>10.2.0.3.0</version>
</dependency>
部署到tomcat
tomcat配置有管理权限的用户:conf\tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager"/>
<user username="marshal" password="password" roles="manager"/>
</tomcat-users>
在pom文件的tomcat插件中添加:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://localhost:8080/manager</url>
<server>myserver</server>
<path>/mycontext</path>
</configuration>
</plugin>
在.m2/settings.xml文件中增加:
<settings 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/settings-1.0.0.xsd">
<servers>
<server>
<id>myserver</id>
<username>marshal</username>
<password>password</password>
</server>
</servers>
</settings>
运行打包部署,在maven项目目录下:
mvn tomcat:deploy
然后访问:http://localhost:8080/mycontext/ 即可。
撤销部署:
mvn tomcat:undeploy
启动web应用:
mvn tomcat:start
停止web应用:
mvn tomcat:stop
重新部署:
mvn tomcat:redeploy
部署展开的war文件:
mvn war:exploded tomcat:exploded