【问题标题】:Specify profile for dependency with 'provided' scope in Maven在 Maven 中使用“提供”范围指定依赖项的配置文件
【发布时间】:2016-03-07 20:46:56
【问题描述】:

我正在开发一个多模块构建,当我为构建运行集成测试时,它需要构建中另一个模块生成的工件之一作为依赖项。我正在使用“提供”范围,因此它不包含在为我们正在构建的模块生成的工件中,但要确保它已编译,以便我们可以将其用于测试。但是,我们作为依赖项列出的组件有它自己运行的一组集成测试。我希望能够在依赖项的定义中指定 Maven 在解析依赖项时应该使用的配置文件(例如,打包,而不是验证)。有没有办法在依赖项的定义中指定我们想要解决依赖关系的 Maven 阶段/配置文件?

当前设置:

 <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
        <scope>provided</scope>
 </dependency>

所需的设置:

 <dependency>
        <groupId>groupId</groupId>
        <artifactId>artifactId</artifactId>
        <version>version</version>
        <scope>provided</scope>
        <!-- only go up until package phase for dependency artifact --> 
        <phase>package</phase>
        <!-- use dependency's skip-tests profile to compile it -->
        <profile>skip-tests</profile>
 </dependency>

【问题讨论】:

  • 您能否提供或重新提出您的问题?也许添加多模块结构和依赖关系的ascii图?否则你的要求可能会导致误解(就是我没明白)

标签: maven


【解决方案1】:

假设 B 是依赖项,A 是您要构建的带有完整测试的项目,C 是 A 和 B 的父项。

A 依赖于 B,它的 pom 中有 this:

<dependency>
        <groupId>BgroupId</groupId>
        <artifactId>BartifactId</artifactId>
        <version>Bversion</version>
        <scope>provided</scope>
 </dependency>

B 有一个非测试配置文件,默认情况下不活动。它在 pom 的末尾定义:

<profiles>
    <profile>
      <id>no-test</id>
      <active>false</active>
      <build>
       <plugins>
        <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
           <skipTests>true</skipTests>
         </configuration>
        </plugin>
      </plugins>
     </build>        
    </profile>
</profiles>

然后您可以使用无测试配置文件构建 C。您必须在 C 项目的根目录下执行以下命令:

mvn clean install -Pno-test

因此,C 将首先使用无测试配置文件构建 B(因为 A 需要 B)。所以 B 将使用“skip-tests”属性构建。

然后 C 将构建 A。由于 A 项目的 pom 中没有为“no-test”配置文件定义特定行为,因此将构建 A 并进行完整测试。

【讨论】:

  • 感谢您的快速回复。您指定的配置文件会在我提供测试的模块的 pom 中(让我们将此模块称为模块 A),还是我列为依赖项的模块(模块 B)?我想使用“所有测试”配置文件(运行所有测试,包括单元、组件、集成测试)为模块 A 构建,并使用模块 B 的工件作为依赖项。如果我将此依赖项放在“所有测试”配置文件模块 A 中,它如何知道模块 B 使用什么配置文件?我将测试这个提议的解决方案,但想知道您的解决方案是如何工作的。
  • 也许我误解了你的问题(我又读了一遍)。因此,如果我改述一下,您想将 B 包阶段之后生成的 jar 用作 A 的依赖项吗?对不起,如果我让你重复...
  • 不用担心;这是一个复杂的问题。我想使用模块 B 的工件作为模块 A 中提供的范围的依赖项。当我当前运行模块 A 的构建并将模块 B 列为依赖项时,它运行模块 B 的整个构建,包括模块 B 的集成测试、组件测试和单元测试。当我将模块 B 指定为依赖项时,我想跳过模块 B 的所有测试,只编译它。我想看看依赖定义中是否有办法指定要用于模块 B 的配置文件。
  • 你能提供 A 的 pom 吗?这听起来可能是个愚蠢的问题,但 B 是 A 的孩子吗?
  • B 不是 A 的孩子。A 和 B 是多模块 Maven 项目中的模块。需要 B 的工件来为 A 运行集成测试。不幸的是,我不允许在线发布源代码,这就是我使用抽象示例的原因。
猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 2018-12-10
  • 2018-07-30
  • 2018-05-19
  • 1970-01-01
  • 2017-12-12
  • 2011-12-31
  • 1970-01-01
相关资源
最近更新 更多