当前位置: 首页 > article >正文

Maven 知识点总结

文章目录

    • 核心点:
    • Maven 能做什么?
    • Maven的安装
      • 1、安装
      • 2、配置文件
    • Maven 的概念
      • 1、坐标:通过坐标唯一定位
      • 2、scope依赖范围
      • 3、maven的传递性依赖性质
      • 4、optional可选依赖
      • 5、exclusion排除依赖
      • 6、properties归类依赖
      • 7、优化依赖
    • Maven基本使用
      • 1、常用命令
    • 仓库
      • 1、Maven仓库
      • 2、仓库的分类
      • 3、本地仓库
      • 4、远程仓库
      • 5、如何配置指定远程仓库
      • 6、如何通过用户名和密码访问远程仓库
      • 7、如何把本地项目部署到远程仓库?
      • 8、如何配置镜像
      • 9、快照版本
    • 插件
      • 1、三套生命周期
      • 2、Maven插件
      • 3、常用插件
        • springboot 项目打包插件
        • 项目编译插件
        • docker 插件
        • 打 war 包插件
        • tomcat 插件
    • 聚合与继承
      • 1、聚合:<module>标签
      • 2、继承:<parent> 标签
      • 3、父子pom的依赖管理:<dependencyManagement>
      • 4、超级pom
      • 5、约定优于配置
    • 最佳实践

核心点:

1、仓库,私服,repository,servers,mirror 标签
2、dependencyManagement,父子 pom
3、依赖传递规则:1、最短路径,2、路径长度相同时,使用写在上面的

Maven 能做什么?

Maven 是项目构建和依赖管理工具,提供仓库(公共和私服),提供插件(扩展功能)
项目构建简单点理解就是把源码,编译,生成 jar 包或者 war 包的过程。
依赖管理就是项目中依赖的各种 jar 包,Maven 能用简单的方式对这个依赖 jar 包进行管理

Maven的安装

1、安装

maven 的安装非常简单,参考官网文档:https://maven.apache.org/install.html

1、安装好 jdk,设置好 JAVA_HOME 环境变量,指向 jdk的安装目录。或者让 java 命令在任何目录都能执行

2、解压Maven安装包

unzip apache-maven-3.9.1-bin.zip

或者

tar xzvf apache-maven-3.9.1-bin.tar.gz

3、在环境变量中设置 Maven

mac 或者 Linux 环境:执行命令 vim ~/.bash_profile 编辑文件

export MAVEN_HOME=/Users/awesome/tools/apache-maven-3.8.2
export PATH=$MAVEN_HOME/bin:$GRADLE_HOME/bin:$PATH

保存后,执行 source ~/.bash_profile,然后执行 mvn -v ,看能否成功打印 Maven 信息

2、配置文件

Maven 的安装目录下的 /conf/settings.xml

Maven 的概念

1、坐标:通过坐标唯一定位

groupId(必须定义):不关键,比如com.dianping.zebra,或者 com.sankuai.meituan
artifactId必须定义:项目中的一个模块,推荐用模块名,比如xy-trade-microloan-thrift-api,或者 zebra-client
version(必须定义):版本,比如 2.9.2-SNAPSHOT
packaging(可选定义):定义了maven的打包方式,不定义packaging时默认jar包,当然也可以定义war包
scope(可选定义):作用范围,默认为compile。如果test,表示只能在测试代码中import该依赖,主代码依赖会报错
classifier(不能直接定义):定义一些附属组件,比如【javadoc文档】和【sources源代码】

依赖:用于描述一个依赖的 jar 包,在 pom.xml 文件中定义

<dependency>
	<groupId>commons-io</groupId>
	<artifactId>commons-io</artifactId>
	<version>2.4</version>
</dependency>
<dependency>
   <groupId>org.powermock</groupId>
   <artifactId>powermock-api-mockito2</artifactId>
   <version>2.0.2</version>
   <scope>test</scope>
</dependency>
<dependency>
  <groupId>it.lianyangguorong</groupId>
  <artifactId>codec</artifactId>
  <version>1.0</version>
  <scope>system</scope>
  <!-- 本地依赖 -->
  <systemPath>${basedir}/lib/lianyangguorong/commons-codec-sdk-1.0-SNAPSHOT.jar</systemPath>
</dependency>

:依赖范围,compile,test,provided,runtime,system,import

2、scope依赖范围

