10

我有一个多模块 Maven+Spring 项目。一些模块依赖于其他模块。

假设我们有一个名为的模块services,它依赖于名为的模块persistence

服务模块:

  • 在 Spring 级别,导入persistence上下文
  • 在 Maven 级别,取决于persistence模块

persistence模块定义了一些与......持久性相关的配置:数据源,JPA,事务......

它有一些用于测试数据库(JDBC 驱动程序、DBCP、H2)的依赖项,这些依赖项仅限于测试范围,因为当应用程序部署时,DataSource 将在容器(Tomcat)中定义并通过 JNDI 访问。

现在,我想在模块的 Maven 测试阶段访问services模块的测试范围(传递)依赖项persistence

Maven 手册(表 3.1)说,通常情况下,测试范围的依赖关系是不可传递的。

是否有可能在多模块项目的上下文中以某种方式获得它们?

如果不是什么是好的选择?(在父 pom 中定义测试依赖项?...)

4

2 回答 2

23

我确切地找到了它应该如何工作,即通过在另一个用作依赖项的模块中生成一个测试 JAR ,这是一种工件,在我们的示例中是持久性模块:

<build>
    <plugins>

            <!-- Generate test jar too -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

    </plugins>
</build>

然后通过将此测试 jar 声明为另一个模块的测试范围依赖项,在我们的示例中为services模块:

<!-- Services module -->
<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>services</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>services</artifactId>
    <version>${project.version}</version>
    <type>test-jar</type>
    <scope>test</scope>
</dependency>

请注意第二个依赖项与第一个依赖项相同,除了type设置为test-jarscope设置为测试。

现在,您可以想象在模块中编写的测试service可以访问模块的测试类persistence可行),还可以访问持久性模块的测试范围依赖项。

但是,这是一个已知问题 ( https://issues.apache.org/jira/browse/MNG-1378 ),它不能以这种方式工作。它自 2005 年以来一直开放,所以我认为它不会在不久的将来修复……但谁知道呢。

我只需要复制两个模块上的测试范围依赖项,或者只是在父 pom 中定义它们...

于 2013-04-16T12:28:41.213 回答
1

应该的,但不是。它也发生在提供的范围内。此处记录的问题:https ://issues.apache.org/jira/browse/MNG-5255

于 2013-04-04T19:07:13.627 回答