maven之BOM及BOM和provided的一个小坑

  BOM(Bill of Materials)定义一整套相互兼容的jar包版本集合,使用时只需要依赖该BOM文件,即可放心的使用需要的依赖jar包,且无需再指定版本号。BOM的维护方负责版本升级,并保证BOM中定义的jar包版本之间的兼容性。

  

  子模块很多时,可以使用dependencyManagement在父模块中统一管理。

  父模块中配置:

<groupId>maven</groupId>
<artifactId>X</artifactId>
<packaging>pom</packaging>
<version>1.0</version>

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>1.2.3.RELEASE</version>
            </dependency>
        </dependencies>
</dependencyManagement>

  packaging不一定是pom,也可以是jar和war。

  子模块则无需指定版本信息:

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>maven</groupId>
        <artifactId>X</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
 </dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

  有2点扩展:

1. 子模块可以继承多个父模块

<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>maven</groupId>
        <artifactId>X</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>maven</groupId>
        <artifactId>Y</artifactId>
        <version>1.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  2.父模块定义的是provided时,子模块在引用时要小心。

这种应用场景是,多个微服务的docker镜像依赖于一个基础镜像,则可以将基础镜像中集成的公共jar包做成BOM,则各微服务依赖的jar包可以做到统一。

     provided是没有传递性的,也就是说,如果你依赖的某个jar包,它的某个jar的范围是provided,那么该jar不会在你的工程中依靠jar依赖传递加入到你的工程中。

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>1.2.3.RELEASE</version>
                 <scope>provided</scope>
            </dependency>
        </dependencies>
</dependencyManagement>

    子工程引用该pom时,发现classpath中没有从父类中集成到provided范围的jar包。

如果使用intellj,版本在2018之后,可以使用以下方法把provided范围的jar包加到classpath中。

 

原文地址:https://www.cnblogs.com/lnlvinso/p/9795046.html

时间: 2024-08-30 13:08:37

maven之BOM及BOM和provided的一个小坑的相关文章

制作Orcad的变种BOM(Variant BOM)

通常在Orcad中画的原理图并不仅仅是用于一款产品.比如一个控制器原理图,可能相应着很多款子产品线,而这些子产品线之间的差别就是通讯口组件不同,少焊几个芯片,或者仅仅是少焊几个电阻. 可是这样交付生产的时候,整理BOM却是一个非常头疼的问题.须要有极好的耐心,要把每条产品线中用不到的元件一个个的从总BOM里删除掉,还不能出错.假设仅仅有两三款产品还好,但假设是有非常多个通讯组件,排列组合要几十款产品呢,想想就是个噩梦. 还好,Orcad为我们提供了这个辅助功能,叫Variant BOM(变种BO

eclipse Maven操作出现No compiler is provided in this environment.Perhaps you are running on a JRE rather than a JDK?

右键 pom.xml -> Run as -> Maven install 后出现类似如下错误: 解决方法: 1)选择项目后,点击 eclipse 导航栏中 [Window]-->[Prefrences]-->[Java]-->[Installed JREs]-->Add 选择[Standard VM]---> [Next > ]选择JDK的安装目录确定. 出现如下页面后,点击[Directory ...]选择jdk的安装目录 -->[Finish]

maven权威指南学习笔记(三)&mdash;&mdash;一个简单的maven项目

目标: 对构建生命周期 (build  lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project Object Model)有一个基本的理解 目前不准备深入学习maven故此使用工具ideaj 来帮助学习, 用idea创建一个默认的maven工程,结构如下: 相关命令: 打包:mvn package 编译:mvn compile 编译测试程序:mvn test-compile 清空:mvn cle

Maven支撑下的War应用依赖另外一个WAR应用的解决方案

最近在做项目中,用Maven管理项目间的依赖关系,遇到一个问题,快折腾死了,不过初步试出来一种解决方案.在此把问题及解决方案描述一下,以资共享.   问题描述:有两个项目A和B,Dynamic Web Project.依赖关系是,B-->A,一种方式是利用maven-war-plugin的Overlay机制(例子可参见官网),但这种解决方案默认是将两个Web应用的资源进行合并,相关的class都会被复制到WEB-INF/classes下面,相关的JSP等资源也合并到一起.我的要求是A的class

Maven+jersey快速构建RESTful Web service集成mongodb-短小而精悍-值得拥有

源码下载地址:http://pan.baidu.com/s/1gdIN4fp 转载请注明原著地址:http://blog.csdn.net/tianyijavaoracle/article/details/41708217 Jersey是JAX-RS(JSR311)开源参考实现用于构建RESTful Web service.此外Jersey还提供一些额外的API和扩展机制,所以开发人员能够按照自己的需要对Jersey进行扩展 理论的东西在这里我就不多说了!这个实例是实现了REST的三个基本get

主要介绍JavaEE中Maven Web 项目的结构及其它几个小问题

先说下本篇随笔的目录. 1.介绍windows中环境变量Path与ClassPath的区别. 2.可能导致命令行运行javac编译成功,但 java命令 + 所要执行的类的类名 无效的原因. 3.介绍Maven项目的结构. 4.Eclipse中添加Jar包的两种方式Add Jars 与 Add External Jars 的区别. 5.Eclipse发布项目到Tomcat上可能导致Jar包丢失的原因. 一.windows中环境变量Path与ClassPath的区别. Path变量:当你打开Win

Maven将依赖的所有jar包打成一个jar

有些特殊情况下,需要将多个jar包打包成一个jar文件.如果使用maven可以加入如下插件: <build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <!--这里要替换成jar包main方法所在类 --> <mainClass&g

Maven学习2之使用archetype快速生成一个新项目

方法1: 1.使用: mvn archetype:generate 然后按要求输入相关的配置: (1)可以跳过filter: Choose a number or apply filter (format: [groupId:]artifactId, case sensitive co ntains): 777: (2)然后按要求输入: a.版本号 b.groupId c:artifactId d:version e:package:可跳过 f:Y:确认 记录: Choose a number

(maven项目)使用java -jar命令遇到的小问题|xx.jar中没有主清单或Error:Invalid or corrupt jarfile xx.jar

xx.jar中没有主清单或Error:Invalid or corrupt jarfile xx.jar 遇到这个问题,是因为你的jar包没有设置主类的入口. 即在META-INF文件夹的MANIFEST.MF文件中没有定义Main-Class: packageName.className(此处Main-Class:与 packageName.className之间有一个空格并且一行结束后有换行符) 我们可以用winrar打开你导出jar包(不用解压),在META-INF文件夹中找到MANIFE