概述:用来控制依赖与这三种classpath(编译,测试,运行)的关系,有以下几种选择
compile(默认):在【编译,测试,运行】时都使用该依赖。比如spring-core(都需要用到)
test:只对【test文件夹下】有效,比如JUnit,mockito(只有在单元测试才用到这些依赖)
provided:已提供该依赖。对于【编译和测试】有效。在运行时无效,比如 servlet-api,编译和测试的时候需要,运行的时候由于容器已经提供,就不需要了。
runtime:对【测试和运行】有效,编译主代码时无效。典型的例子是JDBC驱动实现
system:类似provided,但是要通过systemPath 指定文件路径
import:导入依赖范围,后面解释dependencyManagement时再介绍

3、maven的传递性依赖性质

何为依赖传递:【我的项目A】依赖【spring-core】,【spring-core】pom.xml中依赖【commons-logging】。则 【我的项目A】依赖【commons-logging】
依赖传递的范围:【我的项目A】依赖scope=test【spring-core】,【spring-core】依赖scope=compile【commons-logging】。则【我的项目A】依赖scope=test【commons-logging】

依赖的规则:第一原则优先,相同则采用第二原则
第一原则:依赖路径越短越优先。比如:A->B->C->X(1.0);A->D->X(2.0)。由于X(2.0)的路径短,X(2.0)会被解析使用
第二原则:看pom.xml中的依赖顺序,谁写在上面谁先依赖。比如A->B->Y(1.0);A->C->Y(2.0)。如果pom.xml文件中B写在C的上面,则Y(1.0)会被解析使用

4、optional可选依赖

配置 true ,则该依赖为【可选依赖】
【可选依赖】有什么用:不具有传递性
比如:A->B,B->mysql.jar(可选),B->oracle.jar(可选)
则依赖不会传递,即 A不会依赖mysql.jar和oracle.jar。换句话说:项目里没有mysql.jar和oracle.jar不会对A产生任何影响
为什么要【可选依赖】
假如项目B实现了两个特性,其中的特性一依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用这两个特性
比如B是一个持久层隔离工具包,特性一用于mysql,特性二用于oracle,这两者是互斥的,究竟用哪个,让用户自己来手动选(手动引入)
例子:B的pom.xml,用户如果要用mysql的jar包,需要在A中自己手动引

<dependencies>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.10</version>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>8.4-701.jdbc3</version>
    <optional>true</optional>
  </dependency>
</dependencies>

A 的 pom.xml

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.10</version>
  <optional>true</optional>
</dependency>

5、exclusion排除依赖

假如项目里有个第三方依赖,该依赖还依赖了另一个1.0.0-SNAPSHOT版本的库,那么该1.0.0-SNAPSHOT就会成为当前项目的传递性依赖。此时我想排除该依赖,则要使用标签

需要注意的是:声明exclusion时候只需要groupId和artifactId,不需要version(显然,根据前两者就可以在pom.xml中唯一确定一个Maven坐标了)

6、properties归类依赖

假如项目里有很多Spring Framework的依赖(如下),你希望保持它们版本号一致,并且统一管理它们的版本
org.springframework:spring-core:2.5.6
org.springframework:spring-beans:2.5.6
org.springframework:spring-context:2.5.6
org.springframework:spring-context-support:2.5.6
使用标签

7、优化依赖

可以通过命令查看项目中的所有依赖和依赖关系
显示所有已解析依赖:mvn dependency:list
查看解析后的依赖树:mvn dependency:tree
分析当前的项目依赖:mvn dependency:analyze

一般在 idea 中安装 Maven Helper ,方便可视化查看依赖关系

Maven基本使用

1、常用命令

mvn clean:清理 target/目录
mvn compile:编译项目主代码,生成 class 文件到 target/classes 目录
mvn test:执行单元测试
mvn package:打包,如果POM中没有指定,默认打jar包,位于target/目录中
mvn install:将jar包安装到本地仓库
mvn deploy: 将 jar包部署到远程仓库

仓库

1、Maven仓库

何为仓库:Maven将所有构建完成的jar包安装部署到Maven本地仓库(本地电脑上的一个文件夹),所有项目可以共用

2、仓库的分类

只分为两类:【本地仓库】和【远程仓库】,一个用户只有一个【本地仓库】,但是可以配置多个【远程仓库】,远程仓库中,一般公司会提供私服仓库

jar查找规则
(1)先从【本地仓库】找
(2)找不到再去【远程仓库】下载到【本地仓库】
(3)如果都没有则报错

