如何为Spring引导应用程序的gradle构建设置活动配置文件?

时间:2016-09-16 22:50:16

标签: spring-mvc gradle spring-boot spring-test

这是我的spring-boot应用程序的DbConfig。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class ApplicationTests {

    @Test
    public void contextLoads() {
    }
}

这是我的测试类

gradlew clean build

这是一个gradle项目。 当我在本地运行java.lang.IllegalStateException: Failed to load ApplicationContext .... Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean]: Factory method 'entityManagerFactory' threw exception; nested exception is com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(Abstract ..... Caused by: com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:544) at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:171) at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:60) at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:48) ..... Caused by: java.sql.SQLException: Access denied for user 'admin1'@'localhost' (using password: YES) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771) 时,我成功构建,因为我在application.properties中的连接设置与我的sql连接匹配。

但是当我在qa环境中从jenkins框运行时(数据库是qa),构建失败并出现以下异常。

gradlew clean build -Dspring.profiles.active=qa

我尝试在带有qa db设置的src / main / resources /中的application-qa.properties运行{{1}}。构建仍然以相同的异常失败。

我有两个选择。

  1. 运行构建跳过数据源bean创建。我仍然需要运行我的单元测试,因为他们不依赖于数据源

  2. 或将正确的设置传递给gradle构建,以便创建应用程序上下文。

  3. 我更喜欢第二种选择让它运转

1 个答案:

答案 0 :(得分:5)

如果您的要求是从外部控制(即,在启动Gradle时通过命令行),则可以按如下方式修改Gradle test任务配置。

test {
    systemProperty("spring.profiles.active", project.properties.get("springProfiles"))
    // ...
}

然后您可以设置springProfiles的值,如下所示:gradlew clean build -PspringProfiles=ci(其中ci是您希望在CI服务器上处于活动状态的个人资料的名称。)

以上将使spring.profiles.active可用作测试的JVM系统属性;但是,您仍然需要为 Spring TestContext Framework 设置活动配置文件。

为此,您需要使用@ActiveProfiles为测试类添加注释,但不是传递静态配置文件,而是需要实现自定义ActiveProfilesResolver并通过{{1注册}}。然后,您的客户解析器可以读取,然后只返回@ActiveProfiles(resolver = MyCustomResolver.class)系统属性的值。

另一种选择是实现以编程方式设置活动配置文件的自定义spring.profiles.active(类似于自定义ApplicationContextInitializer)。您可以通过ActiveProfilesResolver配置其中一个。

另一种选择是programmatically set the active profiles directly in your SpringApplication - 例如,基于系统属性或环境变量。

所以,你有几个选择。