您好,我正在尝试切换基于活动配置文件的数据库,所以我使用maven profile来过滤数据库依赖项
这是我的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
</dependencies>
<profiles>
<profile>
<id>couhbase</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>couhbase</spring.profiles.active>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-couchbase-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-couchbase</artifactId>
<version>3.0.9.RELEASE</version>
</dependency>
<dependency>
<groupId>com.couchbase.client</groupId>
<artifactId>java-client</artifactId>
<version>2.5.4</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>dev</id>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>这里我们有两个配置文件,当配置文件是couhbase时,它应该连接couchbase DB,如果它是开发的,那么它应该连接到MongoDB
这是我的属性文件
spring.couchbase.bootstrap-hosts=127.0.0.1
spring.couchbase.bucket.name=config
spring.couchbase.bucket.password=
spring.profiles.include=@spring.profiles.active@,并在maven build上构建项目时设置配置文件名称。

所以,如果配置文件是couhbase我能够连接couchbase没有任何问题,但当我试图更改配置文件到开发,然后我得到了问题,而建设的项目
下面是问题所在

它试图编译扩展AbstractReactiveCouchbaseConfiguration以设置连接参数的ReactiveCouchbaseConfiguration类,这是类
@Configuration
@Profile("couhbase")
@EnableReactiveCouchbaseRepositories("com.baeldung.couchbase.domain.repository")
public class ReactiveCouchbaseConfiguration extends AbstractReactiveCouchbaseConfiguration {
private CouchbaseProperties couchbaseProperties;
@Value("${spring.profiles.active}")
private String activeProfile;
@Autowired
private Environment env;
public ReactiveCouchbaseConfiguration(CouchbaseProperties couchbaseProperties) {
//System.out.println( env.getActiveProfiles());
this.couchbaseProperties = couchbaseProperties;
}
@Override
protected List<String> getBootstrapHosts() {
return couchbaseProperties.getBootstrapHosts();
}
@Override
protected String getBucketName() {
return couchbaseProperties.getBucketName();
}
@Override
protected String getBucketPassword() {
return couchbaseProperties.getBucketPassword();
}
@Override
public CouchbaseEnvironment couchbaseEnvironment() {
return DefaultCouchbaseEnvironment
.builder()
.bootstrapHttpDirectPort(couchbaseProperties.getPort())
.build();
}
}所以我尝试使用profile注解来避免这个类,但它仍然编译这个类,当我们将profile从couhbase更改为dev时,有什么方法可以避免这个类吗?
发布于 2021-01-23 20:51:19
使用@Profile只意味着如果声明的配置文件与活动配置文件不匹配,您的bean将在运行时被忽略。不过,这个类仍然需要编译。为什么要如此努力地分离构建目标中的依赖关系呢?投资回报率是负的,伙计。你只在你的工件上节省了一些MB。
最简单的选择是正常地添加依赖项,而不是在maven配置文件中讨价还价。我推荐这个。
另一种选择是使用springs自动配置和@ConditionalOnClass。你可以玩这个。
最复杂的选择是将所有代码(包括配置bean)移动到一个单独的模块/jar中,并将其添加到相应的maven配置文件中。然后,再次使用springs自动配置选项或配置文件来切换配置。
https://stackoverflow.com/questions/65770495
复制相似问题