3、本地仓库

默认配置下,【本地仓库】的路径为:用户目录/.m2/repository/…
比如Windows:C:\Users\jyy.m2\repository\

如何更改【本地仓库】地址?
修改 $MAVEN_HOME/conf/settings.xml ,增加一行 标签配置。

<localRepository>/Users/xxxx/tools/maven_repository</localRepository>

如何安装【本地Maven项目】到【本地仓库】?
命令:mvn install

4、远程仓库

中央仓库:
Maven自带的远程仓库,包含了绝大部分开源的构件:https://mvnrepository.com/
Maven的安装文件自带【中央仓库】的配置,可以通过 $MAVEN_HOME/lib/maven-model-builder-3.0.jar中的 org/apache/maven/model/pom-4.0.0.xml看到,该pom文件是一个超级POM,所有Maven项目都会继承

私服:架设在局域网内,代理外部广域网上的远程仓库
jar包查询规则:先找【本地仓库】,再找【私服】,找不到再找【远程仓库】

为什么需要私服:
有些jar包是公司内部用的,不开源,可以放在私服
如果Internet不稳定,私服提高了稳定性

比较著名的有:Nexus

5、如何配置指定远程仓库

在pom.xml中添加 标签
:必须是唯一的,Maven自带的中央仓库使用的id为central,如果其他仓库id声明也使用central,则会覆盖中央仓库的配置
:名称,随便去取
:仓库地址,一般是http协议格式,可以在浏览器中打开
和标签
snapshots的为false,表示不允许从 JBoss仓库下载【快照版本】的jar包
releases 的 为true,表示可以从 JBoss仓库下载【发布版本】的jar包
:从Maven远程仓库检查更新的频率,3种选择
never(从不检查更新)
always(每次都检查)
X(每隔X分钟检查一次)
:检查策略,3种选择
warn(出错则输出warn警告)
fail(出错则构建失败)
ignore(完全忽略检验失败)
:default表示仓库的布局是Maven2和Maven3的默认布局

  <profiles>
    <profile>
      <id>company_profile</id>
      <repositories>
        <repository>
          <id>my_maven_repository</id>
          <name>Nexus</name>
          <url>http://nexus.xxxxx.com/repository/maven/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>my_maven_repository</id>
          <name>Nexus</name>
          <url>http://nexus.xxxxx.com/repository/maven/</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>company_profile</activeProfile>
  </activeProfiles>

6、如何通过用户名和密码访问远程仓库

settings.xml中配置 标签。需要注意的是,必须与前面pom.xml中的id相同

  <servers>
    <server>
      <username>xxxxxx</username>
      <password>password</password>
      <id>my_maven_repository</id>
    </server>
  </servers>

7、如何把本地项目部署到远程仓库?

在项目的 pom.xml 文件中,增加以下配置

<distributionManagement>
    <repository>
        <id>myCompany-nexus-releases</id>
        <name>myCompany Nexus Repository</name>
        <url>http://xxx.xxxxxxx.com/repository/releases</url>
    </repository>
    <snapshotRepository>
        <id>myCompany-nexus-snapshots</id>
        <name>myCompany Nexus Repository</name>
        <url>http://xxx.xxxxxxx.com/repository/snapshots</url>
    </snapshotRepository>
</distributionManagement>

表示:releases版本的仓库地址
表示:snapshots版本的仓库地址
标签必须要与 settings.xml中的id一致
需要注意的是,如果repository需要用户名密码的话,需要在 settings.xml 中配合标签使用

settings.xml文件内容:

  <servers>
    <server>
      <username>xxxxx</username>
      <password>password</password>
      <id>myCompany-nexus-releases</id>
    </server>
    <server>
      <username>xxxxx</username>
      <password>password</password>
      <id>myCompany-nexus-snapshots</id>
    </server>
  </servers>

配置好之后:mvn clean deploy 命令会自动部署到远程仓库

8、如何配置镜像

