maven高级

1.分模块开发与设计

理解并实现分模块开发 能够使用聚合工程快速构建项目 能够使用继承简化项目配置 能够根据需求配置生成、开发、测试环境,并在各个环境间切换运行 了解Maven的私服

1.1分模块开发:将别人写好的功能或是包直接使用,
  1. 引入依赖

  2. Install 到本地仓库,

  3. compiler即可使用

1.2依赖传递与依赖冲突

A项目依赖了B和C ,B和C又有分别依赖了其他jar包

相对于A来说,A直接依赖B和C,间接依赖了D1,E1,G,F,D2和E2 相对于B来说,B直接依赖了D1和E1,间接依赖了G 直接依赖和间接依赖是一个相对的概念

复制代码
特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高.
声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
1.3可选依赖和排除依赖

可选依赖

复制代码
可选依赖指对外隐藏当前所依赖的资源---不透明
引入依赖时在dependency下添加optional  - true

排除依赖

复制代码
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本---不需要
在dependency中添加
<exclusions>
    <exclusion>
        <groupId>com.itheima</groupId>
    <artifactId>maven_03_pojo</artifactId>
    </exclusion>
</exclusions>

2聚合和继承

为了解决多模块开发的一些问题

聚合:

  • 创建一个新工程

  • 打包方式为pom

  • 导入要管理的项目工程

    复制代码
    <modules>
    <module>../模块1</module>
    <module>../模块2</module>
    <module>../模块3</module>
    </modules>
    //聚合工程管理的项目在进行运行的时候,会按照项目与项目之间的依赖关系来自动决定执行的顺序和配置的顺序无关。
    ​

继承

  • 创建新的maven项目

  • 子项目中设置父工程

    复制代码
    <!--配置当前工程继承自parent工程-->
    <parent>
    <groupId>com.itheima</groupId>
    <artifactId>maven_01_parent</artifactId>
    <version>1.0-RELEASE</version>
    <!--设置父项目pom.xml位置路径-->
    <relativePath>../maven_01_parent/pom.xml</relativePath>
    </parent>
  • 优化子项目共同依赖导入问题,在父工程中配置子工程可选依赖

    复制代码
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
    </dependency>
    </dependencies>
    ...
    </dependencyManagement>

    子工程配置使用父工程可选依赖的坐标

    复制代码
    <dependencies>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    </dependency>
    </dependencies>

3.属性

为了解决依赖版本多次修改时,可能会产生修改不统一

使用方法

复制代码
1.定义
<properties>
    这里的依赖版本名是随便起
    <依赖版本名>版本号</依赖版本名>
    .
    ...
    ...
</properties>
​
2.使用在原来的依赖中
<version>
    ${依赖版本名}
</version>

属性管理properties文件

复制代码
<!--1.父工程定义属性-->
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
​
<!--2.jdbc.properties文件中引用属性-->
jdbc.url=${jdbc.url}
<!--3.设置maven过滤文件范围-->
<build>
<resources>
<!--设置资源目录-->
<resource>
    <!--《../maven_02_ssm/》可以更缓存${project.basedir} -->
    <!--
${project.basedir}: 当前项目所在目录,子项目继承了父项目,
相当于所有的子项目都添加了资源目录的过滤
-->
<directory>../maven_02_ssm/src/main/resources</directory>
<!--设置能够解析${},默认是false -->
<filtering>true</filtering>
</resource>
</resources>
</build>
<!-- 如上配置打包时会发生错误
原因就是Maven发现你的项目为web项目,就会去找web项目的入口web.xml[配置文件配置的方式],发现没有找到,就会报错
解决方案1:在maven_02_ssm项目src\main\webapp\WEB-INF\ 添加一个web.xml文件
解决方案2: 配置maven打包war时,忽略web.xml检查-->
​
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>

4.多环境配置与应用! (实用)

SNAPSHOT(快照版本) 项目开发过程中临时输出的版本,称为快照版本 快照版本会随着开发的进展不断更新 RELEASE(发布版本) 项目开发到一定阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本 除了上面的工程版本,我们还经常能看到一些发布版本: alpha版:内测版,bug多不稳定内部版本不断添加新功能 beta版:公测版,不稳定(比alpha稳定些),bug相对较多不断添加新功能 纯数字版

<!--我们平常都是在自己的开发环境进行开发,--> <!--当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用,--> <!--等测试人员测试通过后,我们会将项目部署到生成环境上线使用。--> <!--这个时候就有一个问题是,不同环境的配置是不相同的-->

配置
  1. 父工程配置多个环境,并指定默认激活环境

    复制代码
    <profiles>
    <!--开发环境-->
        <profile>
            <id>env_dep</id>
            <properties>
    <jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
            </properties>
    <!--设定是否为默认启动环境-->
            <activation>
        <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
        ...配置多个环境
     </profiles>
  2. 命令行实现环境切换

