maven高级,一篇即懂

一、了解搭建私服的使用

仓库概念

中央仓库
目前来说: https://repo1.maven.org/maven2/是真正的Maven中央仓库的地址,该地址内置在Maven的源码中其他的都是镜像。
仓库镜像
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像,使用镜像可以提高项目构建效率。
仓库的索引
中央仓库带有索引文件以方便用户对其进行搜索,索引每周更新一次,中央仓库的索引有几十M。
黑名单
如果某个IP地址恶意的下载中央仓库内容,例如全公司100台机器使用同一个IP反复下载,这个IP(甚至是IP段)会进入黑名单,因此稍有规模的使用Maven时,应该用Nexus架设私服。
私服
有些公司不提供外网给项目组人员,因此就不能使用maven访问远程的仓库地址,所以很有必要在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上,这样的话就可以通过这台搭建了nexus私服的电脑访问maven的远程仓库。

1.1 私服安装:

1. 在任意位置创建目录: nexus
2. 解压到nexus目录下会出现两个目录,两个目录都有用

注意:配置jdk1.8、再解压。不要安装有中文目录

配置文件说明

  • 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口。
  • 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间

再cmd里面启动:

  1. 私服的访问

1.2 私服仓库分类:

仓库类别

英文名称

功能

关联操作

宿主仓库

hosted

保存自主研发+第三方资源

上传

代理仓库

proxy

代理连接中央仓库

下载

仓库组

group

为仓库编组简化下载操作

下载

1.3 私服的配置:

1.4 idea环境中资源上传与下载

上传:

  • 本地仓库setting.xml文件配置 本地地址F:/Maven/apache-maven-3.6.1
F:\Maven\apache-maven-3.6.1\conf
1.放到settings的<servers>标签里面
<server>
	<id>release</id>
	<username>admin</username>
	<password>admin</password>
</server>
<server>
	<id>snapshots</id>
	<username>admin</username>
	<password>admin</password>
</server>
  • idea中pom.xml文件配置
    • 快照版本:1.0-SNAPSHOT ,如果稳定了要改为RELEASE版本。
    • 导入配置命令,使用Maven命令:deploy部署。
2.放到模块的pom文件的<project>中
<distributionManagement>
	<repository>
		<id>release</id>
		<url>http://localhost:8081/repository/maven-releases/</url>
	</repository>
	<snapshotRepository>
		<id>snapshots</id>
		<url>http://localhost:8081/repository/maven-snapshots/</url>
	</snapshotRepository>
</distributionManagement>
    • 在私服上面查看:

下载:

本地仓库访问私服权限设置 只能下载RELEASE版本。

  1. 配置私服位置Setting.xml :与上传中的service一致。
  2. 配置访问私服在Setting.xml文件中: 找到<mirror>标签,放内容到里面。

<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>

(注意❗配置后要改回原来阿里云的配置,上面的只是展示一下。)

  1. 直接编译一下即可:compile

二、理解传递依赖

2.1 依赖范围:

  1. maven有三种步同的类路径。

classpath范围

理解为

编译类路径

只在main目录下源代码起作用

测试类路径

只在test目录下起作用

运行时类路径

在运行的时候起作用,可以理解为会打包到target目录下

  1. 4种依赖范围:complile、provided、test、runtime 在运行状态的会产生依赖关系。

依赖范围

main编译类路径

test测试类路径

target运行时类路径

举例

compile

Y

Y

Y

Log4j

provided

Y

Y

Servlet

runtime

Y

Y

mysql

test

Y

junit

2.2 依赖传递:

在运行时起作用时候,会产生依赖传递

什么是依赖传递
概念:某个项目依赖了另一个项目,另一个项目中jar包会不会传递到这个项目中来 。

2.3 依赖可选

1.依赖可选
前提是会产生依赖传递的两种情况
2.什么是可选依赖
1. A项目依赖了junit
2. B项目依赖了A项目
3. 根据依赖传递特性,默认情况下B项目会依赖junit
4. 我们可以在A项目通过可选依赖,让B项目不能依赖junit
3.配置方式
在A项目的依赖配置中,通过optional子标签进行配置。它有两个取值:
• true:是可选依赖,不进行依赖传递
• false:默认值,进行依赖传递。
我是A项目,由我决定要不要给你,我的地盘我做主

<optional>标签,true依赖步往后面传递;在父项目模块中定义:

2.4 依赖排除

