maven高级

分模块设计与开发:

  • 都写在一个模块里面。使的各模块之间不便于维护,并且难以复用。
  • 将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享。

分析:

拆分后的格式:

步骤:
  • 创建maven模块 tlias-pojo,存放实体类。
  • 创建maven模块 tlias-utils,存放相关工具类。

注意:

1,我们创建新的module(模块的时候,要把我们新的模块的包名,改成和未拆分前一样的包名)

创建一个新的空工程 web-project4:

空工程jdk的配置:

配置jdk21版本:

把我们之前写好的 tlias-management。放在刚刚创建的web-project4。空工程中

打开ideal:

开始拆分:

把pojo包下的,类重新创建一个模块,拆分过去(创建新的module然后放到新模块的pojo包下)新建 tlias-pojo模块

tlias-pojo模块创建好,的样子。

然后定义 com.sde.pojo包,这个包和未拆分前项目的包路径保持一致。

把要拆分的项目,pojo包下的类赋值到刚刚创建的,新模块 tlias-pojo 的pojo包下

可以发现很多爆红的地方。

在 tlias-pojo模块下的 pom文件里面引入依赖。

XML 复制代码
<!--引入依赖-->
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.30</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
    </dependencies>

在此查看实体类,发现不报错了。

删除要拆分模块的pojo包

项目报错:

引入 tlias-pojo模块:

XML 复制代码
    <!--tlias-pojo-->
        <dependency>
            <groupId>com.sde</groupId>
            <artifactId>tlias-pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

现在就不报错了

把要拆分工程的utils包,也拆分开。

创建新的tlias-utils新模块

重复上面的步骤,创建com.sde.utils包,把要拆分工程utis包下的类,复制到tlias-utils模块下的utils包。

引入依赖:

引入好依赖,就不报错了。

然后,把父工程中的com.sde.utils包删除,引用tilas-utils模块下的utils包

引入依赖。

现在就不报错了。

启动项目测试:

注意:
  • 分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分
  • 因为这次我们是为了演示拆分,后面写项目肯定是先设计好,才写代码的。

继承与聚合:

继承:

概念:

继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。

作用:

简化依赖配置、统一管理依赖

实现:

<parent> ... </parent>

java中打包方式:
  • jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
  • war:普通web程序打包,需要部署在外部的tomcat服务器中运行
  • pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理
实现步骤:

①. 创建maven模块tlias-parent,该工程为父工程,设置打包方式pom(默认jar)。

②. 在子工程的pom.xml文件中,配置继承关系。

③. 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)。

1,新建tlias-parent模块作为父工程,把父工程的打包方式设置为pom:

父工程添加spring boot的父依赖。

其他三个子工程,tlias-utils和tlias-pojo和tlias-mangement继承父工程(tlias-parent)

在tlias-pojo引入父工程依赖。

引入后:

在tlias-utils模块中,引入父工程依赖。

在tlias-management子工程中,引入tilas-parent依赖。

把,子工程中共有的依赖,提取到父工程,然后删除,子工程中共有的依赖。

先删了 tlias-pojo里面的。

删除tlias-utils子工程里面的。

删除tlias-management子工程里面的依赖。

由于我们的三个子工程依赖了,父工程tlias-parent。所以我们在右侧的maven中,看看三个子工程中是否有,父工程中的依赖。

版本锁定:

在maven中,可以在父工程的pom文件中通过 <dependencyManagement> 来统一管理依赖版本。

注意:子工程引入依赖时,无需指定 <version> 版本号,父工程统一管理。变更依赖版本,只需在父工程中统一变更。

自定义属性/引用属性
  • 1,在父工程引入dependcyManagement标签,进行版本管理,里面填写我要进行集中依赖。
  • 2,父工程里面的properties标签中,定义需要进行版本管理的依赖。里面填写的是我定义此依赖的版本号。
  • 在dependcyManagement标签中,替换掉版本号(用properties标签中定义的版本号)
  • 在dependencis标签中,引入需要的依赖,版本号,引用定义在properties标签中的。

代码:

