从青铜到王者,搞定Maven下,赶紧收藏

239 阅读4分钟

小知识,大挑战!本文正在参与“ 程序员必备小知识

本文同时参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金

上篇写了一晚上太累了,今天继续,开始吧

6、idea maven的配置

POM 中可以指定以下配置:

项目依赖 dependencies

插件 plugins

执行目标

项目构建 profile

项目版本

项目开发者列表

相关邮件列表信息

具体的配置可以参考fastjson 的配置:

github.com/alibaba/fas…

7、POM有2个很重要的关系:聚合、继承

一、聚合

  如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合

1.聚合配置代码

<modules>
      <module>模块一</module>
      <module>模块二</module>
      <module>模块三</module>
</modules>

  例如:对项目的Hello、HelloFriend、MakeFriends这三个模块进行聚合

<modules>
      <module>../Hello</module>  
      <module>../HelloFriend</module>        
      <module>../MakeFriends</module>
</modules>

  其中module的路径为相对路径。

二、继承

  继承为了消除重复的配置,我们把很多相同的配置提取出来,例如:grouptId,version,相同的依赖包等。

继承配置代码:

<parent>  
         <groupId>me.gacl.maven</groupId>
         <artifactId>ParentProject</artifactId>
         <version>0.0.1-SNAPSHOT</version>
         <relativePath>../ParentProject/pom.xml</relativePath>  
</parent>

Idea 中可以新建一个maven项目,然后删光文件夹,只留一个pom.xml,然后添加模块,选择继承。

image.png

8、Maven 中的 profile Maven 中有一个概念叫做:profile,它主要是为了解决不同环境所需的不同变量、配置等问题。比如我们内网开发的数据库配置,端口配置等是和生产环境不同的,这个时候就需要区分。

有了 profile,可以根据激活的条件,启动不同条件下的配置信息。

profile 是可以有多个的,也可以同时激活多个 profile,方便自由组合。

<profiles>
       <profile>
           <!--不同环境Profile的唯一id-->
           <!--开发环境-->
           <id>dev</id>
           <properties>
               <!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
               <profiles.active>dev</profiles.active>
           </properties>
       </profile>
       <profile>
           <!--线上环境-->
           <id>prod</id>
           <properties>
               <profiles.active>prod</profiles.active>
           </properties>
           <activation>
               <activeByDefault>true</activeByDefault>
           </activation>
       </profile>
   </profiles>

image.png

Idea 中会显示配置的两个profile ,可以选择激活

image.png

pom文件里的配置为

<build>
       <resources>
           <resource>
               <directory>src/main/resources/</directory>
               <!--先排除掉两个文件夹-->
               <excludes>
                   <exclude>dev/*</exclude>
                   <exclude>prod/*</exclude>
               </excludes>
               <includes>
                   <!--如果有其他定义通用文件,需要包含进来-->
                   <!--<include>messages/*</include>-->
               </includes>
           </resource>
           <resource>
               <!--这里是关键!根据不同的环境,把对应文件夹里的配置文件打包-->
               <directory>src/main/resources/${profiles.active}</directory>
           </resource>
       </resources>
   </build>
 
  <profiles>
       <profile>
           <!--不同环境Profile的唯一id-->
           <!--开发环境-->
           <id>dev</id>
           <properties>
               <!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
               <profiles.active>dev</profiles.active>
           </properties>
       </profile>
       <profile>
           <!--线上环境-->
           <id>prod</id>
           <properties>
               <profiles.active>prod</profiles.active>
           </properties>
           <activation>
               <activeByDefault>true</activeByDefault>
           </activation>
       </profile>
   </profiles>

9、maven 插件

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

每个插件都能实现多个功能,每个功能就是一个插件目标goal。

Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务,例如compile就是插件maven-compiler-plugin的一个插件目标。

常用插件:

maven-antrun-plugin

maven-archetype-plugin

maven-assembly-plugin

maven-dependency-plugin

maven-enforcer-plugin

maven-help-plugin

maven-release-plugin

maven-resources-plugin

maven-surefire-plugin

build-helper-maven-plugin

exec-maven-plugin

jetty-maven-plugin

versions-maven-plugin 10、环境变量 ${basedir}表示项目根目录,即包含pom.xml文件的目录;

${version}表示项目版本;

project.basedir{project.basedir}同{basedir};

${project.baseUri}表示项目文件地址;

${maven.build.timestamp}表示项目构件开始时间;

maven.build.timestamp.format表示属性{maven.build.timestamp.format}表示属性{maven.build.timestamp}的展示格式,默认值为yyyyMMdd-HHmm,可自定义其格式,其类型可参考java.text.SimpleDateFormat。 ${project.build.directory}表示主源码路径;

${project.build.sourceEncoding}表示主源码的编码格式;

${project.build.sourceDirectory}表示主源码路径;

${project.build.finalName}表示输出文件名称;

project.version表示项目版本,{project.version}表示项目版本,与{version}相同;

project.xxx当前pom文件的任意节点的内容{project.xxx} 当前pom文件的任意节点的内容 {env.xxx} 获取系统环境变量。 ${settings.xxx} 指代了settings.xml中对应元素的值。

11、Maven 依赖冲突的2个方法

1.统一版本

使用dependencyManagement 进行版本锁定,dependencyManagement可以统一管理项目的版本号,确保应用的各个项目的依赖和版本一致。

如果我们项目中只想使用spring core 5.2.0的包,pom.xml可以改为如下

<dependencyManagement>
       <dependencies>
           <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-core</artifactId>
               <version>5.2.0.RELEASE</version>
           </dependency>
       </dependencies>
   </dependencyManagement>
 
   <dependencies>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>5.2.7.RELEASE</version>
       </dependency>
 
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-aop</artifactId>
           <version>5.2.0.RELEASE</version>
       </dependency>
 
   </dependencies>

2.排除依赖

依赖查找的两个原则:

使用路径近者优先原则:直接依赖级别高于传递依赖。

使用第一声明者优先原则:谁先定义的就用谁的传递依赖,即在pom.xml文件自上而下,先声明的jar坐标,就先引用该jar的传递依赖。

Idea 可以安装maven helper插件,解决冲突。

maven helper插件安装成功,点开pom.xml会发现多了一个Dependency Analyzer视图,如下上面按钮的图标含义如下

Conflicts(查看冲突)

All Dependencies as List(列表形式查看所有依赖)

All Dependencies as Tree(树形式查看所有依赖)

上图说明有3个jar存在冲突,点击冲突的jar,可以查看和哪个jar产生冲突,如下图

image.png

点开pom.xml,切换到Dependency Analyzer视图,选择All Dependencies as Tree,点击要排除的jar,右键会出现Execlude选项,如下

image.png

12、scope

scope取值 有效范围(compile, runtime, test) 依赖传递 例子 compile all 是 spring-core provided compile, test 否 servlet-api runtime runtime, test 是 JDBC驱动 test test 否 JUnit system compile, test 是 compile :为默认的依赖有效范围。如果在定义依赖关系的时候,没有明确指定依赖有效范围的话,则默认采用该依赖有效范围。此种依赖,在编译、运行、测试时均有效。

provided :在编译、测试时有效,但是在运行时无效。例如:servlet-api,运行项目时,容器已经提供,就不需要Maven重复地引入一遍了。

runtime :在运行、测试时有效,但是在编译代码时无效。例如:JDBC驱动实现,项目代码编译只需要JDK提供的JDBC接口,只有在测试或运行项目时才需要实现上述接口的具体JDBC驱动。

test :只在测试时有效,例如:JUnit。

system :在编译、测试时有效,但是在运行时无效。和provided的区别是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。systemPath元素可以引用环境变量。

总结: Maven是开发中常用的工具,很重要,所以尽可能的掌握。

你还知道Maven的哪些知识,欢迎留言交流!!!