1.什么是依赖排除
1. A项目依赖了junit
2. B项目依赖了A项目
3. 根据依赖传递特性,默认情况下B项目会依赖junit
4. 我们可以在B项目通过排除依赖,配置B项目不依赖junit
2. 配置步骤
通过在B项目中配置 exclusions标签进行配置
1. 在依赖A项目下的version标签下编写exclusions
2. exclusions中每个exclusion是一个要排除的jar包
3. 只需指定groupId和artifactId就可以了,不用指定version版本
你给我就要,我不是很没面子?我来决定要不要

已经产生依赖关系,有相同的依赖,可以排除:<exclusions>

三、掌握如何解决依赖冲突问题

3.1 依赖冲突

了解Maven处理规则。

  1. 两个直接依赖 ,采用后面的依赖:即4.13.1

  1. 一个直接一个间接,采用直接的依赖
  2. 两个间接(里面还包含着其他依赖):

可以在模块结构中查看依赖(dependence)

四、学习使用maven分模块方式构建工程

4.1 多环节配置与应用:

方便快速切换不同环境。

  1. 配置多环境

  • jdbc.properties文件要:使用${ }绑定要修饰的变量。
  • <profiles>标签:定义各种环境。

<activation>标签:定义激活哪个环境

  • <build>标签:指定编译。定义一个插件进行编译。

配置好后启动编译:compile命令!在target目录下可以查看编译后的文件:jdbc.properties已经发生了变化

  1. 使用环境:使用maven命令

mvn compile -P 大写

<profiles>
        <!--开发环境-->
        <profile>
            <id>maven_start</id> <!--要保证唯一-->
            <properties>
                <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <!--测试环境-->
        <profile>
            <id>maven</id>
            <properties>
                <jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db</jdbc.url>
            </properties>
        </profile>
    </profiles>


    <build>
        <resources>
            <!-- 指定资源的配置 -->
            <resource>
                <!-- 必须指定resource所在的目录 -->
                <directory>${basedir}/src/main/resources</directory>
                <!-- 指定是否替换 -->
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

4.2 继承

概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息
⚫ 作用
1. 抽取所有项目公用的配置信息,子项目继承父项目,子项目就可以直接使用父项目的公用的配置了
2. 依赖管理(版本锁定):锁定当前项目中各个子项目依赖的版本
⚫ 子项目的配置
在子工程中声明其父工程坐标与对应的位置

父类中的打包方式为pom

  1. 简单的实现:

写父类模块:

选择空,注意不要包含其他模块,

  • 只有pom.xml
  1. 父类中的打包方式变化,变为POM
  2. 子类中多了一个parent标签。
  3. 父类中的依赖会直接继承到子类中。

点中父模块来创建子模块:

2.父类中版本锁定

<dependencyManagement>,父类中锁定依赖的版本:子类中可以不用写版本号。(愿望)

4.3 聚合

dependencyManagement元素
作用:一旦在父项目中使用了版本锁定,就是统一控制各个组件的版本。如果子项目继承父项目,父项目中版本锁定的包子项目是不能直接使用的。
如果要使用,需要在子项目添加依赖,但不需要指定版本号。
步骤
1. 在父项目中pom.xml
1). 配置dependencyManagement
2). 配置依赖spring-webmvc
3). 配置依赖spring-context
2. 此时在子项目pom.xml中并没有依赖任何包
1). 在子项目需要再配置一次依赖spring-context,子项目中不需要指定版本version,这时子项目中就有了依赖包了
2). 因为没有配置spring-webmvc,所以spring-webmvc的包并没有继承下来
⚫ 作用: 配置在父工程中,聚合用于快速构建maven工程,一次性构建多个项目/模块。

⚫ 注意事项:参与聚合操作的模块最终执行顺序与模块间的依赖关系有关,与配置顺序无关 。

<modules>标签:父类中保存了所有的儿子信息。操作父类相当于操作了所有的儿子。

4.4 分模块创建。

  1. 项目开发的三种不同方式:
  • 传统开发:将这些业务集中在1个web项目中, 缺点是代码量大, 业务插拔不方便 。

  • 模块开发:模块化开发业务清晰, 维护方便, 业务插拔较简单, 缺点是各模块间 仍然存在依赖

  • 微服务:将各个业务拆分成多个独立的系统

  1. 案例:把之前的项目拆分多个模块

  1. 顺序是 实体类→dao→service→web模块
  2. 哪个包含就在哪个模块里面导入相应的依赖
  • 在父模块中进行版本号抽取。
  • 创建子模块

注意,模块之间的依赖关系: 如dao中需要pojo中的实体类,需要创建依赖。

  • 把控制器转换为web模块——快捷键。
  • 复制静态模块的时候不能复制到WEB-INF
  • tomcat部署的是控制器control

五、小结

  1. idea环境中资源上传与下载

  1. maven依赖管理

  1. 使用maven分模块方式构建工程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值