Maven依赖范围,我误会了吗?

时间:2019-07-07 11:16:00

标签: java maven

我已经阅读了thisthis的资源,并认为我理解它们,但是实践似乎与官方文档(至少对我而言)相矛盾。

这是我的意思:

让它们接受编译,提供和运行时范围。

官方文档指出:

  

编译:这是默认范围,如果未指定,则使用该范围。编译依赖项在项目的所有类路径中均可用。   此外,这些依赖项会传播到相关项目。
  提供:这与编译非常相似,但是表明您希望JDK或容器在运行时提供依赖项。例如,   为Java Enterprise Edition构建Web应用程序时,   将设置对Servlet API和相关Java EE API的依赖关系   限制范围,因为Web容器提供了这些类。   该作用域仅在编译和测试类路径上可用,   而且不是传递性的。
  运行时::此作用域表明依赖关系不是编译所必需的,而是执行所必需的。它在运行时进行测试   类路径,而不是编译类路径。

对于外行而言,这对我来说意味着以下内容:
编译:我将在编译和运行时阶段都可用
已提供:它可在编译时使用,但在运行时会从其他来源(例如从容器)而非我们的Maven依赖项提供。
运行时:它在编译时不可用,但将在运行时可用。

因此,我创建了一个小示例来检查不同范围的行为:
代码:

    public static void main(String[] args) throws Exception{
        SourceEntity sourceEntity = new SourceEntity(//params);
        ModelMapper modelMapper = new ModelMapper();
        modelMapper.map(sourceEntity, TargetEntity.class);
    }

pom.xml:

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <scope>compile</scope>
    <version>2.3.5</version>
</dependency>

然后我更改了依赖项的范围:
(范围->预期行为->真实行为)
编译->编译时和运行时都可以工作->确实可以工作
提供->可以运行,但是运行时会失败,因为没有提供任何内容(也没有jdk既没有容器)->两者都可以工作
运行时->编译应该失败,因为它仅在运行时才可以执行->它也可以在编译时使用并且可以正常工作

所以一切正常,但是为什么呢?尽管有作用域,但似乎依存关系在所有阶段都是可用的,如果是这样,那么要指出不同作用域的含义是什么? 我对此有些困惑。


编辑(解决方案):
事实证明,问题是我从eclipse IDE运行了它,它具有一个已知的错误,即没有考虑maven范围。有关here的更多信息。
从CLI运行(使用mvn clean package),我能够重现预期的行为。

0 个答案:

没有答案