maven高级

发布时间:2023年12月21日

分模块设计与开发:

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

分析:

拆分后的格式:

?? ?步骤:

  • 创建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文件里面引入依赖。

<!--引入依赖-->
    <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模块:

    <!--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标签中的。

? ? ? ??

代码:?

    <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:

代码:

<!--依赖管理-->
    <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标签中,引入需要传递的依赖。

    <!--    直接依赖 子工程直接引入-->
    <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 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> 设置当前聚合工程所包含的子模块名称。

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

?

代码:

<!--    聚合工程-->
    <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配置文件中配置:

  <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标签中配置。

<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标签里面,指定快照版本依赖。

<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文件中配置:

   <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,重启项目。

???????

文章来源:https://blog.csdn.net/weixin_64502989/article/details/135111666
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。