比如中央仓库在外网,国内访问比较慢,可以配置中央仓库的国内镜像,相当于是覆盖了中央仓库的地址
何为镜像:就比如,阿里云提供了Maven仓库的国内镜像,国内用户下载起来会更快(https://maven.aliyun.com/repository/public)
在settings.xml中配置标签,代替某些的url
例1:下图的为central,表示用该url替代了【Maven中央仓库】,所有去中央仓库的请求都会转到该url

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>central</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

例2:下图的为*,表示用该url替代了所有的配置,所有配置的都会转到该url镜像

<mirrors>
  <mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
  </mirror>
  <mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云谷歌仓库</name>
    <url>https://maven.aliyun.com/repository/google</url>
  </mirror>
  <mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云spring仓库</name>
    <url>https://maven.aliyun.com/repository/spring</url>
  </mirror>
  <mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云gradle-plugin</name>
    <url>https://maven.aliyun.com/repository/gradle-plugin</url>
  </mirror>
</mirrors>

如果该镜像需要认证,则去settings.xml中配置即可

的用法
* :匹配所有远程仓库
external:* :匹配所有远程仓库,但是 locolhost 和 file://协议的除外,即匹配所有不在本机上的远程仓库
repo1, repo2 :匹配 repo1 和 repo2
*, !repo1 :匹配所有远程仓库, repo1除外(感叹号表示排除)

9、快照版本

为何需要snapshot版本?快照版本的依赖,上传到仓库后,都会带着时间戳属性。当别人拉取依赖时,如果发现有更新时间戳的,Maven 就会重新拉取。默认更新频率是 1 天一次,可以修改仓库配置的 undatePolicy 调整。也可以使用命令 mvn clean install-U

插件

1、三套生命周期

maven的生命周期,可以理解为 Maven 为构建项目规定的动作,具体的动作由插件完成。
maven拥有3套相互独立的生命周期:分别是 clean(清理项目),default(构建项目),site(建立项目站点)

clean生命周期:主要用于清理项目

pre-clean:执行清理前需要完成的工作
clean:清理上一次构建生成的文件
post-clean:执行清理后需要完成的工作

default声明周期:三套生命周期中最核心的部分

  • 验证和初始化
    • 2.1)validate
    • 2.2)initialize
  • src/main/resources 处理和编译
    • 2.3)generate-sources
    • 2.4)process-sources:处理项目的主资源文件:一般来说,对src/main/resources 目录的内容进行变量替换等工作,复制到项目输出的主classpath目录中
    • 2.5)generate-resources
    • 2.6)process-resources
    • 2.7)compile:编译项目的主源码:一般来说,是编译 src/main/java 目录下的Java文件至项目输出的主classpath目录中
    • 2.8)process-classes
  • src/test/resources 处理和编译
    • 2.9)generate-test-sources
    • 2.10)process-test-sources:处理项目的测试资源文件:一般来说,对src/test/resources 目录的内容进行变量替换等工作,复制到项目输出的测试classpath目录中
    • 2.11)generate-test-resources
    • 2.12)process-test-resources
    • 2.13)test-compile:编译项目的测试源码:一般来说,是编译 src/test/java 目录下的Java文件至项目输出的测试classpath目录中
    • 2.14)process-test-classes
  • 运行测试代码
    • 2.15)test:使用单元测试框架进行测试,测试代码不会被打包或者部署
  • 打包,安装,部署
    • 2.16)prepare-package
    • 2.17)package:接受编译好的代码,打包可发布的格式,比如jar
    • 2.18)pre-integration-test
    • 2.19)integration-test
    • 2.20)post-integration-test
    • 2.21)verify
    • 2.22)install:将包安装到Maven本地仓库,供本地其他Maven项目使用
    • 2.23)deploy:将包部署到远程仓库

site声明周期:主要目的是建立和发布项目站点
pre-site
site
post-site
site-deploy:将生成的项目站点发布到服务器上

2、Maven插件

Maven的核心仅仅是定义了生命周期,具体的任务由插件完成。

什么是插件目标
compiler:compile(maven-compiler-plugin的compile目标)
surefire:test(maven-surefire-plugin的test目标)

插件绑定

为了让用户不需要配置就能构建Maven项目,Maven在其主要生命周期绑定了很多插件的目标,比如常见的 clean,compile,package

插件配置参数
(1)命令行配置(常用)
常见形式:使用-D参数,伴随 key=value 形式

mvn install -Dmaven.test.skip=true

(2)pom.xml中全局配置

比如,配置compile时生成java1.8的字节码文件

<properties>
  <java.version>1.8</java.version>
  <maven.compiler.source>${java.version}</maven.compiler.source>
  <maven.compiler.target>${java.version}</maven.compiler.target>
</properties>

3、常用插件

springboot 项目打包插件

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

