bootstrap.yml 未在 Spring Boot 2 中加载

Posted

技术标签:

【中文标题】bootstrap.yml 未在 Spring Boot 2 中加载【英文标题】:bootstrap.yml not loading in Spring Boot 2 【发布时间】:2018-11-22 02:01:09 【问题描述】:

我在启动需要连接到配置服务器的 Spring Boot 客户端应用程序时遇到问题。 bootstrap.yml 文件被忽略

配置服务器 - 这行得通!

server:
  port: 8888  
spring:
  application:
    name: configserver
  cloud:
    config:
      server:
        git:
          uri:https://xxxxx@bitbucket.org/eco/properties.git

bootstrap.yml - 配置客户端 - 不工作!

spring:
  application:
    name: api
  cloud:
    config:
      uri: http://localhost:8888

启动应用程序时忽略文件 bootstrap.yml

POM 客户端

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
</parent>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring-cloud.version>2.0.0.RC2</spring-cloud.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.4.4.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- Database dependencies -->
    <dependency>
        <groupId>com.oracle.jdbc</groupId>
        <artifactId>ojdbc7</artifactId>
        <version>12.1.0.2</version>
        <scope>system</scope>
        <systemPath>$basedir/src/main/resources/lib/ojdbc7-12.1.0.2.jar</systemPath>
    </dependency>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.0</version>
    </dependency>

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.0</version>
    </dependency>

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-properties-migrator</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>
<build>
    <finalName>api-emissor</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>1.3.5.RELEASE</version>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>$java.version</source>
                <target>$java.version</target>
            </configuration>
        </plugin>
    </plugins>
</build>

主类客户端

@SpringBootApplication
@EnableEurekaClient
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
@ComponentScan("br.com.eco.api.emissor")
@EnableJpaRepositories("br.com.eco.api.emissor.repository")
@EntityScan("br.com.eco.api.emissor.domain")
public class Application 
    public static void main(final String[] args) 
        SpringApplication.run(Application.class, args);
    

为什么 bootstrap.yml 会被忽略?

【问题讨论】:

你不能混用 spring cloud 的版本。您使用的是旧版本的 spring cloud Netflix eureka 你认为这可能是我的问题吗? 也许吧,但在你有有效版本之前,我无法确定。 【参考方案1】:

您需要指定一个配置名称,并且它必须与配置服务上的配置文件名称匹配。

spring:
  cloud:
    config:
      name: myService    # myService.yml or myService-[profile].yml( if you have a profile activated).
        uri: http://localhost:8888

【讨论】:

【参考方案2】:

应用程序将使用bootstrap.yml,以防它使用一些spring-cloud依赖项。那可以是云发现客户端

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

云配置客户端

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-client</artifactId>
</dependency>

【讨论】:

【参考方案3】:

在 Spring Boot 配置客户端中添加此依赖项:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

【讨论】:

我只是发现我的应用程序没有通过在我的应用程序上使用 truss 来读取我的引导程序。这个建议解决了这个问题。 这个确实解决了我这边的问题。不是 spring-cloud-starter。 这个好像只有Spring cloud 3以上版本才可用mvnrepository.com/artifact/org.springframework.cloud/…【参考方案4】:

您必须将此依赖项添加到pom.xml

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

【讨论】:

【参考方案5】:

在我的情况下,我使用 STS4 并且默认情况下生成的 POM 文件不起作用,我遇到了和你一样的问题,但是在我对 POM 文件进行了一些更改之后,一切正常,最后我发现了类似的东西在我的控制台中“从服务器获取配置”。 我的 POM 中的变化如下:

    将 Spring Boot 版本更改为 2.2.6.RELEASE。 将spring cloud的版本改为Hoxton.SR6或Hoxton.SR4(我相信任何 Hoxton 版本可以使用)。

应用之前的更改后,我的 POM 文件如下所示:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <!-- <version>2.4.0</version> -->
        <version>2.2.6.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>net.kha.microservices</groupId>
    <artifactId>limits-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>limits-service</name>
    <description>Demo project for Spring Boot - Cloud</description>

    <properties>
        <java.version>1.8</java.version>
        
        <!-- <spring-cloud.version>2020.0.0-SNAPSHOT</spring-cloud.version> -->
        <!-- <spring-cloud.version>2020.0.0-M4</spring-cloud.version> -->
        
        <!--  Both are working with spring boot version 2.2.6.RELEASE 
              you should find something like "Fetching config from server at" in your console 
              each time you run the client project as spring boot app 
        -->
        <spring-cloud.version>Hoxton.SR6</spring-cloud.version>
        <!-- <spring-cloud.version>Hoxton.SR4</spring-cloud.version> -->    
    </properties>

【讨论】:

【参考方案6】:

如果您定义了spring.config.location,它将覆盖所有配置文件的路径,包括bootstrap.yml 的路径,因此您必须将spring.config.location 更改为spring.config.additional-location

因此,当您启动应用时,您必须添加 -Dspring.config.additional-location=/path/to/application.yml

更多信息请查看this

【讨论】:

【参考方案7】:

你需要为spring cloud starter添加依赖。

【讨论】:

我认为没有任何效果。

以上是关于bootstrap.yml 未在 Spring Boot 2 中加载的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 中application.yml与bootstrap.yml的区别

在 Spring Boot 中将属性放在 application.yml 或 bootstrap.yml 上有啥区别?

spring cloud 配置文件application.yml和bootstrap.yml 的定位,区别和联系

创建依赖于具有自己的 bootstrap.yml 的 Spring Boot 的库

Spring Cloud 配置中心多环境配置bootstrap.yml

spring boot 知识点