首页 > 其他分享 >IDEA Spring Boot Maven 多环境

IDEA Spring Boot Maven 多环境

时间:2023-06-15 15:24:04浏览次数:48  
标签:java Spring boot Boot springframework Maven yaml Composer org

源码地址:

Gitee GitHub
后端 https://gitee.com/linjiabin100/pi-admin.git https://github.com/zengpi/pi-admin.git
前端 https://gitee.com/linjiabin100/pi-admin-web.git https://github.com/zengpi/pi-admin-web.git

多环境的作用在于允许在不同的运行环境中使用不同的配置。通常,在开发、测试和生产环境中,应用程序的配置可能会有所不同。这些配置包括数据库连接信息、日志级别、缓存设置、第三方服务的API密钥等等。使用多环境配置,可以根据当前运行的环境加载适当的配置,从而使应用程序在不同环境中具备不同的行为。

Spring Boot通过使用Maven或Gradle的profiles功能来实现多环境配置。在Maven中,可以为每个环境创建一个profile,并在对应的profile中定义相关的配置。例如,可以创建一个名为"dev"的profile,其中包含用于开发环境的配置,以及一个名为"prod"的profile,其中包含用于生产环境的配置。通过激活不同的profile,可以告诉Spring Boot在特定环境下使用哪个配置。

  1. 打开项目中的 pom.xml 文件。

  2. <profiles> 标签内,定义多个不同环境的 profile。每个 profile 包含一个唯一的 <id> 和相关的配置信息。例如:

    <profiles>
        <profile>
            <id>dev</id>
            <properties>
                <profiles.active>dev</profiles.active>
                <logging.level>debug</logging.level>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>test</id>
            <properties>
                <profiles.active>test</profiles.active>
                <logging.level>debug</logging.level>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <profiles.active>prod</profiles.active>
                <logging.level>info</logging.level>
            </properties>
        </profile>
    </profiles>
    
  3. <build> 标签内,使用 <resources> 元素来指定资源文件的过滤器(filters)路径。例如:

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>application*</include>
                <include>bootstrap*</include>
                <include>banner.txt</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
    
  4. src/main/resources 目录下,创建与每个 profile 对应的资源文件。这些资源文件可以包含特定于每个环境的配置。例如,创建 application.yamlapplication-dev.yamlapplication-test.yamlapplication-prop.yaml 四个文件。

  5. 在每个资源文件中,使用 Maven 的过滤器语法引用 profile 中定义的属性。例如,在 application.yaml 文件中,你可以使用 @profiles.active@ 引用 properties 中的 profiles.active 属性;使用 @logging.level@ 引用 properties 中的 logging.level 属性。

    spring:
      profiles:
        active: @profiles.active@
    
    logging:
      level:
        me.pi.admin: @logging.level@
    
  6. 在 IDEA 的 Maven 项目窗口中,切换到 "Maven Projects" 视图。

  7. 展开项目的根节点,在 "Profiles" 下拉菜单中选择所需的环境(例如 devprod)。

  8. 在 IDEA 的工具栏中,点击 "Maven Projects" 窗口上的 "Reload All Maven Projects" 按钮,以刷新 Maven 项目并加载选定的 profile。

  9. 现在,你可以构建和运行项目,它将使用所选的环境配置。或者,你可以通过以下命令指定环境:

    $ mvn clean package -D maven.test.skip=true -P prod
    

Do not use @ for indentation 报错

当启动项目时可能出现如下错误:

org.yaml.snakeyaml.scanner.ScannerException: while scanning for the next token
found character '@' that cannot start any token. (Do not use @ for indentation)
 in 'reader', line 6, column 13:
        active: @profiles.active@
                ^

	at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:460)
	at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:251)
	at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingValue.produce(ParserImpl.java:660)
	at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:166)
	at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:59)
	at org.yaml.snakeyaml.comments.CommentEventsCollector$1.peek(CommentEventsCollector.java:45)
	at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:140)
	at org.yaml.snakeyaml.comments.CommentEventsCollector.collectEvents(CommentEventsCollector.java:119)
	at org.yaml.snakeyaml.composer.Composer.composeScalarNode(Composer.java:214)
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:184)
	at org.yaml.snakeyaml.composer.Composer.composeKeyNode(Composer.java:310)
	at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:301)
	at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:286)
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:188)
	at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:314)
	at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:305)
	at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:286)
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:188)
	at org.yaml.snakeyaml.composer.Composer.composeValueNode(Composer.java:314)
	at org.yaml.snakeyaml.composer.Composer.composeMappingChildren(Composer.java:305)
	at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:286)
	at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:188)
	at org.yaml.snakeyaml.composer.Composer.getNode(Composer.java:115)
	at org.yaml.snakeyaml.constructor.BaseConstructor.getData(BaseConstructor.java:135)
	at org.springframework.boot.env.OriginTrackedYamlLoader$OriginTrackingConstructor.getData(OriginTrackedYamlLoader.java:103)
	at org.yaml.snakeyaml.Yaml$1.next(Yaml.java:514)
	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:198)
	at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:166)
	at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:88)
	at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:54)
	at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:36)
	at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:108)
	at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:128)
	at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:86)
	at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:116)
	at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:240)
	at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:227)
	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102)
	at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94)
	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102)
	at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85)
	at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66)
	at java.util.ArrayList.forEach(ArrayList.java:1257)
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120)
	at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:343)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:301)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
	at me.pi.admin.AdminApplication.main(AdminApplication.java:32)

