根据黑马程序员的课程资料整理所得,仅用于学习使用,如有侵权,请联系删除
在项目所依赖的这些jar包中,有一个比较大的区别就是有的依赖前面有箭头>
,有的依赖前面没有
打开前面的箭头,你会发现这个jar包下面还包含有其他的jar包,并发现有两个druid的依赖被加载到Dependencies中
在这两个依赖中,即便删去直接引用的依赖(第二个),程序也是可以正常运行的,这个特性就是依赖传递
说明:A代表自己的项目;B,C,D,E,F,G代表的是项目所依赖的jar包;D1和D2 E1和E2代表是相同jar包的不同版本
(1) A依赖了B和C,B和C有分别依赖了其他jar包,所以在A项目中就可以使用上面所有jar包,这就是所说的依赖传递
(2) 依赖传递有直接依赖和间接依赖
(3)因为有依赖传递的存在,就会导致jar包在依赖的过程中出现冲突问题,而maven是通过设置优先级的方式来解决冲突的,而优先级有以下三种:
特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的。
路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
查看依赖关系:点击Maven面板中的show Dependencies
<dependency>
<groupId>...groupId>
<artifactId>maven_03_pojoartifactId>
<version>1.0-SNAPSHOTversion>
<optional>trueoptional>
dependency>
<dependency>
<groupId>com.itheimagroupId>
<artifactId>maven_04_daoartifactId>
<version>1.0-SNAPSHOTversion>
<exclusions>
<exclusion>
<groupId>org.mybatisgroupId>
<artifactId>mybatisartifactId>
exclusion>
exclusions>
dependency>
install
来安装,并且需要安装四个,如果我们的项目足够多,那么一个个安装起来还是比较麻烦的此时,就需要用到聚合
<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.0modelVersion>
<groupId>...groupId>
<artifactId>maven_01_parentartifactId>
<version>1.0-RELEASEversion>
<packaging>pompackaging>
project>
<modules>
<module>../maven_02_ssmmodule>
<module>../maven_03_pojomodule>
<module>../maven_04_daomodule>
modules>
<parent>
<groupId>...groupId>
<artifactId>maven_01_parentartifactId>
<version>1.0-RELEASEversion>
<relativePath>../maven_01_parent/pom.xmlrelativePath>
parent>
优化子项目共有依赖导入问题
将子项目共同使用的jar包都抽取出来,维护在父项目的pom.xml中
删除子项目中已经被抽取到父项目的pom.xml中的jar包
优化子项目依赖版本问题
如果把所有用到的jar包都管理在父项目的pom.xml,看上去更简单些,但是这样就会导致有很多项目引入了过多自己不需要的jar包,那针对于这种部分项目有的jar包,我们进行如下优化
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<scope>testscope>
dependency>
两种之间的作用:
聚合和继承的相同点:
聚合和继承的不同点:
<properties>
<spring.version>5.2.10.RELEASEspring.version>
<junit.version>4.12junit.version>
<mybatis-spring.version>1.3.0mybatis-spring.version>
properties>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_dbjdbc.url>
properties>
<build>
<resources>
<resource>
<directory>../maven_02_ssm/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
build>
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
build>
jdbc.url=${jdbc.url}
解决打包过程中报没有web.xml的错误
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.2.3version>
<configuration>
<failOnMissingWebXml>falsefailOnMissingWebXml>
configuration>
plugin>
plugins>
build>
mvn help:system
查看这些属性${key}
来获取,key为等号左边的,值为等号右边的,比如获取红线的值,对应的写法为 ${java.runtime.name}
。在我们jar包的版本定义中,有两个工程版本用的比较多:
除了上面的工程版本,我们还经常能看到一些发布版本:
我们可以通过Maven仓库地址来查询版本
<profiles>
<profile>
<id>环境名称id>
<properties>
<key>valuekey>
properties>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
profile>
...
profiles>
执行安装查看env_dep环境是否生效
进行多环境切换
mvn 指令 -P 环境定义ID[环境定义中获取]
方法一:这种方式最简单,但是有点"暴力",会把所有的测试都跳过,如果我们想更精细的控制哪些跳过哪些不跳过,就需要使用配置插件的方式。
方法二:配置插件实现跳过测试
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-pluginartifactId>
<version>2.12.4version>
<configuration>
<skipTests>falseskipTests>
<excludes>
<exclude>**/BookServiceTest.javaexclude>
excludes>
configuration>
plugin>
plugins>
build>
方法三:命令行跳过测试
使用Maven的命令行,mvn 指令 -D skipTests
搭建Maven私服的方式有很多,我们来介绍其中一种使用量比较大的实现方式:
使用cmd进入到解压目录下的nexus-3.30.1-01\bin
,执行如下命令:
nexus.exe /run nexus
看到如下内容,说明启动成功
访问地址为:
http://localhost:8081
首次登录重置密码点击
Sign in
点击finish
至此私服就安装成功。如果要想修改一些基础配置信息,可以使用:
在没有私服的情况下,我们自己创建的服务都是安装在Maven的本地仓库中
私服中也有仓库,我们要把自己的资源上传到私服,最终也是放在私服的仓库中
其他人要想使用你所上传的资源,就需要从私服的仓库中获取
当我们要使用的资源不是自己写的,是远程中央仓库有的第三方jar包,这个时候就需要从远程中央仓库下载,每个开发者都去远程中央仓库下速度比较慢(中央仓库服务器在国外)
私服就再准备一个仓库,用来专门存储从远程中央仓库下载的第三方jar包,第一次访问没有就会去远程中央仓库下载,下次再访问就直接走私服下载
前面在介绍版本管理的时候提到过有SNAPSHOT
和RELEASE
,如果把这两类的都放到同一个仓库,比较混乱,所以私服就把这两个种jar包放入不同的仓库
上面我们已经介绍了有三种仓库,一种是存放SNAPSHOT
的,一种是存放RELEASE
还有一种是存放从远程仓库下载的第三方jar包,那么我们在获取资源的时候要从哪个仓库种获取呢?
为了方便获取,我们将所有的仓库编成一个组,我们只需要访问仓库组去获取资源。
我们需要在本地Maven的配置文件settings.xml
中进行配置。
说明:
第5,6步骤是创建itheima-snapshot仓库
第7,8步骤是创建itheima-release仓库
<servers>
<server>
<id>jiuyou-snapshotid>
<username>adminusername>
<password>adminpassword>
server>
<server>
<id>jiuyou-releaseid>
<username>adminusername>
<password>adminpassword>
server>
servers>
<mirrors>
<mirror>
<id>maven-publicid>
<mirrorOf>*mirrorOf>
<url>http://localhost:8081/repository/maven-public/url>
mirror>
mirrors>
至此本地仓库就能与私服进行交互了。
<distributionManagement>
<repository>
<id>jiuyou-releaseid>
<url>http://localhost:8081/repository/jiuyou-release/url>
repository>
<snapshotRepository>
<id>jiuyou-snapshotid>
<url>http://localhost:8081/repository/jiuyou-snapshot/url>
snapshotRepository>
distributionManagement>
或者执行Maven命令mvn deploy
注意
要发布的项目都需要配置distributionManagement
标签,要么在自己的pom.xml中配置,要么在其父项目中配置,然后子项目中继承父项目即可。
如果私服中没有对应的jar,会去中央仓库下载,速度很慢。可以配置让私服去阿里云中下载依赖。
最后save即可.