XML 复制代码
    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--        自定义属性-->
        <springboot.version>3.2.0</springboot.version>
        <lombok.version>1.18.30</lombok.version>
        <jwt.version>0.9.0</jwt.version>
        <aliyun.sdk.oos.version>3.15.1</aliyun.sdk.oos.version>
        <jaxb.api.version>2.3.1</jaxb.api.version>
        <activation.version>1.1.1</activation.version>
        <javaxb.runtime.version>2.3.3</javaxb.runtime.version>
    </properties>

使用dependcyManagement:

代码:

XML 复制代码
<!--依赖管理-->
    <dependencyManagement>
        <dependencies>
            <!--jwt-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
              <version>${jwt.version}</version>
            </dependency>
            <!--阿里云oss-->
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>${aliyun.sdk.oos.version}</version>
            </dependency>
            <!--        jdk1.9版本以上需要额外加上面三个依赖-->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>${jaxb.api.version}</version>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
                <version>${activation.version}</version>
            </dependency>
            <!-- no more than 2.3.3-->
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>${javaxb.runtime.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

在父工程 dependcies标签中,引入需要传递的依赖。

XML 复制代码
    <!--    直接依赖 子工程直接引入-->
    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!--spring的基础依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${springboot.version}</version>
        </dependency>
    </dependencies>

总体预览:

父工程pom的整体代码:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.sde</groupId>
    <artifactId>tlias-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--        自定义属性-->
        <springboot.version>3.2.0</springboot.version>
        <lombok.version>1.18.30</lombok.version>
        <jwt.version>0.9.0</jwt.version>
        <aliyun.sdk.oos.version>3.15.1</aliyun.sdk.oos.version>
        <jaxb.api.version>2.3.1</jaxb.api.version>
        <activation.version>1.1.1</activation.version>
        <javaxb.runtime.version>2.3.3</javaxb.runtime.version>
    </properties>

    <!--    直接依赖 子工程直接引入-->
    <dependencies>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <!--spring的基础依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>${springboot.version}</version>
        </dependency>
    </dependencies>

    <!--依赖管理-->
    <dependencyManagement>
        <dependencies>
            <!--jwt-->
            <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>${jwt.version}</version>
            </dependency>
            <!--阿里云oss-->
            <dependency>
                <groupId>com.aliyun.oss</groupId>
                <artifactId>aliyun-sdk-oss</artifactId>
                <version>${aliyun.sdk.oos.version}</version>
            </dependency>
            <!--        jdk1.9版本以上需要额外加上面三个依赖-->
            <dependency>
                <groupId>javax.xml.bind</groupId>
                <artifactId>jaxb-api</artifactId>
                <version>${jaxb.api.version}</version>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
                <version>${activation.version}</version>
            </dependency>
            <!-- no more than 2.3.3-->
            <dependency>
                <groupId>org.glassfish.jaxb</groupId>
                <artifactId>jaxb-runtime</artifactId>
                <version>${javaxb.runtime.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>



</project>

把子工程的依赖版本号去掉:

测试:

我就以jwt令牌为例,测试。改变版本号,子工程里面依赖的版本号是否会变化。

现在把jwt令牌改成0.9.1测试看效果:

可以发现所有的jwt令牌,版本全都变成0.9.1

我在把jwt令牌,的版本改成 0.9.0 看看其他子工程是否有变化。

启动测试:

dependcies和dependcyManagement的区别:
  • <dependencies> 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。
  • <dependencyManagement> 是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)
聚合:

创建tlias-parent父工程:

由于父工程,只存在pom文件即可。把其他的src目录删掉即可。

加入我们要打包,tlias-management此模块, 但是我们发现每次打包packing都会报错,原因是我们在此pom文件中,引用了tlias-pojo模块,tlias-utils模块,这些文件。在我们的本地仓库都没有,所有就报错了。解决办法还需要先把引用到的模块先install,安装到本地仓库。

测试非聚合打包:

1,禁用单元测试:

2,在tlias-management工程中点击打包(packing)。

可以发现,无法正常打包,我们需要把tlias-pojo和tlias-utils先install安装到本地才可以。

先安装tlias-pojo模块。

看看我们本地的maven仓库有没有,多的tlias-pojo包。

我们在测试tlias-management的打包。

可以看到还是打包失败了。

tlias-utils模块进行install安装。

把我们的父工程tlias-parent也安装到本地:

在我本地的maven仓库查看:

点击测试打包tlias-management工程:

打包成功了

聚合:

将多个模块组织成一个整体,同时进行项目的构建。

聚合工程:

不具有业务功能的"空"工程(有且仅有一个pom文件)

就是父工程里面之后一个pom.xml配置文件

作用:

快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)
可以发现,我们使用这种继承各个模块 ,要是想打包显得很麻烦,所以我们需要使用聚合工程。

