繁体   English   中英

提供的依赖和 JBOSS EAP 7

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM