java .yml文件取值问题

spring-boot-starter-actuator 的info取值时,需要配置info信息

application.yml配置如下:

#自定义info端点查看应用相关的信息
info:
  encoding: "@project.build.sourceEncoding@"
  traget: "@java.version@"
  name:   "@project.artifactId@"
  description: "@project.description@"

直接运行,发现@@变量没有正确解析,需要在pom.xml中作配置调整

    <build>
        <plugins>
           <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <delimiters>
                        <delimiter>@</delimiter>
                    </delimiters>
                    <useDefaultDelimiters>false</useDefaultDelimiters>
                </configuration>
           </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

参考资料:https://blog.verysu.com/article/391

 

<think>好的,我现在需要帮用户解决在YAML配置文件中定义一个属性,用来区分不同的服务启动方式。用户提到有cmd黑窗口启动(bat文件)、Windows服务模式启动和.sh脚本启动这三种方式。用户希望根据不同的启动方式,在配置文件中设置一个属性,方便在代码中识别当前是通过哪种方式启动的。 首先,我得确定用户的具体需求是什么。他们可能希望在应用程序中根据不同的启动方式执行不同的逻辑,比如日志记录、路径配置或者功能开关。这时候,定义一个配置项来标识启动方式是有必要的。 接下来,我需要考虑如何在YAML配置文件中定义这个属性。用户之前提到使用application.properties,但这次他们明确要求使用YAML,所以应该用application.yml的结构。YAML的层次结构更适合复杂配置,可读性也更好。 然后,用户提到了三种启动方式:bat文件、Windows服务和.sh脚本。可能的属性值可以分别命名为CMD、WINDOWS_SERVICE和SHELL。这样在代码中可以通过枚举或字符串比较来判断当前启动方式。 我需要设计一个配置类来绑定这个属性。使用Spring Boot的@ConfigurationProperties注解,并指定前缀。同时,需要确保配置类被正确扫描,可能需要用到@Component或者通过@EnableConfigurationProperties启用。 另外,用户可能没有考虑到不同环境下的配置管理。比如,不同的启动方式可能对应不同的环境(开发、测试、生产),或者需要动态切换配置。这时候,可能需要结合Profiles来管理不同的配置,但用户当前的问题主要是定义一个静态属性,所以暂时不需要处理动态切换。 还需要考虑属性的默认值。如果用户没有在配置文件中指定启动方式,是否需要一个默认值?或者是否强制要求必须配置?根据用户描述,他们需要显式定义,所以可能不需要默认值,但最好在配置类中处理可能的空值情况。 然后,用户可能会在代码中根据这个属性值执行不同的逻辑。比如,在启动时检查启动方式,并初始化相应的组件或配置。这时候,可以通过@Autowired注入配置类,然后读属性值。 最后,需要验证配置是否正确绑定。用户可能需要编写测试用例或者简单的日志输出来确认配置值被正确读。如果配置未生效,可能需要检查配置类的路径、注解是否正确,或者配置文件的位置是否正确。 总结步骤: 1.application.yml中定义启动方式属性,如launch.mode。 2. 创建配置类,使用@ConfigurationProperties绑定属性。 3. 在代码中注入配置类,根据launch.mode的值执行相应逻辑。 4. 处理可能的错误情况,如未配置或配置值错误。 需要确保用户理解YAML的语法,正确缩进,属性名的层次结构。同时,提醒用户如果在不同启动脚本中需要设置不同的配置值,可能需要通过环境变量或启动参数来动态指定launch.mode,而不是硬编码在配置文件中。比如,在bat或sh脚本中设置-Dlaunch.mode=CMD,这样可以在不同启动方式下覆盖配置文件中的默认值,提高灵活性。</think>--- ### **解决方案** 在 `application.yml` 中定义一个标识服务启动方式的属性(例如 `launch.mode`),通过不同的值区分启动场景(CMD黑窗口、Windows服务、.sh脚本)。以下是具体实现步骤: --- ### **一、YAML 配置定义** 在 `application.yml` 中添加如下配置: ```yaml # 定义启动模式标识 launch: mode: CMD # 可选值: CMD | WINDOWS_SERVICE | SHELL ``` #### **参数说明** - `CMD`: 表示通过 `.bat` 或命令行黑窗口启动 - `WINDOWS_SERVICE`: 表示通过 Windows 服务启动 - `SHELL`: 表示通过 `.sh` 脚本启动(适用于 Linux 环境) --- ### **二、关联配置类** #### **步骤1:创建配置类** 定义一个 `LaunchConfig` 类绑定配置: ```java @Configuration @ConfigurationProperties(prefix = "launch") // 绑定前缀为"launch" public class LaunchConfig { private String mode; // 对应配置中的mode字段 // Getter & Setter public String getMode() { return mode; } public void setMode(String mode) { this.mode = mode; } } ``` #### **步骤2:启用配置类** 确保 Spring Boot 能扫描到配置类,可通过以下方式: - 添加 `@ComponentScan` 到主启动类 - 或在主启动类添加 `@EnableConfigurationProperties(LaunchConfig.class)` --- ### **三、代码中使用配置** 在需要区分启动模式的代码逻辑中注入 `LaunchConfig`: ```java @Autowired private LaunchConfig launchConfig; public void checkLaunchMode() { switch (launchConfig.getMode().toUpperCase()) { case "CMD": System.out.println("通过CMD黑窗口启动"); break; case "WINDOWS_SERVICE": System.out.println("通过Windows服务启动"); break; case "SHELL": System.out.println("通过.sh脚本启动"); break; default: System.out.println("未知启动模式"); } } ``` --- ### **四、进阶用法** #### **1. 结合环境变量动态覆盖** 在启动脚本中通过 `-D` 参数动态指定 `launch.mode`,优先级高于配置文件: - **Windows CMD**: ```bat java -Dlaunch.mode=CMD -jar your-app.jar ``` - **Linux Shell**: ```bash java -Dlaunch.mode=SHELL -jar your-app.jar ``` #### **2. 使用枚举增强安全性** 优化配置类,限定 `mode` 字段的取值: ```java public enum LaunchMode { CMD, WINDOWS_SERVICE, SHELL } @Configuration @ConfigurationProperties(prefix = "launch") public class LaunchConfig { private LaunchMode mode; // 使用枚举类型 // Getter & Setter public LaunchMode getMode() { return mode; } public void setMode(LaunchMode mode) { this.mode = mode; } } ``` 此时 `application.yml` 需填写枚举名称: ```yaml launch: mode: CMD # 必须与枚举值完全匹配(大小写敏感) ``` --- ### **五、配置校验** 在 `pom.xml` 中确保依赖了配置校验库: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> ``` 添加校验注解,防止非法值: ```java @Configuration @ConfigurationProperties(prefix = "launch") @Validated // 启用校验 public class LaunchConfig { @NotNull(message = "启动模式不能为空") private LaunchMode mode; // Getter & Setter } ``` --- ### **六、完整示例** #### **application.yml** ```yaml launch: mode: SHELL # 根据实际场景修改 ``` #### **启动脚本(.sh)** ```bash #!/bin/bash java -Dlaunch.mode=SHELL -jar your-app.jar ``` #### **控制台输出** ```text 通过.sh脚本启动 ``` --- ### **总结** ```text 1. 定义属性 launch.mode 标识启动方式 2. 创建配置类绑定属性值 3. 通过代码逻辑分支处理不同启动模式 4. 结合环境变量或脚本动态指定模式 ``` 通过这种方式,可以清晰地区分不同启动场景并执行针对性逻辑(如路径初始化、日志配置等)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值