我已经阅读了this和this的资源,并认为我理解它们,但是实践似乎与官方文档(至少对我而言)相矛盾。
这是我的意思:
让它们接受编译,提供和运行时范围。
官方文档指出:
编译:这是默认范围,如果未指定,则使用该范围。编译依赖项在项目的所有类路径中均可用。 此外,这些依赖项会传播到相关项目。
提供:这与编译非常相似,但是表明您希望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
),我能够重现预期的行为。