【问题标题】:How can I know if a maven dependency is supported by a Java EE web container?我如何知道 Java EE Web 容器是否支持 Maven 依赖项?
【发布时间】:2017-03-02 18:10:35
【问题描述】:

背景:我有一个 Maven 战争项目从 WildFly 10.1.0.Final Java EE7 Full & Web Distribution 迁移到 Payara Server 164 Full。 pom.xml 被设置为专门满足 WildFly 环境。因此,一些<provided> 范围的依赖项在迁移后变得有问题,因为 Payara 没有为它们提供正确的实现。通过将一些依赖范围更改为<compile>,我解决了这些问题。但是尝试每个依赖项以查看是否由容器提供似乎不是很聪明。

问题:我如何知道特定容器支持哪些依赖项?

例如,有许多版本的 Servlet API。我如何知道 GlassFish 3.1.2.2 是否支持版本 4.0.0-b01

我希望能够以适当的方式做到这一点。例如。从文档中阅读,使用官方工具包等。顺便说一下,我在 Payara 的文档中进行了搜索。但是我没有找到支持的依赖项和版本的列表。

【问题讨论】:

    标签: maven application-server


    【解决方案1】:

    好吧,我最终找到了一个更好的方法来做到这一点。我受到this answer 的启发,尽管它与我的问题没有直接关系。

    简答: 转到维基百科上的Java EE version history。每个 Java EE 容器版本实现的所有 API 都有完整的实现列表。

    完整答案:

    Java EE 容器是 Java EE API 的实现。这意味着 Java EE 项目不需要包含正在使用的依赖项的所有实现库。相反,他们只需要 API 库,例如 servlet-api : 3.1.0。但是,如果任何 API 版本“太新”或“太旧”,并且调用了未实现的抽象方法,则会抛出 AbstractMethodError

    以下是重现此错误的示例:

    在带有 jdk 1.8 的 Java EE 7 容器 (GlassFish 4) 上,使用 servlet-api : 4.0.0-b02 作为您的 Servlet API(其中包含具有默认实现的抽象方法)。创建一个 ServletFilter 而不实现 initdestroy 方法。部署并启动服务器。启动过程中会出现AbstractMethodError

    原因是servlet-api : 4.0.0-b02 应该在 Java EE 8 中实现。Java EE 7 与不支持默认接口方法的 jdk 1.7 相关联。对于servlet-api : 3.1.0(由Java EE 7 实现),必须在项目中实现initdestroy 方法。然而,当使用servlet-api : 4.0.0-b02 时,可以不实现它们。这就是问题发生的地方。

    总之,在 Java EE API 及其实现之间使用不同版本通常不是一个好主意。 Oracle 提供了specifications 不同版本的Java EE API 作为官方介绍。在构建项目依赖项时应该检查它。

    【讨论】:

    • 所以,这个答案不是关于“最佳实践”。它会告诉您使用 Java EE 容器可以做什么、它如何响应以及为什么会这样响应。
    【解决方案2】:

    直接使用它们并不是一个非常聪明的主意。

    如果您需要网络配置文件,只需使用:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    

    如果您需要完整的配置文件,请将其稍微更改为:

    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
    

    你就完成了。从现在开始,项目中存在的来自这组依赖项的所有内容都存在于应用程序服务器中。

    这实际上是正确的方法。你的方式是错误的,谁让你像这样使用 Java EE 应该受到惩罚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多