在类路径上的UIComponent两次,应该从哪里导入?

时间:2019-04-17 16:16:44

标签: maven jsf java-ee

在调试一个不相关的问题时,我注意到我们的一个较新的项目在类路径上的javax.faces.component.UIComponent在不同版本上有两次。它们是从Tomee lib目录中的provided这两个依赖项加载的:

    <!-- Parent POM-->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- Web POM-->
    <dependency>
        <groupId>org.apache.myfaces.core</groupId>
        <artifactId>myfaces-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>

虽然目前这不会引起任何问题,但我想消除Classpath冲突,但我知道它们会在某个时候再次咬我。

该课程应该从哪里来?

非常感谢。

1 个答案:

答案 0 :(得分:2)

这不会冲突,因为两者都标记为provided。即责任在于目标运行时(在您的特定情况下为TomEE)。这样您就可以安全地按原样离开。

但是订购并不理想。隐含特定API的排名应在特定于规范API之前 。这对于代码的正确运行不是必需的,但是对于工具的正确运行通常是必需的。例如,Eclipse内置调试器选择列出的第一个,但是在这种特定情况下,实际上是正在加载的隐式特定API。因此,在调试时,您可能会面临源代码行与实际执行的行“不同步”的情况,因为Eclipse是从特定于规范的API附加源代码。这只是烦人。

因此,理想情况下,为了使IDE在调试期间加载并附加正确的源代码文件,请按以下顺序对其进行重新排序:

<dependency>
    <groupId>org.apache.myfaces.core</groupId>
    <artifactId>myfaces-api</artifactId>
    <version>2.3.3</version>
    <scope>provided</scope>
</dependency>

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

但是,如果您不关心所有这些,而只想尽可能减少pom的使用,请删除impl特定的API,以便它可以在除Java EE 8容器之外的任何Java EE 8容器上运行仅与MyFaces一起提供。

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

另请参见: