掘金 后端 ( ) • 2024-04-18 14:27

Maven依赖引入原则

1.路径最短优先 a--b--c2.0 和 a--b--x--c2.3 由于a--b--c2.0路径最短,会导入才c2.0依赖
2.相同路径优先声名 a--b--c2.0 a--d--c3.0 如果b在d之前声名,则会引入才c2.0
3.依赖覆盖 后声名的依赖覆盖先前声名的依赖

依赖覆盖

image.png

谈谈Maven常用标签

  • groupId: 企业网址反写+项目名
  • artifactId 模块名
  • packaging 打包类型
    • <packaging>pom<packaging>
    • <packaging>jar<packaging>
    • <packaging>war<packaging>
  • parent 子项目继承父项目
  • dependencyManagement 统一定义依赖版本
  • optional 默认false 设置为true会隐藏依赖,不让引入了该pom的其他模块知道我用了这个依赖

pom

父级项目的pom文件的打包方式一定是 <packaging>pom<packaging> ,父级的pom文件只对子模块进行整合,其中还有一个非常重要的标签 <modules>,用来管理子模块。 子模块不能使用pom打包

<groupId>com.jingdianjichi</groupId>
<artifactId>jc-club-subject</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<description>鸡翅club-题目领域服务</description>
<modelVersion>4.0.0</modelVersion>

<modules>
    <module>jc-club-subject-api</module>
    <module>jc-club-application</module>
    <module>jc-club-domain</module>
    <module>jc-club-common</module>
    <module>jc-club-infra</module>
    <module>jc-club-starter</module>
</modules>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.4.2</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>

jar

jar是默认的打包方式
maven build 会将这个项目中的所有java文件都进行编译形成.class文件,打包为一个jar文件

war

与jar类似,但是多了一点:会将项目中依赖的所有jar包都放在WEB-INF/lib这个文件夹下,且jar包变成了war包

image.png image.png

spring-boot-dependencies

通过 dependencyManagement 标签预先指定了各个 starter 和其它各个依赖的版本

spring-boot-starter-parent

继承spring-boot-dependencies

#<type>pom</type><scope>import</scope>

适用范围:
一、当一个父项目的pom文件的dependencyManagement标签中需要导入其他pom文件的dependencyManagement时候,两个标签同时使用
二、解决Maven单继承的问题,通过单独使用<type>pom</type>,引入其他pom文件的所有依赖。

一、<type>pom</type><scope>import</scope>同时使用
会导入其他spring-boot-dependencies pom文件中的dependencyManagement所有定义
只会定义一个统一的初始的版本,但是不会真的引入依赖,具体依赖还要在子模块pom文件中引入,但是不用定义版本号(不排除存在未定义版本的依赖,需要自己指定版本) image.png

二、单独使用<type>pom</type>
例如: jc-club-starter模块依赖与jc-club-application-controller模块 image.png

<exclusions>依赖排除

不需要写版本 image.png

optional

project1引入了springbootssm工程
springbootssm工程的spring-boot-starter-web依赖的optional设置为true,project1就看不到了 image.png

image.png

依赖范围 Scope标签取值

image.png
例如:scope为provided的依赖,比如 lombok、mybatis-plus等,只作用于编译阶段,编译完成就没用了,打包时没必要一起打包。
可以用以下方式排除

<build>
    <finalName>${project.artifactId}</finalName>
    <!--打包成jar包时的名字-->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.0.RELEASE</version>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>com.fasterxml.jackson.core</groupId>
                        <artifactId>jackson-databind</artifactId>
                    </exclude>
                </excludes>
            </configuration>

Maven生命周期

每一个任务都对应一个插件 image.png

常用的 Maven 插件:

  1. Maven-clean-plugin:用于清除项目目录中的垃圾文件和临时文件。
  2. Maven-compile-plugin:用于编译项目源代码,生成目标代码。
  3. Maven-dependency-plugin:管理项目依赖关系,可以自动下载依赖库,并解决依赖冲突。
  4. Maven-jar-plugin:用于打包项目,生成 JAR 文件。
  5. Maven-javadoc-plugin:用于生成项目 Javadoc 文档。
  6. Maven-install-plugin:用于安装项目依赖库,可以将依赖库安装到本地仓库中。
  7. Maven-deploy-plugin:用于部署项目,将项目打包成可执行的包,并上传到远程仓库中。
  8. Maven-site-plugin:用于生成项目网站,可以自动生成 HTML 文档,并上传到远程仓库中。
  9. Maven-scm-plugin:用于管理项目版本,可以与版本控制系统集成,实现代码的版本控制。
  10. Maven-release-plugin:用于发布项目,可以将项目打包成可执行的包,并上传到远程仓库中,同时发布版本更新信息。

install的理解:若a项目依赖于b项目,b如果只是package,b.jar仅仅只是打包到了b项目的target目录,使用install命令则是将bjar包安装到了本地仓库,这样a就可以使用b的jar包了。

Maven打包

spring-boot-maven-plugin插件

使用脚手架时,会自动带有 spring-boot-maven-plugin插件

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.swjtu.pyc.springbootssm.SpringbootssmApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    
    标签解释:
<!--execution元素包含了插件执行需要的信息 -->  
<!--goals配置的执行目标 -->  

    7个maven goal
    
-   `build-image: 将程序使用 buildpack 打包进容器镜像中。
-   `build-info:生成项目的构建信息文件
-   `help:显示帮助信息。
-   `repackage:生成可执行的jar包或war包。核心goal。
-   `run:运行 Spring Boot 应用
-   `start:在集成测试阶段,控制生命周期
-   `stop:在集成测试阶段,控制生命周期

作用:

spring-boot-maven-plugin插件,会将依赖的jar包全部打包进去。该文件包含了所有的依赖和资源文件,可以直接在命令行或者传统的 Java Web 服务器上启动运行。

直接通过java -jar 包名 就可启动

Maven版本

<version>1.0-SNAPSHOT</version> SNAPSHOT表示快照版本,开发中
<version>1.0-RELEASE</version> RELEASE表示稳定版

Nexus配置

哎,找到工作在说!