Process finished with exit code 1

这是由于环境未生效所致。

解决方法1:在 IDEA 的工具栏中,点击 "Maven Projects" 窗口上的 "Reload All Maven Projects" 按钮,以刷新 Maven 项目并加载选定的 profile。

我遇到的问题是每次打开项目或者更改了 profile 后都要点一下 Reload All Maven Projects,经过多次尝试,发现下面的方法可以解决每次都需要点刷新按钮的问题:

解决方法2:采用添加 BOM 的方式将 Spring Boot 引入项目中而不是通过继承父 pom 的方式:

<properties>
	<spring-boot.version>2.7.12</spring-boot.version>
</properties>
 <dependencyManagement>
     <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-dependencies</artifactId>
             <version>${spring-boot.version}</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
     </dependencies>
</dependencyManagement>

至于为何添加 BOM 的方式可行而继承父 pom 的方式不可行的原因欢迎讨论。

总结

使用多环境配置可以极大地简化在不同环境中部署和管理应用程序的过程。它使开发人员能够专注于特定环境的配置,从而提高开发效率并减少配置错误的可能性。此外,它还允许在不同环境中进行灵活的测试和部署,使得应用程序能够适应各种场景和需求。

标签:java,Spring,boot,Boot,springframework,Maven,yaml,Composer,org
From: https://www.cnblogs.com/zn-pi/p/17482971.html

相关文章

  • 15 Spring核心注释示例
    我们经常将这些称为“Spring核心注释”,我们将在本文中对它们进行审核。这是所有已知的Spring核心注释的列表。@Autowired我们可以使用  @Autowired 注释  来标记Spring将要解析和注入的依赖关系。我们可以将这个注释与构造函数,setter或字段注入一起使用。构造函数注入:@RestCon......
  • springboot 自定义listener 添加环境变量。 抄的springboot项目去掉了一些不用的ja
    1.自定义listener实现 ApplicationListener<ApplicationEnvironmentPreparedEvent>,Ordered(如果要设置优先级可以实现Ordered接口,注意order值越小优先级越高)publicclassMyListenerimplementsApplicationListener<ApplicationEnvironmentPreparedEvent>,Ordered{......
  • ajax请求springboot
    老是忘记ajax请求格式,记录一下吧后面看自己的functionsave(){varURL="/reconciliation/wzglWzMaterilApplicationDetail/saveSupplier";varcc=JSON.stringify({data:"world",p:{pag:0,pageS......
  • springboot项目启动失败之 org.springframework.boot.env.OriginTrackedYamlLoader.cr
    1、检查一下父项目的module的依赖是否,以及版本是否一致。例如<dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.30</version></dependency>2、如何知道自己的org.yaml的版本,可以双击Shift键,输入如图所示,注意划红线的地方就是......
  • springboot优点
    传统的Spring应用部署时,通常会将应用打成WAR包形式并部署到Tomcat、Jetty或Undertow服务器中。 SpringBoot框架内嵌了Tomcat、Jetty和Undertow服务器,于是可以将应用打包成jar,直接运行一个jar包就能启动一个web服务 是怎么内嵌的tomcat 这个依赖是SpringBootStar......
  • spring boot请求接口地址报404的几种情况
     1接口地址错误,这个不用解释了吧,就是地址搞错了2请求方法错误,如:get,你用了post3使用了springsecurity,没有开放这个接口,导致请求不到4在application.yml的配置文件里为servlet添加了context-path配置,如:server:port:8129servlet:context-path:/share这个......
  • 如何在Spring Boot中使用Hibernate Natural ID
    首先,让我们关注所需类的实现。完成所有这些后,我们将能够为具有自然ID的实体提供存储库。用自然ID编写实体让我们考虑以下具有自动生成ID和自然ID(code列)的实体。这只是一个使用一个自然ID的典型实体@NaturalId:@实体publicclassProductimplementsSerializable{priva......
  • 从 SpringApplication 认识 Spring 应用启动过程
    一、SpringApplication是什么?Spring应用的启动类。二、SpringApplication执行了什么?创建ApplicationContext实例ApplicationContext就是我们所说的容器实例。注册CommandLinePropertySourceCommandLinePropertySource的作用是将命令行参数输出为Spring属性。......
  • 解惑 spring 嵌套事务
    解惑spring嵌套事务/***@author王政*@date2006-11-24*/在所有使用spring的应用中,声明式事务管理可能是使用率最高的功能了,但是,从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义,让我们来看一下Trans......
  • 解析Spring内置作用域及其在实践中的应用
    摘要:本文详细解析了Spring的内置作用域,包括Singleton、Prototype、Request、Session、Application和WebSocket作用域,并通过实例讲解了它们在实际开发中的应用。本文分享自华为云社区《Spring高手之路4——深度解析Spring内置作用域及其在实践中的应用》,作者:砖业洋__。本文详细解析......