如何为Spring Boot应用程序的Gradle构建设置活动配置文件?

bra*_*orm 2 spring-mvc spring-test gradle spring-boot

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

@Configuration
@EnableTransactionManagement
public class DBConfig
{

    @Bean
    public LocalSessionFactoryBean sessionFactory()
    {
        ....
    }

    @Bean
    public DataSource aaDataSource()
    {
     .....
    }

public PlatformTransactionManager transactionManager()
    {
        ....
    }

    private Properties hibernateProperties()
    {
       ....
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的考试课

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

    @Test
    public void contextLoads() {
    }
}
Run Code Online (Sandbox Code Playgroud)

它是一个摇篮项目。当我在gradlew clean build本地运行时,由于我的application.properties中的连接设置与我的sql连接匹配,因此构建成功。

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

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)
Run Code Online (Sandbox Code Playgroud)

我尝试gradlew clean build -Dspring.profiles.active=qa在具有qa db设置的src / main / resources /中使用application-qa.properties 运行。生成仍因相同的异常而失败。

我有两个选择。

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

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

我更喜欢第二种选择以使其正常工作

Sam*_*nen 5

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

test {
    systemProperty("spring.profiles.active", project.properties.get("springProfiles"))
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以springProfiles像这样设置一个值:(gradlew clean build -PspringProfiles=ci其中ci是要在CI服务器上激活的配置文件的名称)。

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

为此,您需要使用注释您的测试类@ActiveProfiles,但与其传递静态配置文件,不如实现一个自定义ActiveProfilesResolver并通过进行注册@ActiveProfiles(resolver = MyCustomResolver.class)。然后,您的客户解析器可以读取然后简单地返回spring.profiles.active系统属性的值。

另一个选择是实现以ApplicationContextInitializer编程方式设置活动配置文件的自定义(类似于custom ActiveProfilesResolver)。您可以通过配置其中之一@SpringApplicationConfiguration(initializers = MyCustomInitializer.class)

还有另一种选择是直接在您的程序SpringApplication中以编程方式设置活动配置文件 -例如,基于系统属性或环境变量。

因此,您有几种选择。