Spring Boot 轮廓不能正常工作

hc8w905p  于 12个月前  发布在  Spring
关注(0)|答案(2)|浏览(135)

你好,我有一个maven spring Boot rest项目。我想添加dev和prod配置,但它不工作。
在/src/main/resources下,我创建了application.yaml、application-dev.yaml和application-prod.yaml

# application.yaml
spring:
  profiles:
    active: prod

字符串

# application-dev.yaml
server:
  port: 8080
spring:
  datasource:
    url: jdbc:h2:mem:mydb
    username: sa
    password: password
    driverClassName: org.h2.Driver

# application-prod.yaml
server:
  port: 8099
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/WsDb
    username: postgres
    password: postgres
    driverClassName: org.postgresql.Driver


在pom.xml中,我有以下内容:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
...
</dependencies>
<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>
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <spring.profiles.active>dev</spring.profiles.active>
        </properties>
        <dependencies>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
            </dependency>
        </dependencies>
    </profile>
    <profile>
        <id>prod</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <spring.profiles.active>prod</spring.profiles.active>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>${postgres.version}</version>
            </dependency>
        </dependencies>
    </profile>
</profiles>


当我用命令mvn clean package spring-boot:run -Dspring.profiles.active = prod在Intellij Idea中运行调试配置的应用程序时,它说:

测试阶段输出

The following 1 profile is active: "prod"   
Bootstrapping Spring Data JPA repositories in DEFAULT mode.  
Finished Spring Data repository scanning in 164 ms. Found 2 JPA repository interfaces.  
Replacing 'dataSource' DataSource bean with embedded version   
Starting embedded database: url='jdbc:h2:mem:4348112a-775e-4b78-a5b7-e5bcfdf21761  
HHH000204: Processing PersistenceUnitInfo [name: default]

运行阶段输出

No active profile set, falling back to 1 default profile: "default"
Bootstrapping Spring Data JPA repositories in DEFAULT mode.
Finished Spring Data repository scanning in 116 ms. Found 2 JPA repository interfaces.
Tomcat initialized with port 8080 (http) 
Starting service [Tomcat]

4c8rllxm

4c8rllxm1#

**问题解决了!**下面是一个摘要。

有两个问题:

第一个问题是application.yml、application-dev.yml和application-prod.yml没有被复制到target中,因此没有效果。这是由于我添加了一个构建配置:

<resources>
   <resource>
      <directory>/src/main/resources</directory>
      <filtering>true</filtering>
   </resource>
</resources>

字符串
这导致maven无法找到资源文件,因此抛出一条Info消息:INFO] skip non existing resourceDirectory C:\src\main\resources
为了解决这个问题,我不得不在路径后面加上${project.basedir}

<directory>${project.basedir}/src/main/resources</directory>

在所有这些解决方案被证明是不需要的之后,请参阅@Easterwood的评论,删除/src/main/resources开头的第一个/解决了问题

<directory>src/main/resources</directory>


在此更改之后,maven可以找到资源文件并打印[INFO] Copying 3 resources from src\main\resources to target\classes

第二个问题是测试运行的配置文件是通过命令行设置的,参数为-Dspring.profiles.active=prod x1c 0d1x

当jar使用默认配置文件(通过

spring:
   profiles: 
      active: dev


如果在application.yml或命令行中没有指定,则使用“default”配置文件。
为了解决这个问题,我不得不在调试配置中设置一个环境变量。



这和


更新20.12.2023

我将maven变量spring.profiles.active重命名为activeProfiles

<properties>
   <activeProfiles>dev</activeProfiles>
</properties>


以及相应的配置文件属性设置

<profile>
   <id>dev</id>
   <properties>
      <activeProfiles>dev</activeProfiles>
    </properties>
<profile>

<profile>
    <id>prod</id>
    <properties>
        <activeProfiles>prod</activeProfiles>
    </properties>


现在要在调试配置中选择profile i use -P参数,

mvn clean spring-boot:run -Pdev


mvn clean spring-boot:run -Pprod


这将根据活动配置文件(dev或prod)设置maven变量activeProfiles的值,该值将在application.yml中被替换

spring:
  profiles:
    active: @activeProfiles@


另外,我不得不在pom.xml中添加h2数据库依赖项,因为spring Boot 抱怨在测试阶段没有找到驱动程序。

<project>
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
         </dependency>

bf1o4zei

bf1o4zei2#

据我所知,命令行参数-Dspring.profiles.active=prod没有影响。spring-boot插件文档描述了如何激活配置文件。

mvn spring-boot:run -Dspring-boot.run.profiles=dev,local

字符串
在你的项目中,prod配置文件被激活只是因为application.yaml文件中的spring.profiles.active属性。这把我引诱到了错误的渡船上。
在spring文档中也有一个如何使用maven profile激活spring profile的示例。

<project>
    <properties>
        <app.profiles>local,dev</app.profiles>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <profiles>${app.profiles}</profiles>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

相关问题