Maven 项目从依赖项运行 sql-maven-plugin 执行



如何配置我的Mavenpom.xml和/或sql-maven-plugin,以便在构建项目com.example.projectpom.xml时,我在依赖项lib.example.jdbc中指定的与单元测试相关的数据库执行不会被执行?目前,当我在pom.xml上运行mvn clean installcom.example.project时,我发现我的SQL数据库具有在lib.example.jdbc中创建的表。一个明显的解决方法是在每个pom.xml文件中对mysql.database使用不同的属性,但我觉得更大的问题是库的(依赖项)数据库执行是在主项目的测试阶段运行的。我无法想象这是正确的,因为一个人可以有数百个pom.xml依赖项,它们有自己的测试和数据库执行,这些依赖项在构建最终项目时不应该运行。

更新:Spring注释是我答案中发现的罪魁祸首,因此我更新了问题标签以反映这一点。

以下是lib.example.jdbcpom.xml的相关示例:

...
<groupId>lib.example</groupId>
<artifactId>jdbc</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
...
<properties>
...
<mysql.port>3306</mysql.port>
<mysql.database>testDb</mysql.database>
<mysql.user>root</mysql.user>
<mysql.pass>password</mysql.pass>
</properties>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.5</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
</dependencies>
<configuration>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://${mysql.host}:${mysql.port}/${mysql.database}?useSSL=false</url>
<username>${mysql.user}</username>
<password>${mysql.pass}</password>
<settingsKey>sensibleKey</settingsKey>
<!--all executions are ignored if -Dmaven.test.skip=true-->
<skip>${maven.test.skip}</skip>
</configuration>
<executions>
<execution>
<id>create-db</id>
<phase>process-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<url>jdbc:mysql://${mysql.host}:${mysql.port}?useSSL=false</url>
<autocommit>true</autocommit>
<sqlCommand>create database if not exists `${mysql.database}`</sqlCommand>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

这是com.example.projectpom.xml的相关样本:

<groupId>com.example</groupId>
<artifactId>project</artifactId>
<version>0.0.1</version>
...
<properties>
...
<mysql.port>3306</mysql.port>
<mysql.database>testDb</mysql.database>
<mysql.user>root</mysql.user>
<mysql.pass>password</mysql.pass>
</properties>
...
<dependencies>
...
<dependency>
<groupId>lib.example</groupId>
<artifactId>jdbc</artifactId>
<version>1.0.0</version>
</dependency>
...
</dependencies>
...
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.5</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
</dependencies>
<configuration>
<driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://${mysql.host}:${mysql.port}?useSSL=false</url>
<username>${mysql.user}</username>
<password>${mysql.pass}</password>
<settingsKey>sensibleKey</settingsKey>
<!--all executions are ignored if -Dmaven.test.skip=true-->
<skip>${maven.test.skip}</skip>
</configuration>
<executions>
<execution>
<id>drop-db-before-test-if-any</id>
<phase>process-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<url>jdbc:mysql://${mysql.host}:${mysql.port}?useSSL=false</url>
<autocommit>true</autocommit>
<sqlCommand>drop database if exists `${mysql.database}`</sqlCommand>
<sqlCommand>create database `${mysql.database}`</sqlCommand>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

经过进一步调查,似乎问题不在于sql-maven-plugin,而在于从lib.example.jdbc中的测试范围配置运行com.example.project测试时执行 Spring 注释 (@Sql) 的方式。这是lib.example.jdbc中给我带来问题的类级别注释。我将代码从我的schema.sql中移出并data.sql到我的pom.xml<sqlCommand>块中,并且在测试com.example.project时不再执行它。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfig.class})
@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts = {"classpath:schema.sql","classpath:data.sql"})
public class DataDaoTest {
...
@Test
public void testRetrieval() throws Exception {
...
}
}

最新更新