提供依赖和JBOSS EAP 7

时间:2017-10-04 21:06:34

标签: java maven jboss

我了解提供的依赖关系是"提供"通过容器和应用程序不需要生成此JAR。

1)所以,我使用的是JBOSS EAP 7.0.0.GA,这个模块文件夹中有以下jar: hibernate-core-5.0.9.Final-redhat-1.jar < / strong>即可。

在我的项目中,我使用以下依赖项:

<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.9.Final-redhat-1</version>
        </dependency>

工作正常,没有错误。但我知道我应该使用&#34;提供&#34;范围因为这个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。为什么它也有效?

1 个答案:

答案 0 :(得分:0)

在构建时,Maven将解析依赖关系并使编译器可以使用相关的包。例如,您的appserver可以提供包含javax.servlet中的类和接口的JAR,但这些类对编译器不一定有用,因为它不知道它们在哪里。通过向Maven提供依赖项,您可以让Maven找到自己的这些依赖项实现,只是为了在编译时使用。

在运行时,如果您已将依赖项标记为provided,那么您的应用程序将使用应用程序服务器提供的版本,而不是Maven已知的版本。这可能是一件坏事,但它通常有效,因为编译器确实只需要知道方法签名,而不是它们的实现。由规范控制的类的方法签名(例如javax.servlet中的那些)只会很少更改,因此编译时JAR和运行时JAR之间的不匹配可能会被忽视。与OSGi兼容的JAR不同,为JEE构建的JAR不包含指定特定兼容依赖版本的元数据 - JEE类加载器将使用它们找到的内容,无论好坏。

然而,你可能会被抓住 - 特别是如果不匹配很大的话。问题在运行时可能非常明显,例如与缺少类或方法相关的异常,但它们可能很微妙。

因此,在可行的情况下,使用与运行时可用的版本相同的编译时版本的依赖项通常是最好的。对于EAP,我记得Red Hat分发了一个Maven物料清单(BOM)文件,该文件指定了特定EAP版本的所有EAP JAR的所有版本。