9

我在让 Eclipse 遵守测试范围的 Maven 依赖项时遇到了一些问题——它出现在构建路径上,并与 eclipse 的编译/javadoc 解析相混淆。

Java EE 库的示例

我一直在使用该javaee-api-6.0库来编译我的 Java EE 应用程序。

但是,出于单元测试的目的,我想访问的不仅仅是 api——我需要一个实现。所以我将嵌入式 glassfish 库包含在一个测试范围内,如下所示:

<repositories>
    <repository>
        <id>glassfish-extras-repository</id>
        <url>http://download.java.net/maven/glassfish/org/glassfish/extras</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.glassfish.extras</groupId>
        <artifactId>glassfish-embedded-all</artifactId>
        <version>3.1.1</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-api</artifactId>
        <version>6.0</version>
        <scope>compile</scope>
        <type>jar</type>
    </dependency>
</dependencies>

使用 Maven 按预期工作

据我了解,由于<scope>test</scope>glassfish 的依赖,它不会包含在常规compile阶段。

因为这两个依赖项都将包含在test-compile阶段中,所以我确定将 glassfish 依赖项放在 javaee-api 依赖项之前,以便在编译测试类时优先使用前者而不是后者。因此,当只使用 Maven 构建时,这种配置不是问题。

在 Eclipse 中无法按预期工作

但是,当使用 m2e 和 Eclipse 时,glassfish 依赖项列在我的构建路径中:

构建路径上列出的依赖项

由于 glassfish 依赖项列在 java-ee-api 依赖项之前,因此 Eclipse 似乎使用了错误的库(glassfish,而不是 java-ee-api)来验证/编译/查找 javadocs。(实际上,我不是 100% 确定编译使用了错误的库 - 这取决于 Eclipse 是否在后台使用 Maven 来执行验证代码时使用的编译,我不知道是否是 - 但是javadoc 查找肯定引用了错误的库)

问题

除了运行单元测试时,如何阻止 Eclipse 使用 glassfish 库?我想确保我的编译/javadoc 查找发生在 api 上,而不是该 api 的特定实现。

4

4 回答 4

10

自从我第一次发布这个问题以来已经有一段时间了,但是:

除了运行单元测试时,如何阻止 Eclipse 使用 glassfish 库?

你不能。Eclipse 与每个项目一个构建路径的概念相关联,m2e/m2e-wtp 不能(或不会)克服这个限制,如以下错误所述:

依赖范围对 Eclipse 编译没有影响

2016 年 6 月 8 日更新

随着 JEE7 的发布,javaee-apijar 文件现在包含真正可用的类文件。这意味着它可以在测试中使用,我不需要glassfish-embedded-all在 pom 文件中指定它之前的 jar 文件。

因此,现在 Eclipse 正在从正确的 jar 文件(即javaee-api而不是glassfish-embedded-all)中提取源代码和 javadoc,我并不关心测试范围glassfish-embedded-all仍然在 Eclipse 的类路径中。

这不是我最初提出的问题的解决方案,但它我当时遇到的根本问题的解决方案。也许它也会对其他人有所帮助。

于 2013-03-20T07:54:05.487 回答
7

我也一直在努力解决这个问题,终于找到了解决方案。您已经安装了 m2e 插件,但您还需要默认未安装的 m2e wtp 连接器。根据您的 m2e 版本,这会有所不同。对于最新版本,在“首选项”->“Maven”->“发现”下。单击“打开目录”。选择 M2E - WTP 连接器。

安装后,右键单击您的项目并选择“Maven”->“更新项目配置...”

您的 pom.xml 应如下所示:

<dependency>
    <groupId>org.glassfish.main.extras</groupId>
    <artifactId>glassfish-embedded-all</artifactId>
    <version>3.1.2.2</version>
    <scope>test</scope>
</dependency>

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

Eclipse应该部署愉快,单元测试应该在eclipse中执行,命令行上的maven也应该可以接受。

希望这可以帮助。

于 2012-04-16T19:22:41.173 回答
2

如果您将surefire-plugin配置为

  • 排除 API 依赖(作为项目依赖包含在内)和
  • 包含 glasfish 依赖项(不要将其包含到项目依赖项中)

像这样:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
            <configuration>
                <classpathDependencyExcludes>
                    <classpathDependencyExclude>javax:javaee-api
                    </classpathDependencyExclude>
                </classpathDependencyExcludes>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.glassfish.extras</groupId>
                    <artifactId>glassfish-embedded-all</artifactId>
                    <version>3.1.1</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

查看surefire 插件(执行测试的插件)站点的配置类路径部分。


来自文档(外部排除元素名称内部排除元素名称,带有' s ')

     <classpathDependencyExcludes>
        <classpathDependencyExcludes>org.apache.commons:commons-email</classpathDependencyExcludes>
      </classpathDependencyExcludes>

但我想它应该是(只有带有' s '的外部元素名称):

     <classpathDependencyExcludes>
        <classpathDependencyExclude>org.apache.commons:commons-email</classpathDependencyExclude>
      </classpathDependencyExcludes>
于 2012-02-24T22:48:24.207 回答
0

我认为从 Eclipse 方面来说,如果你在 buildpath 中没有 lib,你就不能将它专门用于单元测试或资源处理等。

从实践中 - 尝试在 pom.xml 中安排依赖关系,并且在大多数情况下,eclipse buildpath 中的库顺序将是相同的。

于 2012-02-24T09:52:47.903 回答