maven依赖详解

maven 基础和依赖传递

  • 1. maven基础
    • 1.1 简介
    • 1.2 仓库类型
    • 1.3 常用命令
    • 1.4 场景举例
    • 1.5 指令总结
    • 1.6 依赖范围
    • 1.7 maven 的 settings.xml 说明
  • 2. maven依赖
    • 2.1 依赖传递
    • 2.2 手动声明
    • 2.3 冲突解决
      • 2.3.1第一声明者优先原则
      • 2.3.2 排除
      • 2.3.3 版本锁定

1. maven基础

1.1 简介

maven 是一个项目管理工具,主要作用是在项目开发阶段对Java项目进行依赖管理和项目构建。

依赖管理:就是对jar包的管理。通过导入maven坐标,就相当于将仓库中的jar包导入了当前项目中。

项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包,部署整个过程。

1.2 仓库类型

  1. 本地仓库

  2. 远程仓库

    ①maven中央仓库(地址:http://repo2.maven.org/maven2/)

    ②maven私服(公司局域网内的仓库,如Nexus)

    ③其他公共远程仓库(例如阿里云maven仓库地址,地址:https://maven.aliyun.com/repository/public)

1.3 常用命令

命令 描述
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坐标引用

1.4 场景举例

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.5 指令总结

---------------实际应用-----------------------
# 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 
# 创建MavenWeb项目:  
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。

1.6 依赖范围

依赖范围 对于编译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.7 maven 的 settings.xml 说明

#  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>

2. maven依赖

2.1 依赖传递

在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
maven依赖详解_第1张图片
通过上面的图可以看到,我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans等。最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans等。

2.2 手动声明

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文件,所以只适合在项目组内部使用。

2.3 冲突解决

2.3.1第一声明者优先原则

在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。
maven依赖详解_第2张图片

结论:通过上图可以看到,spring-aop和spring-webmvc都传递过来了spring-beans,但是因为spring-aop在前面,所以最终使用的spring-beans是由spring-aop传递过来的,而spring-webmvc传递过来的spring-beans则被忽略了。

2.3.2 排除

可以使用exclusions标签将传递过来的依赖排除出去。
maven依赖详解_第3张图片

上图我们可以看到,spring-webmvc传递过来的spring-core已经排除出去了

2.3.3 版本锁定

采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用
①在dependencyManagement标签中锁定依赖的版本
maven依赖详解_第4张图片

②在dependencies标签中声明需要导入的maven坐标
maven依赖详解_第5张图片
上图可以看出spring-core和spring-aop的版本号均已修改

注 dependencyManagement中锁定版本后,导入spring-core和spring-aop的时候不需要再指定版本

你可能感兴趣的:(maven,java,maven,java,junit)