Как пропустить выполнение плагина Maven, если указано "-DskipTests" или "-Dmaven.test.skip = true"?
Я использую 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
, я бы хотел пропустить этот плагин. Как мне это сделать? Я попытался изменить этап выполнения на "тест", но затем мои модульные тесты запускаются перед этим плагином, чего я не хочу.
Ответы
Ответ 1
Вы можете использовать профили, которые активируются при использовании одного из свойств пропуска unit test для установки нового свойства (например, skipLiquibaseRun
), который содержит флаг, если липибаза должна работать или нет
<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>
Не тестировалось, но надеюсь, что это сработает; -)
Ответ 2
Это сработало для меня:
<configuration>
<skip>${skipTests}</skip>
</configuration>
ИЛИ
<configuration>
<skip>${maven.test.skip}</skip>
</configuration>
Ответ 3
Я думаю, что наиболее прямым способом является каскадирование свойств "пропустить" в вашем POM:
<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 Plugin: Пропуск тестов для получения более подробной информации о каждом из свойств "пропустить", упомянутых в этом ответе.
Ответ 4
Я не думаю, что это можно сделать напрямую, но вы можете добавить -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
Ответ 5
Попробуйте добавить его в профиль, подобный приведенному ниже примеру (однако это будет работать только в случаях, когда 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>