如果指定了"-DskipTests"或"-Dmaven.test.skip=true",我该如何跳过Maven插件执行?

41

我正在使用Maven 3.0.3。我有这个插件,通常我希望在我的JUnit测试执行之前运行:

    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <test.mysql.db.user>sbjunituser</test.mysql.db.user>
            <test.mysql.db.password></test.mysql.db.password>
            <test.mysql.db.prefix>sbjunit</test.mysql.db.prefix>
            <test.mysql.db.sid>${test.mysql.db.prefix}_${project.artifactId}</test.mysql.db.sid>
            <test.mysql.db.host>localhost</test.mysql.db.host>
            <test.mysql.db.port>3306</test.mysql.db.port>
            <test.mysql.dataSource.url>jdbc:mysql://${test.mysql.db.host}:${test.mysql.db.port}/${test.mysql.db.sid}</test.mysql.dataSource.url>
            <test.mysql.dataSource.driverClassName>com.mysql.jdbc.Driver</test.mysql.dataSource.driverClassName>
        </properties>
        <build>
            <plugins>
        <!--  Run the liquibase scripts -->
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>2.0.1</version>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.18</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>build-database</id>
                    <phase>process-test-classes</phase>
                    <configuration>
                        <driver>com.mysql.jdbc.Driver</driver>
                        <url>jdbc:mysql://${test.mysql.db.host}:${test.mysql.db.port}/${test.mysql.db.sid}</url>
                        <username>${test.mysql.db.user}</username>
                        <password>${test.mysql.db.password}</password>
                        <changeLogFile>${project.build.directory}/db.changelog-master.xml</changeLogFile>
                        <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                    </configuration>
                    <goals>
                        <goal>update</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

然而,如果有人指定-Dmaven.test.skip=true-DskipTests,我希望跳过这个插件的运行。我该如何做呢?我尝试将执行阶段更改为"test",但是这会导致我的单元测试在此插件之前运行,这不是我想要的。

6个回答

34
这对我有效:

这对我有效:

<configuration>
   <skip>${skipTests}</skip>
</configuration>

或者

<configuration>
   <skip>${maven.test.skip}</skip>
</configuration>

25

您可以使用激活单元测试跳过属性之一时使用的配置文件,设置一个新属性(例如skipLiquibaseRun),该属性保存了Liquibase是否应该运行的标志。

<profiles>
    <profile>
      <id>default</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <skipLiquibaseRun>false</skipLiquibaseRun>
      </properties>
    </profile>
    <profile>
      <id>skipTestCompileAndRun</id>
      <activation>
        <property>
          <name>maven.test.skip</name>
          <value>true</value>
        </property>
      </activation>
      <properties>
        <skipLiquibaseRun>true</skipLiquibaseRun>
      </properties>
    </profile>
    <profile>
      <id>skipTestRun</id>
      <activation>
        <property>
          <name>skipTests</name>
        </property>
      </activation>
      <properties>
        <skipLiquibaseRun>true</skipLiquibaseRun>
      </properties>
    </profile>
</profiles>

使用 liquibase 插件部分中的新属性来决定是否应该 跳过 运行,如下所示:

<configuration>
    <skip>${skipLiquibaseRun}</skip>
    <driver>com.mysql.jdbc.Driver</driver>
    <url>jdbc:mysql://${test.mysql.db.host}:${test.mysql.db.port}/${test.mysql.db.sid}</url>
    <username>${test.mysql.db.user}</username>
    <password>${test.mysql.db.password}</password>
    <changeLogFile>${project.build.directory}/db.changelog-master.xml</changeLogFile>
    <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
</configuration>

尚未经过测试,但希望它能够正常工作 ;-)


10

我认为最直接的方法是在您的POM中级联“skip”属性:

<properties>
  <maven.test.skip>false</maven.test.skip>
  <skipTests>${maven.test.skip}</skipTests>
  <skipITs>${skipTests}</skipITs>
</properties>

然后你可以在你的插件配置中使用上面设置的最后一个"skip"属性:

<configuration>
  <skip>${skipITs}</skip>
</configuration>

详见Maven Failsafe插件:跳过测试,了解本答案中提到的各种“跳过”属性的更多细节。


