传递依赖:
添加spring-webmvc的核心依赖坐标时,会发现以外的其他jar包。因为项目依赖spring-webmvc.jar,而spring-webmvc.jar会依赖spring-bean.jar等,所以依赖spring-webmvc.jar时它依赖的jar包也会出现在当前工程中,这种现象称之为传递依赖。
依赖调解原则:
- 第一声明者优先原则:在pom文件定义依赖,先声明的依赖为准
- 路径近者优先原则:在pom文件直接定义依赖比传递依赖优先
排除依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
</exclusions>
</dependency>
锁定版本:
面对众多依赖这种方法不需要考虑依赖路径,声明优先等因素,企业中常用:
如下配置锁定了spring-bean和spring-context的版本
<!-- 使用 <properties> 标签设置成变量 -->
<properties>
<spring.version>5.2.9.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
注意:在工程中锁定版本号并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加标签如下
<!-- 在<dependencyManagement>中已经指定版本所以引入依赖时不需要指定版本 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
分模块构建工程:
继承与聚合:
通常继承和聚合是同时使用。
**
**继承:**继承是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,如设置编译版本、锁定spring的版本等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。
**聚合:**项目开发通常是分模块开发,每个模块开发完成要运行整个工程,需要将每个模块聚合在一期运行,比如:dao、service、web三个工程最终会打一个独立的war包或jar包运行。
Maven私服:
私服指的是公司在内网环境下自己搭建的远程仓库。他还充当代理服务器,当私服上没有jar包时会从互联网中央仓库自动下载。
搭建私服环境:
- 安装Nexus:Nexus是Maven仓库管理器,通过Nexus可以搭建maven仓库,同时Nexus还提供强大的仓库管理功能和构建的搜索功能等。下载地址:
- 解压下载文件 bin目录执行安装脚本即可 配置文件:conf/nexus.properties
- 默认账户和密码 admin/admin123
Maven私服仓库的类型:
- hosted:宿主仓库,部署自己的jar到这个类型的仓库,包括release和snapshot两部分,Release公司内部发布版本仓库,Snapshot公司内部测试版本仓库
- proxy:代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包。
- group:仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组
- virtual(虚拟):兼容maven1版本的jar
nexus 仓库默认在sonatype-work目录中:
- central:代理仓库代理中央仓库
- apache-snapshots:代理仓库,存储snapshots构建,代理地址:https://repository.apache.org/snapshots/
- central-m1:virtual类型仓库
- snapshot:本地仓库
- thirdparty:第三方仓库
- public:仓库组
将项目发布到私服:
- 配置:修改settings.xml 配置连接私服的用户和密码
<!-- releases连接发布版本项目仓库 -->
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<!-- snapshot连接测试版本项目仓库 -->
<server>
<id>snapshot</id>
<username>admin</username>
<password>admin123</password>
</server>
- 配置项目pom.xml,配置私服仓库地址,根据公司自己jar包的版本号上传到私服的宿主仓库,若版本为release则上传到私服的release的仓库,若为snapshot则上传到私服的snapshot仓库
<!-- 注意:这里的<id> 和 settings.xml配置里的<id>对应 -->
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus.contetn.repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus.contetn.repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<!-- 执行deploy命令即可 -->
从私服下载jar包:
- 在settings.xml 中配置私服仓库,由于settings.xml 中没有repositories的配置标签,所以需要使用profile定义仓库。
<profile>
<!-- profile的id -->
<id>dev</id>
<repositories>
<repository>
<!-- 仓库的id,repositories可以配置多个仓库,保证id不重复 -->
<id>nexus</id>
<!-- 仓库地址 -->
<url>http://localhost:8081/repository/hsaf-public/</url>
<!-- 是否下载snapshots最新构件 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
<!-- 是否下载releases最新构件 -->
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<!-- 插件仓库,maven的运行依赖插件,也需要从私服下载 -->
<pluginRepositories>
<pluginRepository>
<!-- 插件仓库的id不允许重复,如果重复后边覆盖前边 -->
<id>cs-plugin-central</id>
<url>http://121.36.70.71:8081/repository/hsaf-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</profile>
<!-- 使用profile定义仓库需要激活才生效 -->
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
- 查看有效pom idea pom.xml文件右击 maven 最后一个 show Effective POM 查看是否生效即可
把第三方jar包放入本地仓库或私服
- 导入本地库: mvn install:install-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.0 -Dfile=E:\test\fastjson.jar -Dpackaging=jar
- 导入私服:在maven核心配置文件settings.xml中配置第三方Server信息
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
执行如下命令:mvn deploy:deploy-file -DgroupId=com.alibaba -DartifactId=fastjson -Dversion=1.0 -Dfile=E:\test\fastjson.jar -Dpackaging=jar -Durl=http://localhost:8081/nexus/content/repositories/thirdparty -DrepositoriesId=thirdparty
参数说明:
DgroupId和DartifactId构成了该jar包在pom.xml的坐标,
Dfile表示需要上传的jar包路径
Durl私服上仓库的位置 nexus–>repositories菜单可以看到路径
DrepositoriesId服务器的标识id nexus的configuration可以看到
Dversion 版本信息:
jar包准确版本信息:报的名字上会有,如果没有 解压包里面有个MANIFEST.MF的文件,这个文件里有描述该包的版本信息