如何从Eclipse中排除Maven测试范围的依赖项(但将其保留在单元测试的路径中)

Rya*_*tts 9 dependencies m2eclipse java-ee maven m2e

我在使Eclipse符合测试范围的Maven依赖项时遇到了一些问题 - 它出现在构建路径上并且弄乱了eclipse的编译/ javadoc解析.

Java EE库的示例

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

但是,出于单元测试的目的,我想访问的不仅仅是api - 我需要一个实现.所以我将嵌入式glassfish libs包含在这样的测试范围内:

<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>
Run Code Online (Sandbox Code Playgroud)

与Maven一起工作

根据我的理解,由于<scope>test</scope>玻璃鱼依赖性,它不会被包括在常规compile阶段.

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

在Eclipse中不能按预期工作

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

构建路径上列出的依赖项

因为在java-ee-api依赖项之前列出了glassfish依赖项,所以Eclipse似乎使用错误的lib(glassfish而不是java-ee-api)来验证/编译/查找javadoc.(实际上,我并不是100%确定编译使用的是错误的lib - 这取决于是否在Eclipse下使用Maven来执行验证代码时使用的编译,而且我不知道它是否存在 - 但是javadoc查找肯定引用了错误的lib)

问题

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

Rya*_*tts 10

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

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

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

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

2016年6月8日更新

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

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

它不是我最初提出的问题的解决方案,但它我当时遇到的潜在问题的解决方案.也许它也会帮助别人.


小智 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>
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.