在调试一个不相关的问题时,我注意到我们的一个较新的项目在类路径上的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冲突,但我知道它们会在某个时候再次咬我。
该课程应该从哪里来?
非常感谢。
答案 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>