-
Maven之pom.xml依赖的配置
2018-09-05 16:22:511.坐标详解 Maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组Maven坐标是通过一些元素...artifactId: 该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为a...1.坐标详解
Maven坐标为各种构件引入了秩序,任何一个构件都必须明确定义自己的坐标,而一组Maven坐标是通过一些元素定义的,它们是groupId、artifactId、version、packaging、classifier。
groupId: 定义当前Maven项目隶属的实际项目。
artifactId: 该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀。
version: 该元素定义Maven项目当前所处的版本
packaging: 该元素定义Maven项目的打包方式,当不定义packaging的时候,Maven会使用默认值jar。
classifier: 该元素用来帮助定义构建输出的一些附属构件。附属构件与主构件对应,如上例中的主构件是nexus-indexer-2.0.0.jar,该项目可能还会通过使用一些插件生成如nexus-indexer-2.0.0-javadoc.jar、nexus-indexer-2.0.0-sources.jar这样一些附属构件,其包含了Java文档和源代码。这时候,javadoc和sources就是这两个附属构件的classifier。这样,附属构件也就拥有了自己唯一的坐标。
上述5个元素中,groupId、artifactId、version是必须定义的,packaging是可选的(默认为jar),而classifier是不能直接定义的。
同时,项目构件的文件名是与坐标相对应的,一般的规则为artifactId-version[-classifier].packaging,[-classifier]表示可选。
这里还要强调的一点是,packaging并非一定与构件扩展名对应,比如packaging为maven-plugin的构件扩展名为jar。2.依赖配置格式
根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的
元素有:
groupId、artifactId和version: 依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
type: 依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar。
scope: 依赖的范围,依赖范围就是用来控制依赖与这三种classpath(编译classpath、测试classpath、运行classpath)的关系,Maven有以下几种依赖范围:
compile: 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、运行三种classpath都有效。
test: 测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。
provided: 已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供,就不需要Maven重复地引入一遍。
runtime: 运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行classpath有效,但在编译主代码时无效。典型的例子是JDBC驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。
system: 系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全一致。但是,使用system范围的依赖时必须通过systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。
import(Maven 2.0.9及以上): 导入依赖范围。该依赖范围不会对三种classpath产生实际的影响,本书将在8.3.3节介绍Maven依赖和dependencyManagement的时候详细介绍此依赖范围。
大部分依赖声明只包含基本坐标,然而在一些特殊情况下,其他元素至关重要。3.传递性依赖
有了传递性依赖机制,在使用Spring Framework的时候就不用去考虑它依赖了什么,也不用担心引入多余的依赖。Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中。4.传递性依赖和依赖范围
当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;当第二直接依赖的范围是test的时候,依赖不会得以传递;当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为provided;当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为runtime。5.依赖调解
例如,项目A有这样的依赖关系:A->B->C->X(1.0)、A->D->X(2.0),X是A的传递性依赖,但是两条依赖路径上有两个版本的X,那么哪个X会被Maven解析使用呢?两个版本都被解析显然是不对的,因为那会造成依赖重复,因此必须选择一个。Maven依赖调解(Dependency Mediation)的第一原则是:路径最近者优先。该例中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。
Maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用,顺序最靠前的那个依赖优胜。6.可选依赖
<dependency> <optional>true</optional> </dependency>
<optional>元素表示可选依赖.
项目B实现了两个特性,其中的特性一依赖于X,特性二依赖于Y,而且这两个特性是互斥的,用户不可能同时使用两个特性。比如B是一个持久层隔离工具包,它支持多种数据库,包括MySQL、PostgreSQL等,在构建这个工具包的时候,需要这两种数据库的驱动程序,但在使用这个工具包的时候,只会依赖一种数据库。7.排除依赖
<project> .... <dependencies> <dependency> <groupId></groupId> <artifactId></artifactId> <version></version> <exclusions> <exclusion> <groupId></groupId> <artifactId></artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
项目A依赖于项目B,但是由于一些原因,不想引入传递性依赖C,而是自己显式地声明对于项目C 1.1.0版本的依赖。代码中使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusion子元素,因此可以排除一个或者多个传递性依赖。需要注意的是,声明exclusion的时候只需要groupId和artifactId,而不需要version元素,这是因为只需要groupId和artifactId就能唯一定位依赖图中的某个依赖。换句话说,Maven解析后的依赖中,不可能出现groupId和artifactId相同,但是version不同的两个依赖8.归类依赖
<project> .... <properties> <变量名>值</变量名> </properties> <dependencies> <dependency> <groupId></groupId> <artifactId></artifactId> <version>${变量名}</version> </dependency> </dependencies> </project>
这里简单用到了Maven属性,首先使用properties元素定义Maven属性,使用美元符号和大括弧环绕的方式引用Maven属性。然后,将所有依赖的版本值用这一属性引用表示。这和在Java中用常量PI替换3.14是同样的道理,不同的只是语法。9.优化依赖
运行命令查看当前项目的已解析依赖:mvn dependency:list,在此基础上,还能进一步了解已解析依赖的信息。将直接在当前项目POM声明的依赖定义为顶层依赖,而这些顶层依赖的依赖则定义为第二层依赖,以此类推,有第三、第四层依赖。当这些依赖经Maven解析后,就会构成一个依赖树,通过这棵依赖树就能很清楚地看到某个依赖是通过哪条传递路径引入的。可以行如下命令查看当前项目的依赖树:mvn dependency:tree,在此基础上,还有dependency:analyze工具可以帮助分析当前项目的依赖。为了说明该工具的用途,先将spring-context这一依赖删除,然后构建项目,你会发现编译、测试和打包都不会有任何问题。通过分析依赖树,可以看到spring-context是spring-context-support的依赖,因此会得以传递到项目的classspath中。 -
Maven之子模块pom.xml继承父模块pom.xml配置
2020-03-05 20:17:42Maven中可以通过继承父模块pom,来实现pom.xml配置的继承和传递,便于各种Maven插件以及程序依赖的统一管理。通过将子类模块的公共配置,抽象聚合生成父类模块,能够避免pom.xml的重复配置。由于父类模块本身并不...
前言
Maven中可以通过继承父模块pom,来实现pom.xml配置的继承和传递,便于各种Maven插件以及程序依赖的统一管理。通过将子类模块的公共配置,抽象聚合生成父类模块,能够避免pom.xml的重复配置。由于父类模块本身并不包含除了POM之外的项目文件,也就不需要src/main/java之类的文件夹了。每当需要对多个子模块进行相同的配置时,只需要在父类模块的pom中进行配置,而子类中声明使用此配置即可,当然子类pom中也可以自定义配置,并覆盖父类中的各项配置,和Java中类的继承类似。
可继承的POM元素
1)
groupId
:项目组ID,项目坐标的核心元素2)
version
:项目版本,项目坐标的核心元素3)
description
:项目的表述信息4)
organization
:项目的组织信息5)
inception Year
:项目的创始年份6)
url
:项目的URL地址7)
developers
:项目的开发者信息8)
contributors
:项目的贡献者信息9)
distributionManagement
:项目的部署管理10)
issueManagement
:项目的缺陷和跟踪系统信息11)
ciManagement
:项目的持续集成信息系统12)
scm
:项目的版本控制系统信息13)
mailingLists
:项目的邮件列表信息14)
properties
:自定义的Maven属性15)
dependencies
:项目的依赖属性16)
dependencyManagement
:项目的依赖管理配置17)
repositories
:项目的仓库配置18)
build
:包括项目的源码目录配置、输出目录配置、插件配置、插件管理配置等19)
reporting
:包括项目的报告输出目录配置、报告插件配置等
POM继承中的依赖管理和插件管理
Maven提供的
dependencyManagement
和pluginManagement
元素用于帮助POM继承过程中的依赖管理和插件管理。在父类POM下,此两个元素中的声明的依赖或配置并不会引入实际的依赖或是造成实际的插件调用行为,不过它们能够约束子类POM中的依赖和插件配置的声明。只有当子类POM中配置了真正的dependency
或plugin
,并且其groupId
和artifactId
与父类POM中dependencyManagement
和pluginManagement
相对应时,才会进行实际的依赖引入或插件调用,当然子类中也能够进行自定义配置去覆盖父类,或是额外声明自己的配置
POM继承示例
1) 在父类POM中使用
dependencyManagement
和pluginManagement
,声明子类POM中可能用到的依赖和插件<modelVersion>4.0.0</modelVersion> <groupId>com.tomandersen</groupId> <artifactId>HadoopCustomModules</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>flume</module> <module>log-collector</module> </modules> <!--事先声明版本属性--> <properties> <slf4j.version>1.7.20</slf4j.version> <logback.version>1.0.7</logback.version> </properties> <!--在父类Maven中使用dependencyManagement声明依赖便于子类Module继承使用,也便于进行依赖版本控制--> <dependencyManagement> <dependencies> <!--阿里巴巴开源json解析框架--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.51</version> </dependency> <!--日志生成框架--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>${logback.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> </dependencies> </dependencyManagement> <build> <!--在父类Maven中使用pluginManagement管理插件便于子类Module继承使用,也便于进行依赖版本控制--> <pluginManagement> <plugins> <!--配置Maven项目compiler插件--> <!--此工具不会打包依赖--> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <!--配置Maven项目assembly插件--> <!--此工具会将全部依赖打包--> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <!--子类Maven通过mainClass标签设置成主类的全类名FQCN--> <!--<mainClass></mainClass>--> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> </build>
2) 在子类POM中声明父类POM,并配置实际使用的
dependency
和plugin
,只需要通过声明groupId
和artifactId
就可以避免配置各种依赖和插件的详细配置,当然也可以自己覆盖父类配置信息<!--声明父类POM--> <parent> <artifactId>HadoopCustomModules</artifactId> <groupId>com.tomandersen</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <!--子类POM信息--> <groupId>com.tomandersen</groupId> <artifactId>log-collector</artifactId> <dependencies> <!--阿里巴巴开源json解析框架--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency> <!--日志生成框架--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> </dependency> </dependencies> <build> <plugins> <!--自定义Maven项目编译器compiler插件相关配置--> <plugin> <artifactId>maven-compiler-plugin</artifactId> </plugin> <!--自定义Maven项目汇编assembly插件相关配置--> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <!--此处设置成主类的全名--> <mainClass>com.tomandersen.appclient.AppMain</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
更多详细内容可以查阅《Maven实战》
End~
-
idea java10 模块化启动spring cloud 编译缺少maven 中的模块依赖
2018-08-22 07:55:07<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=... -
IDEA多模块maven项目子模块无法引用父模块依赖
2020-05-27 23:14:35IDEA多模块maven项目子模块无法引用父模块依赖第一节 问题第二节 解决方案 第一节 问题 当在IDEA创建一个maven项目后,并在该项目下新建一个moudle后,使得前一个maven项目作为父模块,配置信息如下: MybatisDemo... -
maven 多模块项目依赖问题
2020-11-02 15:26:511. 模块介绍 1.1模块如下 parent 为 父级,父级下只有一个pom文件主要,其他可忽略 B 为子模块,包含springboot 启动类 ...2. pom配置 2.1 parent 配置 2.1.1 配置modules 以及自身 2.1.2 配置依赖 dep...1. 模块介绍
1.1模块如下
parent 为 父级,父级下只有一个pom文件主要,其他可忽略
B 为子模块,包含springboot 启动类
C 为公共模块,(不包含springboot 启动类)
D 为子模块,(不包含springboot 启动类)
1.2 依赖关系
绿色的代表,三个模块都交给parent 管理
红色的代表子模块之间依赖关系
2. pom配置
2.1 parent 配置
2.1.1 配置modules 以及自身
2.1.2 配置依赖 dependencyManagement
2.2 A 模块配置
2.3 B 模块配置
build 说明:项目打包编译失败:程序包xx不存在,报common下的类找不到异常,
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
2.4 C 模块配置
-
maven pom编写
2018-07-03 08:57:28你可以编写一个pom.xml文件作为父级pom配置,各个模块在自己的pom.xml中继承父级pom文件,就像上面的示例那样,使用<parent>元素标识继承的父级pom文件。1.1父模块pom文件的编写:1、父级pom文件的... -
Maven模块与模块间的依赖
2019-09-30 20:11:24接Maven+Hibernate4注解0配置示例。 在Maven+Hibernate4注解0...user-service模块是要依赖user-dao模块的,怎么用maven来管理依赖呢? 1.在user-dao模块下,pom.xml中右键,选择maven install命令,将user-dao... -
Maven多模块依赖
2020-07-30 09:48:46使用Maven以后,可以更方便的进行构件化开发,一般项目中存在多模块,它们的关系,包括父子关系以及依赖关系,都可以通过pom文件的配置来实现的。 1. 父子关系 一个多模块项目通过一个父POM 引用一个或多个子... -
maven 公共模块依赖_Maven入门教程
2020-12-30 09:54:47GitHub仓库:Fundebug/maven-tutorialMaven简介Maven是Java项目构建...Maven的命令行工具为mvn,其常用命令如下表所示:Maven的配置文件为pom.xml,这个文件有个很吓人的学术名字Project Object Model,但是怎么看它... -
IDEA多模块maven项目中子模块无法引用父模块依赖
2021-02-25 10:57:35当在IDEA创建一个maven项目后,并在该项目下新建一个moudle后,使得前一个maven项目作为父模块,配置信息如下: 父工程的的pom.xml文件: 子工程的pom.xml文件: -
IDEA MAVEN POM不自动更新
2019-04-28 15:14:26【问题】pom文件引入依赖,无法下载pom配置文件中的依赖包,或只能下载少数包,各项配置都正确的情况 从网上查找了多种方案,但是不太好用,最后一种好用,这里都记录下 PS:建议下面四种方法都尝试下 ,问题... -
IDEA中,Maven项目POM文件中的依赖未报错(出现红色波浪线),但Maven Projects中的模块的Dependencies中的...
2017-02-03 17:10:22IDEA中,Maven项目POM文件中的依赖未报错(出现红色波浪线),但Maven Projects中的模块的Dependencies中的依赖却报错。 问题出现的场景: 将本地Maven仓库的地址从C盘更换到其他盘,新仓库中jar包存在。 问题... -
[已解决]maven中子模块间依赖包继承问题
2020-10-26 09:44:00当子模块的pom.xml中配置了依赖后,另一个子模块却不能自动导入这些依赖? 问题分析: 子模块的pom.xml:这里主要看这两个用于test单元测试的依赖包! 子模块:由于没有导入到这些依赖包,所以程序报红. 通过查阅... -
maven的聚合模块和pom继承
2019-02-26 10:20:00常用的pom被继承的元素 Xml代码 groupId:项目组ID,项目坐标的核心元素; version:项目版本,项目坐标的核心元素; description:项目的描述信息;...dependencies:项目的依赖配置; dependencyMana... -
Maven多模块依赖打jar包
2018-06-28 14:20:31模块关系 P: 代表父工程 W: 代表WEB模块, 主加载类所在...P 模块的pom文件配置 <build> <pluginManagement> <plugins> <plugin> <groupId... -
Maven之Parent模块配置-关于聚合与继承、依赖管理、占位符、构建管理和多套环境
2019-06-21 10:21:20Maven之Parent模块配置-关于聚合与继承、依赖管理、占位符、构建管理和多套环境 本文开始对study-parent模块的pom.xml进行配置。该文件的角色是整个Maven的Parent。文中将对Maven的聚合与继承、依赖管理、占位符、... -
MAVEN的pom文件配置要点
2017-04-06 10:39:001 只有web项目,才能用war...父类模块必须用pom打包,并在modules中给出所有子类地址 2.项目会先读取本地的maven仓库,如果没有,会从远端仓库(maven中央仓库和公司私服仓库)下载, 3.同事依赖servlet-api和jsp-... -
maven构建多模块项目依赖问题——dependencyManagement、dependencies (这里容易出现很多坑)
2019-06-17 18:34:14很容易想到,多个pom文件中的dependency难免会有重复的(两个模块都依赖同一个dependency很常见),而且每个dependency都有version需要管理,也可能出现冲突不一致等配置问题。 父子模块间单纯的继承关系也有问题,... -
idea maven 项目中 pom.xml 文件依赖导入不进来
2020-06-12 00:50:48在当前的工程中创建了一个 Spring 模块并导入了依赖,...但是查看本地仓库依赖存在,maven配置与pom配置也没问题,最后发现是 idea 不知道什么时候在 File -> Setting 中勾选了忽略 pom 文件 取消勾选就好 ... -
Maven管理多模块应用
2018-05-09 12:37:00穿越至目录: 从0开始,构建前后端分离应用 ...maven通过配置模块之间的pom依赖 生命周期管理:在web应用中,我们常要进行编译、打包、测试这些环节。在maven的世界里,将这些过程定义为生命周期。maven... -
Maven--多模块依赖实例解析(五)
2013-09-30 14:42:57这是最后一篇,做一个多模块依赖的正式例子,简单的讲一下单元测试、覆盖率以及发布和站点的部署。只想讲讲和Maven相关的东西,因此,注重看pom文件,里面具体的代码就不实现了,下面是我项目骨架: 首先创建一个... -
Maven中如何配置WAR依赖WAR和JAR的多模块项目结构
2011-08-04 15:20:24要使用的Warpath插件包括以下插件配置元素在你的pom.xml [code="java"][...] org.appfuse maven-warpath-plugin 1.0-SNAPSHOT true add-classes ... -
maven子工程依赖另一个子工程_Java实战开发(三)丨 Maven搭建多模块企业级项目...
2021-01-22 21:36:52Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。项目结构如下: test... -
maven项目的父级pom依赖问题求大神指教
2018-07-25 13:55:58项目结构如下,项目有个...无法上传私服的话这个父级pom中配置的依赖是不是对团队其他人没有用?因为他们从私服更新不到这个pom文件  -
maven工程依赖配置 (将功能模块打包为独立jar,使用maven进行管理)
2018-10-29 10:38:20拓展公共模块pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ht... -
maven asm 依赖配置_说说Maven的约定>配置>编码
2020-11-28 10:31:51说说Maven的约定>配置>编码Maven 介绍maven是一个软件工程(Software Project)管理工具。 对于maven来说,一个软件工程的唯一标识是由groupId+artifactId+... 其中pom类型用于构件多模块工程。工程之间有两种关... -
Maven学习八:多模块依赖
2014-03-27 16:08:39使用Maven以后,可以更方便的进行构件化开发,一般项目中存在多模块,它们的关系,包括父子关系以及依赖关系,都可以通过pom文件的配置来实现的。 1. 父子关系 一个多模块项目通过一个父POM 引用一个或... -
maven依赖循环引用_Maven最佳实践:划分模块、约定优于配置
2021-01-02 12:51:57Maven最佳实践:划分模块所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块,multi-module)相互关联。那么,为什么要这么做呢?我们明明在开发一个...