项目编译插件

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.3.2</version>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
  </configuration>
</plugin>

docker 插件

jib-maven-plugin

<plugin>
                <groupId>com.google.cloud.tools</groupId>
                <artifactId>jib-maven-plugin</artifactId>
                <version>2.8.0</version>
                <configuration>
                    <allowInsecureRegistries>true</allowInsecureRegistries>
                    <!--from节点用来设置镜像的基础镜像,相当于Docerkfile中的FROM关键字-->
                    <from>
                        <!--使用openjdk官方镜像,tag是:8-jdk-alpine,表示镜像的操作系统是alpine,装好了jdk8-->
                        <image>openjdk:8-jdk-alpine</image>
                    </from>
                    <to>
                        <!--镜像名称和tag,使用了mvn内置变量${project.version},表示当前工程的version-->
                        <image>${docker.registry.url}/${docker.registry.name}/${project.artifactId}:${project.version}
                        </image>
                        <tags>
                            <!--版本号-->
                            <tag>${project.version}</tag>
                        </tags>
                        <!--harbor的认证信息-->
                        <auth>
                            <username>${docker.registry.username}</username>
                            <password>${docker.registry.password}</password>
                        </auth>
                    </to>
                    <!--容器相关的属性-->
                    <container>
                        <jvmFlags>
                            <!--一些启动参数-->
                            <jvmFlag>-Djava.security.edg=file:/dev/./urandom</jvmFlag>
                        </jvmFlags>
                        <!--挂载volume的配置-->
                        <volumes>
                            <volume>/tmp</volume>
                            <volume>/logs</volume>
                        </volumes>
                        <ports>
                            <!--暴漏端口号-->
                            <port>8080</port>
                        </ports>
                        <!--微服务的启动类-->
                        <mainClass>com.heima.learn.storage.StorageApplication</mainClass>
                        <format>OCI</format>
                        <!--使用该参数将镜像的创建时间与系统时间对其-->
                        <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                    </container>
                </configuration>
                <executions>
                    <!--执行打包配置-->
                    <execution>
                        <id>jib-maven-plugin</id>
                        <phase>package</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                    </execution>
                </executions>
</plugin>

docker-maven-plugin

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.33.0</version>
    <executions>
        <!--如果想在项目打包时构建镜像添加-->
        <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
                <goal>build</goal>
            </goals>
        </execution>
    </executions>
</plugin>

打 war 包插件

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.6</version>
  <configuration>
    <warName>project_name</warName>
  </configuration>
</plugin>

tomcat 插件

本地不想安装 Tomcat 的可以使用这个插件

<plugin>
  <groupId>org.apache.tomcat.maven</groupId>
  <artifactId>tomcat7-maven-plugin</artifactId>
  <version>2.2</version>
  <configuration>
    <port>8088</port>
    <path>/</path>
    <server>tomcat-development-server</server>
    <useTestClasspath>true</useTestClasspath>
  </configuration>
</plugin>

聚合与继承

1、聚合:标签

比如:存在两个同级的子模块,可以用一个【主pom.xml】管理多个【子pom.xml】
例如来自zebra项目的主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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dianping.zebra</groupId>
    <artifactId>zebra-all</artifactId>
    <packaging>pom</packaging>
    <version>2.9.1</version>
    <name>zebra-all</name>
    <organization>
        <name>Meituan Dianping</name>
        <url>http://www.dianping.com/</url>
    </organization>
    <modules>
        <module>zebra-dao</module>
        <module>zebra-sample</module>
        <module>zebra-admin-web</module>
        <module>zebra-cat-client</module>
        <module>zebra-client</module>
    </modules>
    <description>zebra</description>

需要用到的标签
:主pom文件必须声明为pom,否则无法构建(但子pom文件可以不声明packaging,因为默认为jar)
:内容为【子pom文件】中的 ,即子项目名称

父模块与子模块的结构
父子结构:最常用的目录结构
平行结构:不太常用,父pom中中的路径需要变化,子 pom中的 parent 中需要通过指定父 pom.xml 的位置

2、继承: 标签

为什么要聚合与继承:在所有子模块的【子pom】中,往往会写重复的依赖配置,比如spring-core, spring-beans等等
【子pom】如何继承【父pom】:标签

需要注意的是:一般采用【父子目录结构】无需声明,默认值是 …/pom.xml

3、父子pom的依赖管理:

