使用Maven中的scope总结

目录
  • Maven中的scope总结
    • Maven中的scope主要有以下6种
  • Maven中<scope>参数</scope>配置
    • 解决maven项目中无法打包生成空文件夹的问题

Maven中的scope总结

Maven中的scope主要有以下6种

接下来分别介绍下这几种scope:

  • compile

不声明scope元素的情况下的默认值;compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖;打包的时候通常需要包含进去。

  • provided

provided 类型的scope只会在项目的编译、测试阶段起作用;可以认为在目标容器中已经提供了这个依赖,无需在提供,但是在编写代码或者编译时可能会用到这个依赖;依赖不会被打入到项目jar包中。

说到provided,这里就要说到<dependency>下的子标签<optional> ,如果一个依赖的<optional> 设置为true,则该依赖在打包的时候不会被打进jar包,同时不会通过依赖传递传递到依赖该项目的工程;例如:x

依赖B,B由依赖于A(x->B->A),则A中设置<optional> 为true的依赖不会被传递到x中。

这两者的区别在于:

1、<optional>为true 表示某个依赖可选,该依赖是否使用都不会影响服务运行;

2、provided的<scope>在目标容器中已经提供了这个依赖,无需在提供

  • runtime

runtime与compile比较相似,区别在于runtime 跳过了编译阶段,打包的时候通常需要包含进去。

  • test

在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,不会被打包到项目jar包中,同时如果项目A依赖于项目B,项目B中的test作用域下的依赖不会被继承。

  • system

表示使用本地系统路径下的jar包,需要和一个systemPath一起使用,如下:

<!--引用-->
        <dependency>
            <groupId>xxxx</groupId>
            <artifactId>xxx</artifactId>
            <systemPath>${basedir}/lib/xxxxx.jar</systemPath>
            <scope>system</scope>
            <version>1.4.12</version>
        </dependency>
  • import

import 只能在pom文件的<dependencyManagement>中使用,从而引入其他的pom文件中引入依赖,如:在Spring boot 项目的POM文件中,我们可以通过在POM文件中继承 Spring-boot-starter-parent来引

用Srping boot默认依赖的jar包,如下:

<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.BUILD-SNAPSHOT</version>
</parent>

但是,通过上面的parent继承的方法,只能继承一个 spring-boot-start-parent。实际开发中,用户很可能需要继承自己公司的标准parent配置,这个时候可以使用 scope=import 来实现多继承。代码如下:

     <dependencyManagement>
         <dependencies>
             <dependency>
                 <!-- Import dependency management from Spring Boot -->
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-dependencies</artifactId>
                 <version>2.0.1.BUILD-SNAPSHOT</version>
                 <type>pom</type>
                 <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

通过上面方式,就可以获取spring-boot-dependencies.2.0.1.BUILD-SNAPSHOT.pom文件中dependencyManagement配置的jar包依赖。如果要继承多个,可以在dependencyManagement中添加,如:

     <dependencyManagement>
         <dependencies>
             <!-- Override Spring Data release train provided by Spring Boot -->
             <dependency>
                 <groupId>org.springframework.data</groupId>
                 <artifactId>spring-data-releasetrain</artifactId>
                 <version>Fowler-SR2</version>
                 <type>pom</type>
                 <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.1.BUILD-SNAPSHOT</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Maven中<scope>参数</scope>配置

参数名称 具体功能
<scope>compile</scope> 默认值,表示当前依赖包要参与当前项目的编译后续测试运行时打包
<scope>provided</scope> 当前包只在编译和测试的时候使用,而不再后续的运行和打包的时候不会打包进来
<scope>test</scope> 表示当前依赖包只参与测试工作
<scope>runtime</scope> 表示当前依赖包只参与运行周期,其他跳过
<scope>system</scope> 从参与度和provided一致,不过被依赖项不会从maven远程仓库下载,而是从本地的系统拿。需要systemPath属性来定义路径

