纯Java代码解析yml文件(多个yml)

如果您使用的是spring-boot作为项目主框架,那么你肯定知道yml是什么,一种方便阅读的配置文件

但是在运行main方法时,不想使用spring上下文, 只是纯解析yml文件,那么就引入了下文(本人业务需求是:在使用spark生成jar文件提交到集群时,想通过已经配置好的yml文件去读取相关参数,方便上下线时维护yml文件就足够了)

在没有yml时,代码中需要这样配置

        String esIpAddr = "192.168.53.92";
        String esPort = "9200";
        String esNodePort = "9300";
        String clusterName = "my-es-5";
        String index = "sparkresult";
        String type = "sparkresult";

        String mongodbUser = "xxx";
        String mongodbPass = "xxx";
        String mongodbIpAddr = "192.168.31.203";
        String mongodbPort = "27018";
        String mongodbDatabase = "sns";
        String mongodbCollectionIn = "igomoMemberInfo_Spark_input";
        String mongodbCollectionOut = "igomoMemberInfo_Spark_output";

因此,当配置文件移入yml时, application.yml是主配置文件,其中会有

spring:
  profiles:
    active: dev

的配置来制定application-dev.yml作为测试环境的yml文件。

 

为了方便演示 对应的配置文件如下

# application.yml 的配置如下

spring:
  dubbo:
    application:
      id: recommend-provider
    




#application-dev.yml 的配置如下
server:
  port: 8097
  dubbo:
    registry:
      protocol: zookeeper
    





#application-prod.yml 的配置如下
略

以下是具体的代码和演示,记得导入pom依赖包

        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>2.9.5</version>
        </dependency>


loadConfig方法

    public static void loadConfig() throws FileNotFoundException {
        //配置文件路径

        InputStream reader = XunMeiSpark.class.getResourceAsStream("/application.yml");

        //yml读取配置文件,指定返回类型为Map,Map中value类型为LinkedHashMap
        map = new Yaml().loadAs(reader, LinkedHashMap.class);

        if ("dev".equals(String.valueOf(map.get("spring").get("profiles").get("active")))) {

            InputStream readerDev = XunMeiSpark.class.getResourceAsStream("/application-dev.yml");
            mapOthers = new Yaml().loadAs(readerDev, LinkedHashMap.class);
        } else {
            InputStream readerProd = XunMeiSpark.class.getResourceAsStream("/application-prod.yml");
            mapOthers = new Yaml().loadAs(readerProd, LinkedHashMap.class);
        }
    }

 

getConfig方法和getValue方法
    public static String getConfig(String configKey) {

        String result = getValue(map, configKey);

        if (EmptyUtils.isEmpty(result)) {
            result = getValue(mapOthers, configKey);
        }

        return result;

    }

    public static String getValue(LinkedHashMap<String, ?> map, String configKey) {
        String result = "";
        String[] configKeys = configKey.split("\\.");

        LinkedHashMap<String, ?> linkedHashMap = map;
        for (String key : configKeys) {
            Object o = linkedHashMap.get(key);
            if (EmptyUtils.isNotEmpty(o) ) {
                if(o instanceof LinkedHashMap){
                    linkedHashMap = (LinkedHashMap<String, ?>) o;
                }else{
                    result = o.toString();
                }
            } else {
                continue;
            }
        }
        return result;
    }

 

main方法代码:

   //yml读取配置文件,指定返回类型为Map,Map中value类型为LinkedHashMap
static LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>>> map;
static LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>>> mapOthers;


 public static void main(String[] args) throws UnknownHostException, FileNotFoundException {
        //加载运行配置文件
        loadConfig();

        logger.info(getConfig("spring.dubbo.application.id"));
        logger.info(getConfig("server.port"));
        logger.info(getConfig("spring.dubbo.registry.protocol"));
}

 

 

运行main方法得到配置文件的内容

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章