代码改变世界

maven常用命令和配置以及常用标签

2023-03-17 23:15  youxin  阅读(104)  评论(0编辑  收藏  举报

 

maven

pom中的parent标签:

parent标签类似java中的继承,复用依赖,减少冗余配置

 

使用场景(when):
在多模块(module)的项目中,有很多模块中的pom中存在相同的引用,如果此时声明一个父pom文件,将公用的依赖提取到父pom文件中(即使用<parent>标签),将大大减少其他pom文件中的依赖的配置

 

如何使用(how):
假如有此时有一个项目中有2个module

我们可以这样使用(step):

创建一个新的module,名为parent(当然也可以叫其他名字),存放父pom,父pom中,也可以使用parent标签(一般放 大部分module都使用的组件,如spirng boot)
在其他两个module中使用parent标签,其坐标就是父pom中声明的坐标
————————————————

SpringBoot项目要继承SpringBoot的起步依赖spring-boot-starter-parent
spring-boot-starter-parent已经对spring进行了一些默认的配置
导入spring-boot-starter-parent之后,其他先关依赖就不用填写版本,由此包统一管理

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

maven指定版本号范围写法

 
  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>1.18.8</version>
  5. </dependency>

上述代码是我们在使用maven依赖某一个jar包时最常见的写法,其中version指定了jar包的版本为1.18.8。但是在一些项目中我们可以看到如下写法:

复制代码
  1. <dependency>
  2. <groupId>org.projectlombok</groupId>
  3. <artifactId>lombok</artifactId>
  4. <version>[1.18.8,1.18.12]</version>
  5. </dependency>

version的位置变成了中括号加逗号的形式,那这样是什么意思呢?意思是在1.18.8-1.18.12的范围内的jar包都可以使用,默认使用最大版本的即1.18.12

完整的版本号范围说明如下:(x为具体使用的版本号)

复制代码
  1. (,1.0] x <= 1.0
  2. [1.0] x = 1.0 跟直接指定1.0没有区别
  3. [1.2,1.3] 1.2 <= x <= 1.3
  4. [1.0,2.0) 1.0 <= x < 2.0
  5. [1.5,) x >= 1.5
  6. (,1.0],[1.2,) x <= 1.0 or x >= 1.2
  7. (,1.1),(1.1,) x < 1.1 or x > 1.1 即排除1.1的版本

那么假如此时存在快照版本和非快照版本呢?默认情况下,同版本的快照版本会小于非快照版本。如:

复制代码
  1. [1.0-SNAPSHOT,1.0] 如果1.0不存在则使用1.0-SNAPSHOT1.0存在则使用1.0版本
  2. [1.0,1.0-SNAPSHOT] 错误,会提示:Reason: Range defies version ordering

现在流行微服务,微服务之间就经常会有各种jar包互相引用,在开发一个新的需求如1.1的需求时,开发阶段使用的是快照版本。我们的maven依赖版本就可以写成[1.1-SNAPSHOT,1.1]这样因为我们1.1版本的jar还没发布,所以项目会使用1.1-SNAPSHOT。当项目开发完成上线的时候,打包了1.1版本,依赖的项目打包的时候发现1.1版本的jar存在了则会使用1.1版本的jar。免去上线的时候需要修改pom的麻烦。也避免上线的时候因为忘记修改版本号导致线上版本依赖到快照版

 

 maven下载太慢,可以更换镜像。

 

dependencyManagement 和 dependencies 区别

 
 

dependencyManagement:

只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本

dependencies:

相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
原来dependencyManagement 只是申明依赖,并不实现引入。问题就在这里了,把依赖放到dependencies里面

1.在同一个pom文件下,如果<dependencies>和<dependencyManagement>中都对该jar做了依赖,以<dependencies>的为准,优先级高于<dependencyManagement>。若前者没有对其依赖,而后者对其有依赖,则以后者为准。<dependencyManagement>里只是声明依赖,并不实现引入.

2.在不同的pom文件中,存在父子相互依赖关系的,父项目的pom中<dependencyManagement>中对该jar做了依赖,而子项目中<dependencies>又依赖了该jar,如果子项目中没有指定<version>和<scope>,则继承父项目中该jar的<version>和<scope>。如果子项目中指定了<version>和<scope>,以子项目的为准。

引入SpringBoot的两种方法

方法1:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>

方法2: <dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.0.4.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 链接:https://www.jianshu.com/p/1870fe75386a

 

通常工程比较庞大,模块多的时候,在pom.xml文件中,也就是父依赖中会看到dependencyManagement标签。这个标签的作用是:

①对项目所依赖jar包进行版本管理的管理器。

②使用pom.xml中的dependencyManagement元索能让所有在子模块中引用一个依赖而不用显式的列出版本号。也就是子模块不需要列出版本,子模块中的pom依赖会找到dependencyManagement所在jar包的版本,并引用这个jar对应的版本号。

③让子模块不在受繁杂的版本影响,和父pom中的依赖一致即可。

这个是父pom的依赖,定义了jar包的版本号是多少:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>mysq1</groupId>
<artifactId>mysq1 - connector-java< /artifactId>
<version>5.1.2</version>
</dependency>
<dependencies>
</dependencyManagement>
这个是子模块的pom.xml:dependencyManagement直接找到父pom对应jar的版本号。

<dependencies>
<dependency>
<groupId>mysq1</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>

 

 


小结:

①dependencyManagement埋只是声明依赖, 并不实现引入,因此子项目需要显示的声明需要用的依赖。

②如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

原文链接:https://blog.csdn.net/Sunshineoe/article/details/121083505

maven packaging标签

项目的打包类型:pom、jar、war
指定打包类型使用<packaging>标签,它默认是jar类型。

pom:父类型都为pom类型
<packaging>pom</packaging>

jar:内部调用或者是作服务使用
<packaging>jar</packaging>

war:打包项目,用于在容器(Tomcat、Jetty等)上部署
<packaging>war</packaging>

举个打包类型为pom的例子:
项目目录结构如下:

~/Desktop$ tree -L 4
├── MyProject
│ ├── pom.xml
│ ├── SubProject1
│ │ └── pom.xml
│ ├── SubProject2
│ │ └── pom.xml
│ └── SubProject3
│ └── pom.xml
...

MyProject下面有三个模块项目SubProject1、SubProject2、SubProject3。那么我们可以将三个模块项目的公共部分,写在MyProject项目的pom.xml文件上,然后在模块项目的pom.xml中来继承它,这样模块项目就可以用到公共部分的东西。MyProject项目的pom.xml就是我们的所说的父类型,它的打包类型要写成pom,如:

<project ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.wong.tech</groupId>
<artifactId>myproject</artifactId>
<packaging>pom</packaging>
<version>1.0.0</version>
<name>myproject</name>
<url>http://maven.apache.org</url>
<!--模块(有时称作子项目) 被构建成项目的一部分。列出的每个模块元素是指向该模块的目录的相对路径 -->
<modules>
<module>SubProject1</module>
<module>SubProject2</module>
<module>SubProject3</module>
</modules>
...
</project>

在MyProject下的pom.xml通过<modules>标签指定了子项目的相对路径。这就可以直接在MyProject项目里执行mvn命令,一次构建全部模块。当然,到每个模块的目录下执行mvn命令,逐个构建也是没问题的。

在分模块(子项目)下的pom.xml通过<parent>标签继承MyProject下的pom.xml即可,如SubProject1子项目的pom.xml:

<project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<artifactId>myproject-subproject1</artifactId>
<packaging>jar</packaging>
<name>myproject-subproject1</name>
<version>1.0.0</version>
<url>http://maven.apache.org</url>
<parent>
<groupId>com.wong.tech</groupId>
<artifactId>myproject</artifactId>
<version>1.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
...
</project>

其他的子项目依此类推。

 

 

maven--pom.xml--标签大全

 比如:

properties

是为pom定义一些常量,在pom中的其它地方可以直接引用。例如:

properties
是为pom定义一些常量,在pom中的其它地方可以直接引用。例如:

<properties>
    <mysql.version>5.1.41</mysql.version>
    <file.encoding>UTF-8</file_encoding>
</properties>
 
<dependencyManagement>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
</dependencyManagement>

 


还可以使用project.xxx引用pom里定义的其它属性:如$(project.version}


原文链接:https://blog.csdn.net/feiying0canglang/article/details/105822443