maven中可以通过 <module> 设置当前聚合工程所包含的子模块名称。

这是在父工程里面添加的。

代码:

XML 复制代码
<!--    聚合工程-->
    <modules>
        <module>../tilas-management</module>
        <module>../tlias-pojo</module>
        <module>../tlias-utils</module>
    </modules>

效果:

我们在继承的时候,交父工程,在聚合的时候交聚合工程。

注意:

聚合工程中所包含的模块,在构建时,会自动根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。

现在我们把我们本地的maven仓库,刚刚安装(install)好的,那三个文件删除。在对tlias-management进行打包。

删除后:

前面已经看到,聚合之后,其他三个子工程已经归属到,tlias-paretn工程下了,所以我们点击此模块的package:

点击打包:

在idea查看效果:

私服:

介绍:

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题

依赖查找顺序:
  • 本地仓库
  • 私服
  • 中央仓库
资源上传与下载:
项目版本:
  • RELEASE(发行版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。
  • SNAPSHOT(快照版本):功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中
资源上传和下载的步骤:
  • 1,设置私服的访问用户名/密码。maven中conf文件夹下的(settings.xml中的servers中配置)。
  • 2,在 mirrors 中只配置我们自己私服的连接地址(如果之前配置过阿里云,需要直接替换掉)。
  • 3,需要在 profiles 中,增加如下配置,来指定snapshot快照版本的依赖,依然允许使用。
  • 4,如果要把项目上传到自己的私服,需要在pom.xml文件中增加如下配置,来配置项目发布的地址(也就是私服的地址)

1,在setting.xml配置文件中配置:

XML 复制代码
  <servers>
    <!-- server
     | Specifies the authentication information to use when connecting to a particular server, identified by
     | a unique name within the system (referred to by the 'id' attribute below).
     |
     | NOTE: You should either specify username/password OR privateKey/passphrase, since these pairings are
     |       used together.
     |
    <server>
      <id>deploymentRepo</id>
      <username>repouser</username>
      <password>repopwd</password>
    </server>
    -->
      <server>
        <id>maven-releases</id>
        <username>admin</username>
        <password>admin</password>
      </server>
        
      <server>
        <id>maven-snapshots</id>
        <username>admin</username>
        <password>admin</password>
      </server>

    <!-- Another sample, using keys to authenticate.
    <server>
      <id>siteServer</id>
      <privateKey>/path/to/private/key</privateKey>
      <passphrase>optional; leave empty if not used.</passphrase>
    </server>
    -->
  </servers>

2,在maven的settings.xml文件中的,mirrors标签中配置。

XML 复制代码
<mirrors>
	 <!-- 阿里云仓库 -->
  <!--   <mirror>
        <id>alimaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror> -->

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

3,在maven的settings.cml配置文件中的profiles标签里面,指定快照版本依赖。

XML 复制代码
<profiles>
    <profile>
        <id>allow-snapshots</id>
        <activation>
          <activeByDefault>true</activeByDefault>
        </activation>
    <repositories>
        <repository>
            <id>maven-public</id>
            <url>http://localhost:8081/repository/maven-public/</url>
            <releases>
              <enabled>true</enabled>
            </releases>
            <snapshots>
              <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>


  </profiles>

回到idea重新加载一下:

在父工程的pom.xml文件中配置:

XML 复制代码
   <distributionManagement>
        <!-- release版本的发布地址 -->
        <repository>
            <id>maven-releases</id>
            <url>http://localhost:8081/repository/maven-releases/</url>
        </repository>

        <!-- snapshot版本的发布地址 -->
        <snapshotRepository>
            <id>maven-snapshots</id>
            <url>http://localhost:8081/repository/maven-snapshots/</url>
        </snapshotRepository>
    </distributionManagement>

在我们的maven中,通过deploy生命周期(发布即可),跳过单元测试。

点击:tlias-parent父工程的deploy,进行上传:

上传成功后,在我们自己的私服查看。

进入到快照版本后,就能看到了。

本地maven仓库也能看到:

我们在本地maven仓库删掉,这三个tilas-开头的文件,看看私服会变化吗?

在浏览器刷新一下:maven-snapshots快照版本

查看:maven-public:

更改快照版本,上传到发行版本:

刚刚我们上传的,为啥上传到了 maven-snapshots(快照版了呢)

查看tlias-parent的pom文件可知

  • 我们默认的版本就是,SNAPSHOT(快照版)
  • 我们要想上传到发行版,把这些版本后缀改成 RELEASE(发行版)

改成发行版,在测试一次。

要把父子工程里面的所有,版本从snapshot(快照版),改成release(发行版)

修改tlias-parent模块的版本:

修改tlias-mangement的发行版本:

我们发现,tlias-management工程下,引用了,tlias-pojo和tlias-utils两个模块。

修改:tlias-pojo模块

修改tlias-utils模块:

在回过头来看tlias-management工程引入的tlias-pojo和tlias-utils是否报错:

在父工程下,点解 deploy开始上传。这次是上传到maven-release(发行版)

上传成功后,刷新浏览器地址栏查看。

查看我们maven的本地仓库:

nexus私服的使用:

Nexus是一个用于管理和分发软件包的开源仓库管理器。它提供了一个集中化的存储库,可以用来存储和共享各种类型的软件包,包括Java库、Docker镜像、Maven构建等。

1,先解压,nexus压缩包:

2,点击 bin目录里面的start.bat启动:

3,启动时间可以会很长,

4,在浏览器地址栏,输入 nexus的访问地址:http://localhost:8081

登录测试:

我先输入 用户:admin 密码:111111 (进行错误测试)

在输入正确的账号和密码进行测试:

查看登录之后的效果:

查看控制台:

上传完成后,记得要把我们maven的settings.xml配置文件里面的东西删掉或者注释掉

1,添加在 servers标签里的 配置私服的个人凭证

2,配置在mirrors里面我们私服的连接地址(记得把阿里云私服打开)

3,配置在profiles里面的指定快照版本的依赖

4,还有我刚刚演示的tlias-parent里面的pom文件(上传到我们自己私服的)

1,注释servers标签里面的:

2,注释mirrors标签里的:

注释掉,profiles:

然后开idea,重新加载。

在tlias-parent的pom文件里面,注释。

刷新maven,重启项目。

​​​​​​​

相关推荐
雨中飘荡的记忆2 分钟前
深入理解设计模式之装饰者模式
java·设计模式
雨中飘荡的记忆7 分钟前
秒杀系统设计与实现
java·redis·lua
y***13649 分钟前
【wiki知识库】07.用户管理后端SpringBoot部分
spring boot·后端·状态模式
18你磊哥17 分钟前
chromedriver.exe的使用和python基本处理
开发语言·python
小坏讲微服务31 分钟前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发
过客随尘37 分钟前
Spring AOP以及事务详解(一)
spring boot·后端
老鼠只爱大米41 分钟前
Java设计模式之外观模式(Facade)详解
java·设计模式·外观模式·facade·java设计模式
闲人编程43 分钟前
Python的抽象基类(ABC):定义接口契约的艺术
开发语言·python·接口·抽象类·基类·abc·codecapsule
vx_dmxq2111 小时前
【微信小程序学习交流平台】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·python·mysql·微信小程序·小程序·idea
9号达人1 小时前
优惠系统演进:从"实时结算"到"所见即所得",前端传参真的鸡肋吗?
java·后端·面试