[英]Provided dependency and JBOSS EAP 7
我知道 PROVIDED 依赖项是由容器“提供”的,应用程序不需要生成这个 JAR。
1) 所以,我使用的是 JBOSS EAP 7.0.0.GA 并且在这个模块文件夹中有以下 jar: hibernate-core-5.0.9.Final-redhat-1.jar 。
在我的项目中,我使用以下依赖项:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.9.Final-redhat-1</version>
</dependency>
它工作正常,没有错误。 但我知道我应该使用“PROVIDED”范围,因为这个 jar 是由容器提供的。 为什么有效?
2)我还有一个例子。 在 Jboss Eap 7.0.0.GA 中,我有以下 jar: jboss-servlet-api_3.1_spec-1.0.0.Final-redhat-1.jar 。 但在我的项目中,我有以下几点:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
<optional>true</optional>
</dependency>
它也工作正常,但我不明白为什么。 对我来说,正确的依赖项应该是 servlet-api_3.1_spec-1.0.0.Final-redhat-1 with provided。 为什么它也有效?
在构建时,Maven 将解析依赖关系并使相关的包可供编译器使用。 例如,您的应用服务器可能会提供包含javax.servlet
的类和接口的 JAR,但这些类不一定对编译器有用,因为编译器不知道它们在哪里。 通过向 Maven 提供依赖项,您可以让 Maven 找到这些依赖项的自己的实现,仅在编译时使用。
在运行时,如果您已将依赖项标记为provided
,那么您的应用程序将使用应用服务器提供的版本,而不是 Maven 已知的版本。 这可能是一件坏事,但它通常有效,因为编译器确实只需要知道方法签名,而不是它们的实现。 由规范控制的类的方法签名(例如javax.servlet
的方法签名)很少更改,因此编译时 JAR 和运行时 JAR 之间的不匹配可能会被忽视。 与符合 OSGi 的 JAR 不同,为 JEE 构建的 JAR 不包含指定特定兼容依赖项版本的元数据——JEE 类加载器将使用他们发现的内容,无论好坏。
但是,您可能会被发现 - 特别是如果不匹配很严重。 问题在运行时可能非常明显,例如与缺少类或方法相关的异常,但它们可能很微妙。
因此,在可行的情况下,通常最好使用与运行时可用的版本相同的依赖项的编译时版本。 对于 EAP,我记得 Red Hat 分发了一个 Maven 物料清单 (BOM) 文件,该文件指定了特定 EAP 版本的所有 EAP JAR 的所有版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.