跳过测试
  1. 配置插件实现跳过测试

    复制代码
    <build>
    <plugins>
    <plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
    <skipTests>false</skipTests>
    <!--排除掉不参与测试的内容-->
    <excludes>
    <exclude>**/BookServiceTest.java</exclude>
    </excludes>
    </configuration>
    </plugin>
    </plugins>
    </build>
  2. 命令行

    mvn 指令 -D skipTests

5.私服

私服就是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题

搭建Maven私服的方式有很多,我们来介绍其中一种使用量比较大的实现方式:

Nexus Sonatype公司的一款maven私服产品 下载地址:Download

5.1私服仓库分类

(1)在没有私服的情况下,我们自己创建的服务都是安装在Maven的本地仓库中 (2)私服中也有仓库,我们要把自己的资源上传到私服,最终也是放在私服的仓库中 (3)其他人要想使用你所上传的资源,就需要从私服的仓库中获取 (4)当我们要使用的资源不是自己写的,是远程中央仓库有的第三方jar包,这个时候就需要从远程中 央仓库下载,每个开发者都去远程中央仓库下速度比较慢(中央仓库服务器在国外) (5)私服就再准备一个仓库,用来专门存储从远程中央仓库下载的第三方jar包,第一次访问没有就会 去远程中央仓库下载,下次再访问就直接走私服下载 (6)前面在介绍版本管理的时候提到过有 SNAPSHOT 和 RELEASE ,如果把这两类的都放到同一个仓库, 比较混乱,所以私服就把这两个种jar包放入不同的仓库 (7)上面我们已经介绍了有三种仓库,一种是存放 SNAPSHOT 的,一种是存放 RELEASE 还有一种是存放 从远程仓库下载的第三方jar包,那么我们在获取资源的时候要从哪个仓库种获取呢? (8)为了方便获取,我们将所有的仓库编成一个组,我们只需要访问仓库组去获取资源。

复制代码
所有私服仓库总共分为三大类:
宿主仓库hosted
    保存无法从中央仓库获取的资源
    自主研发
    第三方非开源项目,比如Oracle,因为是付费产品,所以中央仓库没有
代理仓库proxy
    代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
仓库组group
    将若干个仓库组成一个群组,简化配置
    仓库组不能保存资源,属于设计型仓库
5.2本地仓库访问私服配置

在nexus中创建仓库

配置本地maven对私服的访问权限(修改maven的setting.xml文件)

复制代码
<servers>
<server>
<id>itheima-snapshot</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<id>itheima-release</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
​

配置私服访问路径

复制代码
<mirrors>
<mirror>
<!--配置仓库组的ID-->
<id>maven-public</id>
<!--*代表所有内容都从私服获取-->
<mirrorOf>*</mirrorOf>
<!--私服仓库组maven-public的访问路径-->
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
​
5.3私服资源的上传与下载
  • 配置工程上传私服的具体位置

    复制代码
    ​
    <!--配置当前工程保存在私服中的具体位置-->
    <distributionManagement>
    <repository>
    <!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--
    >
    <id>itheima-release</id>
    <!--release版本上传仓库的具体地址-->
    <url>http://localhost:8081/repository/itheima-release/</url>
    </repository>
    <snapshotRepository>
    <!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码--
    >
    <id>itheima-snapshot</id>
    <!--snapshot版本上传仓库的具体地址-->
    <url>http://localhost:8081/repository/itheima-snapshot/</url>
    </snapshotRepository>
    </distributionManagement>
  • 发布资源到私服

    执行deploy

要发布的项目都需要配置 distributionManagement 标签,要么在自己的pom.xml中配置,要么在其 父项目中配置,然后子项目中继承父项目即可

相关推荐
程序员清风14 分钟前
跳表的原理和时间复杂度,为什么还需要字典结构配合?
java·后端·面试
zxhnext21 分钟前
LLM大语言模型入门
前端·后端
知心宝贝28 分钟前
写了那么久的前端,你真的了解浏览器背后的“小动作“吗?
前端·程序员·浏览器
渣哥28 分钟前
Kafka消息丢失的3种场景,生产环境千万要注意
java
wycode28 分钟前
Vue2实践(2)之用component做一个动态表单(一)
前端·javascript·vue.js
渣哥28 分钟前
ElasticSearch深度分页的致命缺陷,千万数据查询秒变蜗牛
java
Olrookie29 分钟前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot
维李设论29 分钟前
前端智能化 | AG-UI实践及原理浅析
前端·aigc·agent
第七种黄昏30 分钟前
Vue3 中的 ref、模板引用和 defineExpose 详解
前端·javascript·vue.js
一只卡比兽30 分钟前
动态规划与贪心算法详解:原理、对比与代码实践
前端