1
不错!这是我发现的唯一一个处理maven.test.skip和skipTests的答案。 - Compeek
1
故障安全插件文档的链接已经失效。 - flup

6

对于不支持在配置中使用skip的插件,还有一种别扭的方法来跳过却不使用profiles。

在阶段声明中,你可以添加一个pluginxyz.skip属性。

例如:

<properties>
   <property>
      <pluginxyz.skip><pluginxyz.skip>
   </property>     
</properties>
...
<plugin>
    <groupId>org.xyz</groupId>
    <artifactId>xyz-maven-plugin</artifactId>
    <version>2.0.1</version>
    <executions>
      <execution>
        <id>build-database</id>
        <phase>process-test-classes${pluginxyz.skip}</phase>
        <configuration>....</configuration>
     </execution>
<plugin>

然后,当从命令行执行时,您可以添加-Dpluginxyz.skip=true,这将向阶段名称附加true值。

由于没有名为process-test-classestrue的阶段,因此不会执行该目标。


它不适用于-Dpluginxyz.skip=false。 - BartoszMiller
1
@BartoszMiller 我从未说过它会。这确实是一种hacky的方式,但它能够完成工作。 - Marinos An
@BartoszMiller,但是对于-Dpluginxyz.skip=false它确实有效!它将跳过测试,就像您想要的那样,因为您给了它一个值! - Jared

2

尝试将其添加到类似下面示例的配置文件中(但是,仅在未指定maven.test.skip时才有效):

 <profiles>
    <profile>
        <id>execute-liquibase</id>
        <activation>
            <property>
                <name>!maven.test.skip</name>
            </property>
        </activation>
        <build>
            <plugins>
                <!--  Run the liquibase scripts -->
                <plugin>
                    <groupId>org.liquibase</groupId>
                    <artifactId>liquibase-maven-plugin</artifactId>
                    <version>2.0.1</version>
                    <dependencies>
                       <dependency>
                           <groupId>mysql</groupId>
                           <artifactId>mysql-connector-java</artifactId>
                           <version>5.1.18</version>
                       </dependency>
                    </dependencies>
                    <executions>
                       <execution>
                           <id>build-database</id>
                           <phase>process-test-classes</phase>
                           <configuration>
                               <driver>com.mysql.jdbc.Driver</driver>
                               <url>jdbc:mysql://${test.mysql.db.host}:${test.mysql.db.port}/${test.mysql.db.sid}</url>
                               <username>${test.mysql.db.user}</username>
                               <password>${test.mysql.db.password}</password>
                               <changeLogFile>${project.build.directory}/db.changelog-master.xml</changeLogFile>
                               <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                           </configuration>
                           <goals>
                              <goal>update</goal>
                           </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
 <profiles>

我的代码已经是一个配置文件的一部分了。我喜欢你的解决方案,但我不想忽略在我的配置文件中执行的所有内容。 - Dave
那么,我猜你应该进一步描述你的问题,因为它并不是立即清晰的。也许你可以提供更多的细节。 - carlspring
我的问题是 - 我想要阻止插件(在问题中列出的)在有人指定“-Dmaven.test.skip=true”或“-DskipTests”时执行。我在问题中包含了完整的插件信息和它所在的配置文件。请告诉我您希望我包含哪些其他细节。 - Dave
这对于那些没有实现跳过功能的插件来说真的非常好。你正在超越这些插件,以更高的层次控制它们。 - Jason

1
我认为这不能直接完成,但您可以添加-Dliquibase.should.run=false以完全跳过Liquibase(请参见http://www.liquibase.org/manual/maven_update#skip)。如果您不想同时键入两个属性,可以将此属性和skipTests捆绑到单独的配置文件中。
<profiles>
    <profile>
        <id>skipTestAndDb</id>
        <properties>
            <skipTests>true</skipTests>
            <liquibase.should.run>false</liquibase.should.run>
        </properties>
    </profile>
</profiles>

那么您只需要输入mvn install -PskipTestAndDb


你是自己编造了“liquibase.should.run”属性吧?你怎么让这个属性意味着插件不运行呢?你需要在liquibase插件执行中添加哪些代码? - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接