我想在我的战争中包含(maven)依赖项,同时确保它们不在运行时或测试范围内。
问题如下:
我在战争中需要许多罐子(比如说罐子 A、B 和 C)。这是因为使用了 CDI。
我有许多使用项目产生的战争的集成测试。这些集成测试是基于arquillian的测试。
但是,我还有其他不是集成测试的测试,它们会受到在类路径中包含 jar A、B 和 C 的不利影响。
我想在我的战争中包含(maven)依赖项,同时确保它们不在运行时或测试范围内。
问题如下:
我在战争中需要许多罐子(比如说罐子 A、B 和 C)。这是因为使用了 CDI。
我有许多使用项目产生的战争的集成测试。这些集成测试是基于arquillian的测试。
但是,我还有其他不是集成测试的测试,它们会受到在类路径中包含 jar A、B 和 C 的不利影响。
war
不是依赖范围。有效范围是provided
, compile
, runtime
, test
, system
. 您只能选择其中一个,它们是唯一的选项,并且它们都不排除在test
范围之外。
你有几个选项的属性:运行时、测试、编译等。
例如:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j.version}</version>
<scope>runtime</scope>
</dependency>
更多你可以在这里阅读。
您可以在依赖项部分中指定范围,如下所示。它可以被称为测试、编译或运行时。
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>org.springframework.integration.adapter</artifactId>
<version>1.0.3.RELEASE</version>
<scope>runtime</scope>
</dependency>
希望这可以帮助。谢谢,KJ
不错的选择:
啊哈!可以通过使用 surefire-plugin 从测试阶段排除某些依赖项。这在这个StackOverflow 答案中有所描述。
这样我就可以创建我的战争并且在测试范围内没有依赖项(感谢Peter Mularien)!
不好的选择:
看起来 Maven 程序集插件要求您include
在依赖范围内也有任何可用的依赖项。因为test
它是最小的范围,所以不可能在你的战争中包含一个依赖项,而不让它在项目的测试范围内也可用。
maven war 插件不允许您包含(或排除)依赖项。
另一种选择是创建第二个“分发”模块,在它的 pom.xml 中包含所需的依赖项。然而,这意味着 arquillian 测试引用了之前构建的战争——这也不理想。
另一种选择是使用 Shrinkwrap 创建一个带有测试的 jar 并派生 JVM 来运行“测试”jar——我之前需要使用多个 ORM 测试我的代码时已经这样做了(否则,在你的路径中有 OpenJPA例如,与在您的路径中使用 Hibernate 冲突)。但这会使您的测试与测试框架(JUnit、TestNG 等)断开连接,并使测试难以调试。