maven 是一个项目管理工具,主要作用是在项目开发阶段对Java项目进行依赖管理和项目构建。
依赖管理:就是对jar包的管理。通过导入maven坐标,就相当于将仓库中的jar包导入了当前项目中。
项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包,部署整个过程。
本地仓库
远程仓库
①maven中央仓库(地址:http://repo2.maven.org/maven2/)
②maven私服(公司局域网内的仓库,如Nexus)
③其他公共远程仓库(例如阿里云maven仓库地址,地址:https://maven.aliyun.com/repository/public)
命令 | 描述 |
---|---|
mvn clean | 对项目进行清理,删除target目录下编译的内容 |
mvn validate | 验证工程是否正确,所有需要的资源是否可用 |
mvn compile | 编译当前的工程,将Java文件编译成.class文件(真正在jvm里面运行的文件) |
mvn test | 对项目进行运行测试 |
mvn package | 打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件 |
mvn verify | 运行任何检查,验证包是否有效且达到质量标准 |
mvn install | 在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下 |
mvn site | 生成项目相关信息的网站 |
mvn deploy | 发布工程至指定的远端仓库当中,可以被其他机器通过pom坐标引用 |
mvn clean package
依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
mvn clean install
依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库
mvn clean deploy
依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库
---------------实际应用-----------------------
# 1、刷新子模块版本号:
mvn versions:update-child-modules
# 2、重新打包到maven本地库:
mvn clean install -Dmaven.test.skip=true
mvn install
# 3、部署包到远程服务器
mvn clean deploy -Dmaven.test.skip=true
#---------------------一般常用命令-----------------------
# 该命令打印出所有的java系统属性和环境变量
mvn help:system 自动在本用户下创建 ~/.m2/repository
# 清理输出目录默认target/
mvn clean
mvn clean compile 清理编译
# maven test,但实际执行的命令有:clean:clean,resource:resources,compiler:compile, resources:testResources, compiler:testCompile,maven在执行test之前,会先自动执行项目主资源处理,主代码编译,测试资源处理,测试代码编译等工作,测试代码编译通过之后默认在target/test-calsses目录下生成二进制文件,紧接着surefile:test 任务运行测试,并输出测试报告,显示一共运行了多少次测试,失败成功等等
mvn clean test 清理测试
mvn clean package 清理打包
mvn clean install 清理将打包好的jar存入 本地仓库 注意是本地仓库
mvn clean deploy 根据pom中的配置信息将项目发布到远程仓库中
echo %MAVEN_HOME%:查看maven安装路径
---------------------创建项目-------------------------------
mvn -version/-v 显示版本信息
mvn archetype:generate 创建mvn项目,使用Archetype生成项目骨架
mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app 创建mvn项目
# 创建Maven的普通java项目:
mvn archetype:create -DgroupId=packageName -DartifactId=projectName
# 创建Maven的Web项目:
mvn archetype:create -DgroupId=packageName -DartifactId=webappName-DarchetypeArtifactId=maven-archetype-webapp
---------------------优化依赖命令-------------------------------
mvn dependency:list 显示所有已经解析的所有依赖
mvn dependency:tree 以目录树的形式展现依赖, 最高层为一层依赖 其次二层依赖 三层依赖....
mvn dependency:analyze 第一部分显示 已经使用但是未显示依赖的的 第二部分显示项目未使用的但是依赖的
---------------------第三方jar 发布到远程仓库---------------------
mvn deploy:deploy-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar -DrepositoryId=maven-repository-inner -Durl=ftp://xxxxxxx/opt/maven/repository/
---------------------第三方jar 安装到本地仓库---------------------
mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar -DdownloadSources=true -DdownloadJavadocs=true
#你是否因为记不清某个插件有哪些goal而痛苦过,你是否因为想不起某个goal有哪些参数而苦恼,那就试试这个命令吧,它会告诉你一切的.参数: 1. -Dplugin=pluginName 2. -Dgoal(或-Dmojo)=goalName:与-Dplugin一起使用,它会列出某个插件的goal信息,如果嫌不够详细,同样可以加-Ddetail.(注:一个插件goal也被认为是一个 “Mojo”)
mvn help:describe -Dplugin=help -Dmojo=describe
mvn -e 显示详细错误 信息.
mvn validate 验证工程是否正确,所有需要的资源是否可用。
mvn test-compile 编译项目测试代码。 。
mvn integration-test 在集成测试可以运行的环境中处理和发布包。
mvn verify 运行任何检查,验证包是否有效且达到质量标准。
mvn generate-sources 产生应用需要的任何额外的源代码,如xdoclet。
依赖范围 | 对于编译classpath有效 | 对于测试classpath有效 | 对于运行classpath有效 | 例子 |
---|---|---|---|---|
compile | Y | Y | Y | spring-core |
test | - | Y | - | Junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地的,maven仓库之外的类库 |
# 1. 声明规范
<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">
# 2. localRepository 本地仓库配置
<localRepository>usr/local/mavenlocalRepository>
# 3. interactiveMode
<interactiveMode>trueinteractiveMode>
# 4. usePluginRegistry
<usePluginRegistry>falseusePluginRegistry>
# 5. offline
<offline>falseoffline>
# 6. pluginGroups
<pluginGroups>
<pluginGroup>org.codehaus.mojopluginGroup>
pluginGroups>
# 7. proxies
<proxies>
<proxy>
<id>myproxyid>
<active>trueactive>
<protocol>httpprotocol>
<host>proxy.somewhere.comhost>
<port>8080port>
<username>proxyuserusername>
<password>somepasswordpassword>
<nonProxyHosts>*.google.com|ibiblio.orgnonProxyHosts>
proxy>
proxies>
# 8. servers
<servers>
<server>
<id>server001id>
<username>my_loginusername>
<password>my_passwordpassword>
<privateKey>${usr.home}/.ssh/id_dsaprivateKey>
<passphrase>some_passphrasepassphrase>
<filePermissions>664filePermissions>
<directoryPermissions>775directoryPermissions>
server>
servers>
# 9. mirrors
<mirrors>
<mirror>
<id>planetmirror.comid>
<name>PlanetMirror Australianame>
<url>http://downloads.planetmirror.com/pub/maven2url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
# 10. profiles
<profiles>
<profile>
<id>testid>
profile>
profiles>
# 11. Activation
<activation>
<activeByDefault>falseactiveByDefault>
<jdk>1.5jdk>
<os>
<name>Windows XPname>
<family>Windowsfamily>
<arch>x86arch>
<version>5.1.2600version>
os>
<property>
<name>mavenVersionname>
<value>2.0.3value>
property>
<file>
<exists>${basedir}/file2.propertiesexists>
<missing>${basedir}/file1.propertiesmissing>
file>
activation>
# 12. properties : note:如果该profile被激活,则可以再POM中使用${user.install}
<properties>
<user.install>${user.home}/our-projectuser.install>
properties>
# 13. activeProfiles
<activeProfiles>
<activeProfile>env-testactiveProfile>
activeProfiles>
# 14. Repositories
<repositories>
<repository>
<id>codehausSnapshotsid>
<name>Codehaus Snapshotsname>
<releases>
<enabled>falseenabled>
<updatePolicy>alwaysupdatePolicy>
<checksumPolicy>warnchecksumPolicy>
releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
snapshots>
<url>http://snapshots.maven.codehaus.org/maven2url>
<layout>defaultlayout>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<releases>
<enabled/><updatePolicy/><checksumPolicy/>
releases>
<snapshots>
<enabled/><updatePolicy/><checksumPolicy/>
snapshots>
<id/><name/><url/><layout/>
pluginRepository>
pluginRepositories>
在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
通过上面的图可以看到,我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans等。最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans等。
optional是maven依赖jar时的一个选项,表示该依赖是可选的,不会被依赖传递。
例如当前项目是A,A要依赖B,A依赖B的配置中加上 true,表示依赖可选
<dependency>
<groupId>com.projecctgroupId>
<artifactId>BartifactId>
<version>1.0version>
<scope>compilescope>
<optional>trueoptional>
dependency>
那么以后所有声明依赖A的项目如果也依赖B,就必须写手动声明。
比如C依赖A和B,如果C只声明了对A的依赖,那么B不会自动加入依赖,需要重新声明对B的依赖。
这种方式排除不了我项目中对第三方jar包所依赖的其他依赖,因为我不可能去修改第三方jar包的pom文件,所以只适合在项目组内部使用。
在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。
结论:通过上图可以看到,spring-aop和spring-webmvc都传递过来了spring-beans,但是因为spring-aop在前面,所以最终使用的spring-beans是由spring-aop传递过来的,而spring-webmvc传递过来的spring-beans则被忽略了。
上图我们可以看到,spring-webmvc传递过来的spring-core已经排除出去了
采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用
①在dependencyManagement标签中锁定依赖的版本
②在dependencies标签中声明需要导入的maven坐标
上图可以看出spring-core和spring-aop的版本号均已修改
注 dependencyManagement中锁定版本后,导入spring-core和spring-aop的时候不需要再指定版本