带有 maven 配置文件的 @profile 注释

如何解决带有 maven 配置文件的 @profile 注释

您好,我正在尝试根据活动配置文件切换数据库,因此我使用了 maven 配置文件来过滤数据库依赖项

这是我的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,如果它是 dev 那么它应该连接到 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 上构建项目时设置配置文件名称

enter image description here


因此,如果配置文件是 couhbase,则可以毫无问题地连接到 couchbase,但是当我尝试将配置文件更改为 dev 时,在构建项目时遇到问题

问题来了

enter image description here

它试图编译扩展 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 从 couhbase 更改为 dev 时,有没有办法避免此类?

解决方法

使用@Profile 仅意味着如果声明的配置文件与活动配置文件不匹配,则您的 bean 将在运行时被忽略。尽管如此,该类仍然需要编译。 为什么要如此努力地分离构建目标中的依赖项?恕我直言,投资回报率是负数。您只会在工件上节省一些 MB。

最简单的选择是正常添加依赖项,而不是在 Maven 配置文件中讨价还价。我会推荐这个。

另一种选择是使用弹簧自动配置和@ConditionalOnClass。你可以玩这个。

最复杂的选择是将所有代码(包括配置 bean)移动到一个单独的模块/jar 中,并将其添加到相应的 maven 配置文件中。然后,再次使用 springs 自动配置选项或配置文件来切换配置。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?