您可以使用SnakeYAML库来解析和比较这两个YAML字符串。以下是使用Java 8代码实现的示例:

import org.yaml.snakeyaml.Yaml;

import java.util.LinkedHashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        String yaml1 = "deploy:\n" +
                "  url: 123456@.qq.com\n" +
                "  name: 123456\n" +
                "swagger:\n" +
                "  enabled: ${swaggerEnabled:false}";

        String yaml2 = "server:\n" +
                "  port: 50012\n" +
                "  tomcat:\n" +
                "    uri-encoding: UTF-8\n" +
                "  servlet:\n" +
                "    context-path: /api/ts-dc\n" +
                "spring:\n" +
                "  profiles:\n" +
                "    active:\n" +
                "      - ${profileName:prod}\n" +
                "  servlet:\n" +
                "    multipart:\n" +
                "      max-file-size: 100MB\n" +
                "      max-request-size: 100MB\n" +
                "  ######################################mysql基础数据库-需要修改链接 start################################################\n" +
                "  datasource:\n" +
                "    type: com.alibaba.druid.pool.DruidDataSource\n" +
                "    driver-class-name: com.mysql.jdbc.Driver\n" +
                "    url: jdbc:mysql://${mysqlIp:172.17.0.1}:${mysqlPort:3306}/ly_dc?characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai\n" +
                "    username: ${mysqlUsername:root}\n" +
                "    password: ${mysqlPassword:Ly37621040}\n" +
                "    druid:\n" +
                "      initial-size: 5\n" +
                "      min-idle: 5\n" +
                "      max-active: 20\n" +
                "      max-wait: 60000\n" +
                "      pool-prepared-statements: false\n" +
                "      max-pool-prepared-statement-per-connection-size: 20\n" +
                "      max-open-prepared-statements: 20\n" +
                "      validation-query: SELECT 'x' from dual\n" +
                "      validation-query-timeout: 30000\n" +
                "      test-on-borrow: true\n" +
                "      test-on-return: false\n" +
                "      test-while-idle: true\n" +
                "      time-between-eviction-runs-millis: 60000\n" +
                "      min-evictable-idle-time-millis: 300000\n" +
                "      max-evictable-idle-time-millis: 300000\n" +
                "      filters: stat,wall,log4j\n" +
                "      filter:\n" +
                "        wall:\n" +
                "          enabled: true\n" +
                "          config:\n" +
                "            comment-allow: true\n" +
                "            multi-statement-allow: true\n" +
                "      web-stat-filter:\n" +
                "        enabled: true  #是否启用StatFilter默认值true\n" +
                "        url-pattern: /druid/*\n" +
                "        #        exclusions: *.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*\n" +
                "        session-stat-enable: true\n" +
                "        session-stat-max-count: 10\n" +
                "        principal-session-name:\n" +
                "        principal-cookie-name:\n" +
                "        profile-enable: true\n" +
                "      stat-view-servlet:\n" +
                "        enabled: true #是否启用StatViewServlet默认值true\n" +
                "        url-pattern: /druid/*\n" +
                "        reset-enable: true\n" +
                "        login-username: admin\n" +
                "        login-password: Ly37621040\n" +
                "        allow:\n" +
                "        deny:\n" +
                "  ######################################mysql基础数据库-需要修改链接 end################################################\n" +
                "  ##########################################redis-需要修改链接 start ##############################################\n" +
                "  redis:\n" +
                "    database: 1           # Redis数据库索引(默认为0)\n" +
                "    host: ${redisIp:172.17.0.1}  # Redis服务器地址\n" +
                "    port: 16377            # Redis服务器连接端口\n" +
                "    password: 37621040     #Redis服务器连接密码(默认为空)\n" +
                "    timeout: 0            # 连接超时时间(毫秒)\n" +
                "    jedis:\n" +
                "      pool:\n" +
                "        max-idle: 8         # 连接池中的最大空闲连接\n" +
                "        min-idle: 1         # 连接池中的最小空闲连接\n" +
                "        max-active: 8       # 连接池最大连接数(使用负值表示没有限制)\n" +
                "        max-wait: -1        # 连接池最大阻塞等待时间(使用负值表示没有限制)\n" +
                "  ##########################################redis-需要修改链接 end ##############################################\n" +
                "  ##########################################rabbitmq-需要修改链接 start ##############################################\n" +
                "  rabbitmq:\n" +
                "    host: ${rabbitmqIp:172.17.0.1}\n" +
                "    port: 5672\n" +
                "    username: admin\n" +
                "    password: 37621040\n" +
                "  ##########################################rabbitmq-需要修改链接 end ##############################################\n" +
                "  flyway:\n" +
                "    enabled: true\n" +
                "    baseline-on-migrate: true\n" +
                "    clean-on-validation-error: true\n" +
                "    validate-on-migrate: false\n" +
                "    #目标版本\n" +
                "    #target:\n" +
                "    encoding: UTF-8\n" +
                "    # 迁移sql脚本文件存放路径,默认db/migration\n" +
                "    locations: classpath:db/migration\n" +
                "    # 迁移sql脚本文件名称的前缀,默认V\n" +
                "    sql-migration-prefix: V\n" +
                "    # 迁移sql脚本文件名称的分隔符,默认2个下划线__\n" +
                "    sql-migration-separator: __\n" +
                "    # 迁移sql脚本文件名称的后缀\n" +
                "    sql-migration-suffixes: .sql\n" +
                "  ##########################################quartz-需要修改链接(与基础库一样) start ##############################################\n" +
                "  quartz:\n" +
                "    properties:\n" +
                "      org:\n" +
                "        quartz:\n" +
                "          #quartz数据库连接(与基础库一样)\n" +
                "          dataSource:\n" +
                "            qzDS:\n" +
                "              URL: ${spring.datasource.url}\n" +
                "              driver: ${spring.datasource.driver-class-name}\n" +
                "              maxConnections: 10\n" +
                "              password: ${spring.datasource.password}\n" +
                "              user: ${spring.datasource.username}\n" +
                "          #quartzjob存储方式\n" +
                "          jobStore:\n" +
                "            #jdbc持久化\n" +
                "            class: org.quartz.impl.jdbcjobstore.JobStoreTX\n" +
                "            #数据源连接名\n" +
                "            dataSource: qzDS\n" +
                "            #驱动代表\n" +
                "            driverDelegateClass:  org.quartz.impl.jdbcjobstore.StdJDBCDelegate\n" +
                "            #触发器忍耐时间 超过5s则错过\n" +
                "            misfireThreshold: 5000\n" +
                "            #表前缀\n" +
                "            tablePrefix: LY_QRTZ_\n" +
                "            useProperties: false\n" +
                "          scheduler:\n" +
                "            instanceName: ly_ts_scheduler\n" +
                "          threadPool:\n" +
                "            class: org.quartz.simpl.SimpleThreadPool\n" +
                "            makeThreadsDaemons: true\n" +
                "            threadCount: 10\n" +
                "            threadPriority: 5\n" +
                "            threadsInheritContextClassLoaderOfInitializingThread: true
