如何为 gradle 构建的 spring 引导应用程序设置活动配置文件?
how to set active profile for gradle build of spring boot application?
这是我的 spring-boot 应用程序的 DbConfig。
@Configuration
@EnableTransactionManagement
public class DBConfig
{
@Bean
public LocalSessionFactoryBean sessionFactory()
{
....
}
@Bean
public DataSource aaDataSource()
{
.....
}
public PlatformTransactionManager transactionManager()
{
....
}
private Properties hibernateProperties()
{
....
}
}
这是我的测试class
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class ApplicationTests {
@Test
public void contextLoads() {
}
}
它是一个 gradle 项目。
当我在本地 运行 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)
我在 src/main/resources/ 中尝试 运行ning gradlew clean build -Dspring.profiles.active=qa
与 application-qa.properties 有质量检查数据库设置。构建仍然失败,出现同样的异常。
我有两个选择。
运行 跳过数据源 bean 创建的构建。我仍然需要我的单元测试 运行 因为它们不依赖数据源
或将正确的设置传递给 gradle 构建,以便创建应用程序上下文。
我更喜欢第二种方法来让它工作
如果您的要求是从外部控制它(即,在启动 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
注释您的测试 class,但您需要实现自定义 ActiveProfilesResolver
并注册它,而不是传递静态配置文件通过 @ActiveProfiles(resolver = MyCustomResolver.class)
。然后,您的客户解析器可以简单地读取 return spring.profiles.active
系统 属性.
的值
另一种选择是实现自定义 ApplicationContextInitializer
,以编程方式设置活动配置文件(类似于自定义 ActiveProfilesResolver
)。您可以通过 @SpringApplicationConfiguration(initializers = MyCustomInitializer.class)
.
配置其中之一
另一种选择是 programmatically set the active profiles directly in your SpringApplication
——例如,基于系统 属性 或环境变量。
因此,您有多种选择。
这是我的 spring-boot 应用程序的 DbConfig。
@Configuration
@EnableTransactionManagement
public class DBConfig
{
@Bean
public LocalSessionFactoryBean sessionFactory()
{
....
}
@Bean
public DataSource aaDataSource()
{
.....
}
public PlatformTransactionManager transactionManager()
{
....
}
private Properties hibernateProperties()
{
....
}
}
这是我的测试class
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class ApplicationTests {
@Test
public void contextLoads() {
}
}
它是一个 gradle 项目。
当我在本地 运行 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)
我在 src/main/resources/ 中尝试 运行ning gradlew clean build -Dspring.profiles.active=qa
与 application-qa.properties 有质量检查数据库设置。构建仍然失败,出现同样的异常。
我有两个选择。
运行 跳过数据源 bean 创建的构建。我仍然需要我的单元测试 运行 因为它们不依赖数据源
或将正确的设置传递给 gradle 构建,以便创建应用程序上下文。
我更喜欢第二种方法来让它工作
如果您的要求是从外部控制它(即,在启动 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
注释您的测试 class,但您需要实现自定义 ActiveProfilesResolver
并注册它,而不是传递静态配置文件通过 @ActiveProfiles(resolver = MyCustomResolver.class)
。然后,您的客户解析器可以简单地读取 return spring.profiles.active
系统 属性.
另一种选择是实现自定义 ApplicationContextInitializer
,以编程方式设置活动配置文件(类似于自定义 ActiveProfilesResolver
)。您可以通过 @SpringApplicationConfiguration(initializers = MyCustomInitializer.class)
.
另一种选择是 programmatically set the active profiles directly in your SpringApplication
——例如,基于系统 属性 或环境变量。
因此,您有多种选择。