解决maven项目中无法打包生成空文件夹的问题

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <!-- Run shade goal on package phase -->
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <artifactSet>
                                <excludes>
                                    <exclude>org.apache.flink:force-shading</exclude>
                                    <exclude>com.google.code.findbugs:jsr305</exclude>
                                    <exclude>org.slf4j:*</exclude>
                                    <exclude>org.apache.logging.log4j:*</exclude>
                                </excludes>
                            </artifactSet>
                            <filters>
                                <filter>
                                    <!-- Do not copy the signatures in the META-INF folder.
                                    Otherwise, this might cause SecurityExceptions when using the JAR. -->
                                    <artifact>*:*</artifact>
                                    <excludes>
                                        <exclude>META-INF/*.SF</exclude>
                                        <exclude>META-INF/*.DSA</exclude>
                                        <exclude>META-INF/*.RSA</exclude>
                                    </excludes>
                                </filter>
                            </filters>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.lkr.flink.StreamingJob</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Maven中optional和scope元素的使用弄明白了吗

    在梳理项目的过程中发现很多开发同学对 Maven 依赖文件的配置并不了解,特别是对 Maven 的 optional 元素和 scope 元素的使用也非常随意.这就会导致发布的 jar 包或 war 包非常 "胖".编译速度慢,而且还很容易生产 jar 冲突等问题.本篇文章从 optional 和 scope 的使用场景入手,让项目实现一波瘦身. optional 元素 这里以 Spring Boot 项目中的使用为例,比如我们在项目中经常使用的热部署组件 spring-boot-de

  • maven依赖关系中的<scope>provided</scope>使用详解

    关于maven依赖中的<scope>provided</scope>使用 scope的其他参数如下: compile 默认的scope,表示 dependency 都可以在生命周期中使用.而且,这些dependencies 会传递到依赖的项目中.适用于所有阶段,会随着项目一起发布 provided 跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs.这个scope 只能作用在编译和测试时,同时没有传递性

  • 使用Spring中的scope配置和@scope注解

    目录 Spring的scope配置和@scope注解 1. Spring的作用域在装配Bean 2. 基于注解开发时 Spring中的scope详解 1. scope概论 2. scope历史及分类 3. 单个scope详解 4. scope配置 Spring的scope配置和@scope注解 Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围. 在 Spring IoC 容器中具有以下几种作用域: 基本作用域(single

  • 解决@Scope(“prototype“)不生效的问题

    目录 @Scope(“prototype“)不生效 @Scope(“prototype“)正确用法——解决Bean多例问题 1.问题,Spring管理的某个Bean需要使用多例 2.问题升级 3. Spring给出的解决问题的办法(解决Bean链中某个Bean需要多例的问题) @Scope(“prototype“)不生效 使用spring的时候,我们一般都是使用@Component实现bean的注入,这个时候我们的bean如果不指定@Scope,默认是单例模式,另外还有很多模式可用,用的最多的就

  • Spring中@Scope的几种取值方式

    目录 @Scope的几种取值 Spring入门详解scope属性 一.scope属性 二.scope分类 三.scope取值 @Scope的几种取值 1.singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例 2.prototype:每次调用新建一个Bean的实例 3.Request:Web项目中,给每一个http request新建一个Bean实例 4.Session:Web项目中,给每一个http session新建一个Bean实例.

  • 使用Maven中的scope总结

    目录 Maven中的scope总结 Maven中的scope主要有以下6种 Maven中<scope>参数</scope>配置 解决maven项目中无法打包生成空文件夹的问题 Maven中的scope总结 Maven中的scope主要有以下6种 接下来分别介绍下这几种scope: compile 不声明scope元素的情况下的默认值:compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖:打包的时候通常需要包含进去. provide

  • Maven中pom.xml配置文件详细介绍

    setting.xml主要用于配置maven的运行环境等一系列通用的属性,是全局级别的配置文件:而pom.xml主要描述了项目的maven坐标,依赖关系,开发者需要遵循的规则,缺陷管理系统,组织和licenses,以及其他所有的项目相关因素,是项目级别的配置文件. 基础配置 一个典型的pom.xml文件配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org

  • 在maven中引入本地jar包的步骤

    目录 1 起因 2 解决方案 2.1 在pom中引入 2.2 Spring Boot 打包处理 2.3 拓展: Spring Boot 打包加入其它资源 1 起因 在和一些第三方厂商对接的过程中, 偶尔会遇到对方提供的SDK自带maven无法获取的jar包的情况(对于开源激进者的笔者很讨厌这种行为) 我们该如何处理这种情况呢, 其实解决思路很简单: 在pom中引入本地jar 打包时本地jar包含在内 让我们来看看具体怎么操作吧 idea中虽然可以在项目配置加入, 但打包时会报错, 相关的处理方案

  • 基于idea Maven中的redis配置使用详解

    pom.xml文件需要的内容 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> &

  • Maven中Could not find artifact XXXX的错误解决

    我目前碰到的是: Could not find artifact com.alibaba.cloud:spring-cloud-alibaba-dependencies:pom:2.1.0 RELEASE in central 出现问题的原因其实很简单,写错了版本号!!2.1.0 RELEASE中间不该是空格而应该是.,即应该写成如下: <dependencyManagement>     <dependencies>       <!-- spring cloud alib

  • AngularJS中监视Scope变量以及外部调用Scope方法

    在AngularJS中,有时候需要监视Scope中的某个变量,因为变量的改变会影响一些界面元素的显示.有时,也希望通过jQuery调用Scope的某个方法. 比如以下场景: <div> <button id="jQBtn">jQ Button</button> </div> <div id="ngSection" ng-controller="NGCtrl"> <input typ

  • maven中pom.xml详细介绍

    POM 代表工程对象模型.它是使用 Maven 工作时的基本组建,是一个 xml 文件.它被放在工程根目录下,文件命名为 pom.xml. POM 包含了关于工程和各种配置细节的信息,Maven 使用这些信息构建工程. POM 也包含了目标和插件.当执行一个任务或者目标时,Maven 会查找当前目录下的 POM,从其中读取所需要的配置信息,然后执行目标.能够在 POM 中设置的一些配置如下: project dependencies plugins goals build profiles pr

  • AngularJS中isolate scope的用法分析

    本文实例讲述了AngularJS中isolate scope的用法.分享给大家供大家参考,具体如下: angular js中指令directive有个特别有用的东西,那就是 isolate scope (被隔离的scope) 关于具体他和全局的scope 有什么区别,可以参考下面这篇文章: AngularJS 全局scope与Isolate scope通信用法示例 本文主要讲解 其具体的几种使用方式: 1. = 的使用 [html] <div class="card" ng-re

随机推荐