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指定版本号范围写法
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
上述代码是我们在使用maven依赖某一个jar包时最常见的写法,其中version指定了jar包的版本为1.18.8。但是在一些项目中我们可以看到如下写法:
复制代码
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>[1.18.8,1.18.12]</version>
</dependency>
version的位置变成了中括号加逗号的形式,那这样是什么意思呢?意思是在1.18.8-1.18.12的范围内的jar包都可以使用,默认使用最大版本的即1.18.12
完整的版本号范围说明如下:(x为具体使用的版本号)
复制代码
(,1.0] x <= 1.0
[1.0] x = 1.0 跟直接指定1.0没有区别
[1.2,1.3] 1.2 <= x <= 1.3
[1.0,2.0) 1.0 <= x < 2.0
[1.5,) x >= 1.5
(,1.0],[1.2,) x <= 1.0 or x >= 1.2
(,1.1),(1.1,) x < 1.1 or x > 1.1 即排除1.1的版本
那么假如此时存在快照版本和非快照版本呢?默认情况下,同版本的快照版本会小于非快照版本。如:
复制代码
[1.0-SNAPSHOT,1.0] 如果1.0不存在则使用1.0-SNAPSHOT,1.0存在则使用1.0版本
[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