java - 我什么时候需要具有运行时范围的 Maven 依赖项

标签 java maven jar dependencies

我试图了解 Maven 中对 runtime 作用域依赖的特定需求。在哪种情况下我会需要这个,compileprovided 作用域都不行?

例如,当我必须在代码中直接调用库 API(对其进行编译)并将依赖项打包到 Artifact 或依赖项目 Artifact 中时,我会使用 compile 范围作为依赖项。

当我必须针对 API 进行编译时,我会使用 provided 范围,但不打包它(除非它在运行时可用)。

但是我什么时候需要运行时范围?这是否适用于我不直接调用库 API(而是使用反射)但想将其打包到 Artifact 中的情况?为什么不直接使用 compile 作用域呢?唯一的好处是更快的编译时间,还是 runtime 范围内有其他特殊的东西无法通过 compile 范围实现或避免?

最佳答案

您可以在 runtime 范围内做的所有事情也可以在默认范围内完成:compile
那么为什么要使用runtime呢?

因为在某些情况下,这非常有意义并且可以使您的构建更加健壮

一个典型的用例是确保客户端代码不使用特定的实现。

假设您构建一个依赖于打包为 Maven 依赖项 (my-service-api) 的 API 的应用程序,并且此 API 的实现被打包为另一个 Maven 依赖项 (my-service -impl).
假设现在您需要在构建的应用程序中在运行时提供实现,但您不希望您的应用程序的客户端代码直接引用该实现。

通过为 my-service-impl 使用 runtime 范围:

<dependencies>
​  <dependency>
​      <groupId>my-group</groupId>
​      <artifactId>my-service-api</artifactId>
​  </dependency>
​  
​  <dependency>
​      <groupId>my-group</groupId>
​      <artifactId>my-service-impl</artifactId>
​      <scope>runtime</scope>
​  </dependency>
<dependencies>

由于编译器永远不会在类路径中具有依赖性,因此您不能在应用程序的客户端代码中与实现创建任何耦合。
客户端代码只会看到依赖项的 API:

通过为 my-service-impl 使用 compile 范围:

<dependencies>
​  <dependency>
​      <groupId>my-group</groupId>
​      <artifactId>my-service-api</artifactId>
​  </dependency>
​  
​  <dependency>
​      <groupId>my-group</groupId>
​      <artifactId>my-service-impl</artifactId>    ​  
​  </dependency>
<dependencies>

情况有所不同:您可能会错误地引用实现类,从而与实现产生不希望的耦合。

支持运行时范围的已知用法是您必须处理特定 DBMS(Oracle、PostgreSQL 或其他)的 JDBC 依赖性。
要编写可移植代码,您不想让客户端代码引用此 JDBC 依赖项的类,但您希望将它包含在您的应用程序中,因为在运行时需要类来使 JDBC api 与此 DBMS 一起工作.

关于java - 我什么时候需要具有运行时范围的 Maven 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45842742/

相关文章:

java - 来自 HTML 的 jar

java - 如何关闭 tomcat catalina.out 文件的调试和信息日志?

java - 获取recyclerView中选择的id

java - Maven 在 IntelliJ 中找不到依赖项

java - 将jdoconfig.xml存储在Maven的子模块中并在其他子模块中使用

java - FileNotFoundException 起始 jar - 在资源文件夹中看不到文件

java - 在我的桌面应用程序中使用第三方 jar

java - 如何使用 key 文件通过 Java 数据库连接连接到 AWS 数据库

java - 如何通过 asynctask 暂停下载过程

java - 在 Ubuntu 上将 Maven 项目导入到 Eclipse Luna 时出错