传递依赖:

添加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的文件,这个文件里有描述该包的版本信息

04-08 10:11