" +
                "##########################################quartz-需要修改链接(与基础库一样) end ##############################################
" +
                "##########################################liboffice-需要修改链接start ##############################################
" +
                "openoffice:\n" +
                "  host: ${libofficeIp:172.17.0.1}\n" +
                "  port: 8100\n" +
                "##########################################openoffice-需要修改链接end ##############################################
" +
                "##########################################elasticsearch-需要修改链接start ##############################################
" +
                "elasticsearch:\n" +
                "  host: ${elasticsearchIp:172.17.0.1}\n" +
                "  port: 9200\n" +
                "  username: elastic\n" +
                "  password: changeme\n" +
                "##########################################elasticsearch-需要修改链接start ##############################################
" +
                "#挂载文件路径\n" +
                "fileClientPath: data/dc\n" +
                "mybatis-plus:\n" +
                "  mapper-locations: classpath:/mapper/**/*Mapper.xml\n" +
                "  typeAliasesPackage: com.ly.cloud.**.po\n" +
                "  global-config:\n" +
                "    #驼峰下划线转换\n" +
                "    db-config:\n" +
                "      id-type: ID_WORKER\n" +
                "    banner: false\n" +
                "  configuration:\n" +
                "    map-underscore-to-camel-case: true\n" +
                "    cache-enabled: false\n" +
                "    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl\n" +
                "feign:\n" +
                "  hystrix:\n" +
                "    enabled: true\n" +
                "#队列名称\n" +
                "queueName: queue_1\n" +
                "#邮件发送参数\n" +
                "mail:\n" +
                "  smtp:\n" +
                "    host: smtp.qq.com\n" +
                "    port: 465\n" +
                "    auth: true\n" +
                "    ssl:\n" +
                "      enable: true\n" +
                "  debug: true\n" +
                "  transport:\n" +
                "    protocol: smtp\n" +
                "  #邮件发送者账号(如需更改请打开注释)\n" +
                "  #formMailUser: xxx@ly-sky.com\n" +
                "  #smtp客户端密码\n" +
                "  #smtpPassword: xxx\n" +
                "  #邮件发送者密码\n" +
                "  #formMailPassword: xxx\n" +
                "auth:\n" +
                "  captchaOnOff: false\n" +
                "  token:\n" +
                "    # 令牌自定义标识\n" +
                "    header: Authorization\n" +
                "    # 令牌密钥\n" +
                "    secret: abcdefghijklmnopqrstuvwxyz\n" +
                "    # 令牌有效期(默认30分钟)\n" +
                "    expireTime: ${expireTime:120}\n" +
                "swagger:\n" +
                "  # 是否开启swagger\n" +
                "  enabled: ${swaggerEnabled:false}\n" +
                "#联奕运维机器人\n" +
                "ding:\n" +
                "  #开发者后台->应用开发-企业内部应用->选择您的机器人->应用凭证->AppKey\n" +
                "  app-key: dingpmhdlmis9n1eudpq\n" +
                "  #开发者后台->应用开发-企业内部应用->选择您的机器人->应用凭证->AppSecret\n" +
                "  app-secret: W3N8pOHvwcdC6NBtKUs00dQEJFumaijLFDBysiAQoEJ76d7VCz_XGWZvxIEWSp9p\n" +
                "  #群聊->机器人头像->机器人设置(有权限,不一定都能看到)->Webhook\n" +
                "  webhook: https://oapi.dingtalk.com/robot/send?access_token=5e5b46416e86a36c3c82ec21ead12df820273316f332aa366928044d29d23ed4";

        Yaml yaml = new Yaml();
        Map<String, Object> map1 = yaml.load(yaml1);
        Map<String, Object> map2 = yaml.load(yaml2);

        // 遍历 map1,将每个键值对添加到 map2 中,如果 map2 中已经存在该键,则覆盖
        map1.forEach((key, value) -> map2.put(key, value));

        // 将 map2 转换成 YAML 字符串
        String mergedYaml = yaml.dump(map2);
        System.out.println(mergedYaml);
    }
}

注意:

  • 确保您已经将 SnakeYAML 库添加到您的项目中。
  • 以上代码示例中,yaml1yaml2 是两个 YAML 字符串,您可以根据实际情况进行修改。
  • 代码中使用 LinkedHashMap 来保留键值对的顺序。
  • 最后,您可以使用 yaml.dump(map2) 将合并后的 map2 转换为 YAML 字符串并打印输出。

希望以上信息对您有所帮助。

Yaml 字符串比较和合并 - Java 8 代码示例

原文地址: http://www.cveoy.top/t/topic/qeIw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录