默认情况下,父 pom 中定义的依赖,会被子 module 中完全继承。这样会存在问题,如果子 module 中不想完全继承父依赖,怎么处理?由此引入
能让子模块有选择的引用父模块的依赖
父模块的pom.xml:

<properties>
  <commons-beanutils.version>1.8.3</commons-beanutils.version>
  <fastjson.version>1.2.83</fastjson.version>
  <commons.codec.version>1.8</commons.codec.version>
</properties>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>commons-beanutils</groupId>
      <artifactId>commons-beanutils-core</artifactId>
      <version>${commons-beanutils.version}</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>${fastjson.version}</version>
    </dependency>
    <dependency>
      <groupId>commons-codec</groupId>
      <artifactId>commons-codec</artifactId>
      <version>${commons.codec.version}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

子模块的pom.xml:

<dependencies>
  <dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils-core</artifactId>
  </dependency>
</dependencies>

对于子模块
如果需要依赖:只需要配置groupId和artifactId。而version不需要写,只需要委托给父类管理就行了
如果不需要依赖:在子pom.xml中不写就行了,不写就不会引入

dependencyManagement中的依赖版本还会覆盖传递依赖版本
举个例子:项目中依赖的A,A依赖了B的1.0版本。如果在dependencyManagement中显示声明依赖B的2.0版本,那么A也会去依赖B的2.0版本

最佳实践:一般使用 dependencyManagement 统一管理项目依赖的版本

4、超级pom

超级pom的坐标:对于Maven3,超级pom的目录为:maven/lib/maven-model-builder-x.x.x.jar中
超级pom中定义了什么?
(1)定义了【默认中央仓库】和【插件仓库】
(2)定义了【主代码/测试 输出目录】,【主代码输出目录】,【最终构件的名称格式】等等
(3)定义了【Maven内置插件】的默认版本

5、约定优于配置

Maven提倡约定优于配置(Convention Over Configuration):在maven中只需要简单的配置pom文件,就可以实现 清除构建目录、创建目录、编译代码、复制依赖至目标目录,最后打包
maven约定如下
源码目录为 src/main/java
编译输出目录为 target/classes
打包方式为jar
包输出目录为 target

参考链接:https://blog.csdn.net/qq_41157876/article/details/119117070

最佳实践

1、安装后,指定本次仓库位置,方便调整
2、某个依赖 jar 包,从远程仓库拉取过程中可能失败,可以进入到本地仓库文件夹,删除对应的jar 包目录
3、多模块项目,使用dependencyManagement
4、settings.xml 文件中,指定镜像,如果公司有私服,指定私服地址
5、注意依赖传递原则,防止引入不兼容的版本的 jar 包
6、给 IDE 安装 Maven Helper 插件

博主水平有限,欢迎留言,指正错误,交流技术


http://www.kler.cn/a/17306.html

相关文章:

  • 408模拟卷较难题(无分类)
  • 量化交易系统开发-实时行情自动化交易-3.4.2.2.Okex交易数据
  • Java面向对象高级2
  • 2024年11月12日Github流行趋势
  • 4.4 软件设计:UML顺序图
  • 【ChatGPT】 如何让ChatGPT分析数据并得出结论
  • 日撸 Java 三百行day38
  • Springboot +Flowable,任务认领和回退(一)
  • 【JavaEE】应用层自定义协议及UDP协议
  • 【技术选型】Elasticsearch 和Solr那个香?
  • shell脚本 cut工具
  • 智能交通:从车牌识别到城市智能停车
  • Linux 中实现 ssh 免密登录
  • 联通云正式启动“同舟计划”,点燃数字引擎赋能产业未来
  • 100+Python挑战性编程练习系列 -- day 3
  • 2008-2019年主要城市PITI指数
  • 简单有趣的轻量级网络 Efficientnet(网络结构详解+详细注释代码+核心思想讲解)——pytorch实现
  • 华为OD机试 - 快递业务站(Python)
  • 三分钟教你看懂 spring 官方文档
  • 【ansys】project may be corrupted and recovery information is available
  • 达梦:dts工具迁移mysql decimal(65,30)的字段,报精度超出定义
  • 净利润下滑13%,帅丰电器已掉队?
  • ChatGPT 探讨内存屏障的意内存
  • 虹科荣誉 | 虹科工业物联网产品荣获中国自动化产业年会用户信赖产品奖!
  • 将 Segment Anything 扩展到医学图像领域
  • 数据埋点2