java yaml配置处理,yaml格式化,yaml节点增加,删除。多yaml合并

2023-11-19

       多环境配置文件管理,增加一个配置属性,多套环境配置文件需同时增加,如果忘记了,那么就报错。对多环境配置文件进行管理,使用yaml作为文件时,就涉及到yaml的一些解析,修改,新增操作。

1. 环境依赖

       首先需要依赖snakeyaml,这里使用的是1.23版本

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.23</version>
</dependency>

2. snakeyaml方法简单介绍

加载yaml对象:
       < T > T - loadAs(String,Class) :加载yaml对象,返回Class对象
       < T > Object - load(String):加载yaml对象,返回object对象
       iterable < object > - loadAll(String):加载yaml对象,返回迭代器
对象转为字符:
       String dump(object):object转化为字符串对象(只转化最外层yaml节点)
       String dumpAsMap(Map):Map对象转化为字符串对象

 String content = "nacos:\n" +
                "  dg: 889990\n" +
                "  addd: 444\n" +
                "  ggggg:\n" +
                "    aaaa: ''\n" +
                "spring:\n" +
                "  redis:\n" +
                "    path: 3344\n" +
                "ooo:\n" +
                "  pp: ''\n";
                
        Yaml yaml = new Yaml();
        Map map = yaml.loadAs(content, Map.class);
        System.out.println(map);
        
        Object load = yaml.load(content);
        System.out.println(load);
        
        Iterable<Object> objects = yaml.loadAll(content);
        for (Iterator<Object> it = objects.iterator(); it.hasNext();){
            Map<String,Object> object = (Map<String, Object>) it.next();
            System.out.println(object);
        }

        String dump = yaml.dump(map);
        System.out.println(dump);
        
        String s = yaml.dumpAsMap(map);
        System.out.println(s);

3. yaml处理思路

       snakeyaml解析获取到的Map集合是嵌套集合,{redis={host=6379,url=xxx}},这样的结构去做配置信息的变更比对是不方便的。
       因此先将此数据类型,转化为非嵌套Map集合,即{redis.host=6379,redis.url=xxx}的数据格式(Spring @value注解取值时,也是这种数据结构,IOC容器加载时,对配置文件进行解析,也是解析成这种格式)。
       解析为以上格式之后,再去对新旧配置进行节点的新增,删除判断就容易多了,提取以上Map集合的Key值放入List集合中,使用List集合的差集方法,即可得到新旧配置的差异对象。
       得到差异对象后,再将List对象使用Map容器承装(Map嵌套容器),将变更对象与原嵌套对象进行合并,再转化为yaml字符串,之后该输出到文件输出到文件,该存储就存储。

4. yaml字符串转非嵌套Map对象

输出结果:{nacos.ggggg.aaaa=, nacos.dg=889990, spring.redis.path=3344, ooo.pp=, nacos.addd=444}


private static final Map<String,String> cacheYamlMap = new HashMap<>();

public static void main(String[] args) {
    String content = "nacos:\n" +
            "  dg: 889990\n" +
            "  addd: 444\n" +
            "  ggggg:\n" +
            "    aaaa: ''\n" +
            "spring:\n" +
            "  redis:\n" +
            "    path: 3344\n" +
            "ooo:\n" +
            "  pp: ''\n";

    Yaml yaml = new Yaml();
    Iterable<Object> oldYaml = yaml.loadAll(content);
    analyzeYamlToList(oldYaml);
    System.out.println(cacheYamlMap);
}


public static void analyzeYamlToList(Iterable<Object> newYaml){
    for (Iterator<Object> it = newYaml.iterator(); it.hasNext();){
        Map<String,Object> object = (Map<String, Object>) it.next();
        parseYamlToMap(object,null);
    }
}

public static void parseYamlToMap(Map<String, Object> item, String key){
    item.forEach((k,v) -> {
        if(Objects.isNull(v))
            if (key == null)
                cacheYamlMap.put(k, "");
            else
                cacheYamlMap.put(key.concat(".").concat(k), "");
        else if (v instanceof LinkedHashMap)
            if (key == null)
                parseYamlToMap((Map<String, Object>) v,k);
            else
                parseYamlToMap((Map<String, Object>) v,key.concat(".").concat(k));
        else
        if (key == null)
            cacheYamlMap.put(k, v.toString());
        else
            cacheYamlMap.put(key.concat(".").concat(k), v.toString());
    });
}

5. List对象转嵌套yaml对象

输出结果:{redis={host={name=}, aaa={bbb=}}, nacos={server={name=}}}

 public static void main(String[] args) {
	 List<String> yaml = new ArrayList<>();
	   yaml.add("redis.host.name");
	   yaml.add("redis.aaa.bbb");
	   yaml.add("redis.aaa.bbb.ccc");
	   yaml.add("nacos.server.name");
	
	   Object map = transListToLinkMap(yaml);
	   System.out.println(map);
	}
	
	public static Object transListToLinkMap(List<String> yamlKey){
	   Map<String,Object> linkMap = new LinkedHashMap();
	   for (String val: yamlKey ) {
	       Map<String,Object> map = (Map<String, Object>) transStringToLinkMap(val);
	       addYamlMap(linkMap,map);
	   }
	
	   return linkMap;
	}
	
	private static Object transStringToLinkMap(String val){
	   int i = val.indexOf(".");
	   if(i < 0){
	       Map<String,Object> map = new LinkedHashMap<>();
	       map.put(val,"");
	       return map;
	   }
	
	   String key = val.substring(0, i);
	   String value = val.substring(i + 1);
	   Map<String ,Object> linkedHashMap = (Map<String, Object>) transStringToLinkMap(value);
	
	   Map<String,Object> map = new LinkedHashMap<>();
	   map.put(key,linkedHashMap);
	   return map;
	}
	
	public static void addYamlMap(Map<String, Object> originMap, Map<String, Object> addMap){
	   for (Map.Entry<String,Object> val : addMap.entrySet()) {
	       boolean common = false;
	       for (Map.Entry<String,Object> obj : originMap.entrySet()) {
	           if (val.getKey().equals(obj.getKey())){
	               common = true;
	               try {
	                   Map<String,Object> objVal = (Map<String,Object>) obj.getValue();
	                   Map<String,Object> addVal = (Map<String,Object>) val.getValue();
	                   addYamlMap(objVal,addVal);
	               }catch (Exception e){
	                   break;
	               }
	               break;
	           }
	       }
	       if(!common){
	           originMap.put(val.getKey(),val.getValue());
	       }
	   }
	}

6. 新旧yaml对比,yaml新增,删除属性

       懒得一个个demo贴了,下面贴出我写的yamlUtil类,需要什么功能自由组合。
       以下yaml属性新增的时候,默认值是""空字符串,未设默认值,需要默认值自行修改。


private static final Map<String,String> cacheYamlMap = new HashMap<>();

public enum ConstantEnum{
    ADD("add"),

    REMOVE("remove");

    private String code;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    ConstantEnum(String code){
        this.code = code;
    }

	public static ConstantEnum getInstance(String code){
    	for (ConstantEnum constantEnum: values()) {
            if(constantEnum.getCode().equals(code)){
                return constantEnum;
            }
        }
        return null;
    }
}

public static void main(String[] args) {
    //加两个attr节点下属性,删addd属性
    String oldContent = "nacos:\n" +
            "  dg: 889990\n" +
            "  addd: 444\n" +
            "spring:\n" +
            "  redis:\n" +
            "    path: 3344\n";
    String newContent = "nacos:\n" +
            "  dg: 889990\n" +
            "spring:\n" +
            "  redis:\n" +
            "    path: 3344\n" +
            "    attr:\n" +
            "      name: 3333\n" +
            "      value: 4444";

    Yaml yaml = new Yaml();
    List<String> addAttr = YamlParserUtil.compareAndGetDiffAttr(oldContent, newContent, YamlParserUtil.ConstantEnum.ADD);
    List<String> removeAttr = YamlParserUtil.compareAndGetDiffAttr(oldContent, newContent, YamlParserUtil.ConstantEnum.REMOVE);
    Map<String,Object> addMap = (Map<String, Object>) YamlParserUtil.transListToLinkMap(addAttr);
    Map<String,Object> removeMap = (Map<String, Object>) YamlParserUtil.transListToLinkMap(removeAttr);

    Map originMap = yaml.loadAs(oldContent, Map.class);
    YamlParserUtil.addAndRemoveYaml(originMap,removeMap,addMap);
    String dump = yaml.dumpAsMap(originMap);
    System.out.println(dump);
}

/**
 * trans key list to map
 * demo: spring.redis.host to {spring={redis={host=}}}
 * @param yamlKey
 * @return
 */
public static Object transListToLinkMap(List<String> yamlKey){
    Map<String,Object> linkMap = new LinkedHashMap();
    for (String val: yamlKey ) {
        Map<String,Object> map = (Map<String, Object>) transStringToLinkMap(val);
        addYamlMap(linkMap,map);
    }

    return linkMap;
}

public static void addAndRemoveYaml(Map<String,Object> originMap,Map<String,Object> removeMap,Map<String,Object> addMap){
    removeYamlMap(originMap,removeMap);
    addYamlMap(originMap,addMap);
}

public static boolean removeYamlMap(Map<String, Object> originMap, Map<String, Object> removeMap){
    for (Map.Entry<String,Object> val : removeMap.entrySet()) {
        for (Map.Entry<String,Object> obj :originMap.entrySet()) {
            if(val.getKey().equals(obj.getKey())){
                try {
                    Map<String,Object> objVal = (Map<String,Object>) obj.getValue();
                    Map<String,Object> addVal = (Map<String,Object>) val.getValue();
                    if(removeYamlMap(objVal,addVal)){
                        originMap.remove(val.getKey());
                        break;
                    }
                }catch (Exception e){
                    originMap.remove(val.getKey());
                    break;
                }
            }
        }
    }
    if(originMap==null || originMap.isEmpty()){
        return true;
    }
    return false;
}

/**
 * {spring={redis={host=}}} | {spring={rabbit={host=}}} merge to {spring={redis={host=},rabbit={host=}}}
 *
 * Combine the addMap collection, do not allow the same key value to be overwritten
 * @param originMap
 * @param addMap
 */
public static void addYamlMap(Map<String, Object> originMap, Map<String, Object> addMap){
    for (Map.Entry<String,Object> val : addMap.entrySet()) {
        boolean common = false;
        for (Map.Entry<String,Object> obj : originMap.entrySet()) {
            if (val.getKey().equals(obj.getKey())){
                common = true;
                try {
                    Map<String,Object> objVal = (Map<String,Object>) obj.getValue();
                    Map<String,Object> addVal = (Map<String,Object>) val.getValue();
                    addYamlMap(objVal,addVal);
                }catch (Exception e){
                    break;
                }
                break;
            }
        }
        if(!common){
            originMap.put(val.getKey(),val.getValue());
        }
    }
}

/**
 * spring.redis.host to {spring={redis={host=}}}
 *
 * trans string to map,Parse the yaml string
 * @param val
 * @return
 */
private static Object transStringToLinkMap(String val){
    int i = val.indexOf(".");
    if(i < 0){
        Map<String,Object> map = new LinkedHashMap<>();
        map.put(val,"");
        return map;
    }

    String key = val.substring(0, i);
    String value = val.substring(i + 1);
    Map<String ,Object> linkedHashMap = (Map<String, Object>) transStringToLinkMap(value);

    Map<String,Object> map = new LinkedHashMap<>();
    map.put(key,linkedHashMap);
    return map;
}

/**
 *
 * compare yaml content get diff key list
 * @param oldContent
 * @param newContent
 * @return
 */
public static List<String> compareAndGetDiffAttr(String oldContent, String newContent,ConstantEnum type){
    Yaml yaml = new Yaml();
    Iterable<Object> oldYaml = yaml.loadAll(oldContent);
    List<String> oldKey = analyzeYamlToList(oldYaml);

    Iterable<Object> newYaml = yaml.loadAll(newContent);
    List<String> recent = analyzeYamlToList(newYaml);

    if(ConstantEnum.ADD.equals(type)){
        List<String> compareList = new ArrayList<>(recent);
        compareList.removeAll(oldKey);
        return compareList;
    }else{
        List<String> compareList = new ArrayList<>(oldKey);
        compareList.removeAll(recent);
        return compareList;
    }
}

public static List<String> analyzeYamlToList(Iterable<Object> newYaml){
    for (Iterator<Object> it = newYaml.iterator(); it.hasNext();){
        Map<String,Object> object = (Map<String, Object>) it.next();
        parseYamlToMap(object,null);
    }

    List<String> keyList = new ArrayList<>();
    cacheYamlMap.forEach((key,val)->{ keyList.add(key); });

    cacheYamlMap.clear();
    return keyList;
}

/**
 *  {spring={redis={host=},rabbit={host=}}} to {spring.redis.host= ,spring.rabbit.host=}
 *
 * trans yaml map to key map
 * @param item
 * @param key
 */
public static void parseYamlToMap(Map<String, Object> item, String key){
    item.forEach((k,v) -> {
        if(Objects.isNull(v))
            if (key == null)
                cacheYamlMap.put(k, "");
            else
                cacheYamlMap.put(key.concat(".").concat(k), "");
        else if (v instanceof LinkedHashMap)
            if (key == null)
                parseYamlToMap((Map<String, Object>) v,k);
            else
                parseYamlToMap((Map<String, Object>) v,key.concat(".").concat(k));
        else
        if (key == null)
            cacheYamlMap.put(k, v.toString());
        else
            cacheYamlMap.put(key.concat(".").concat(k), v.toString());
    });
}

7.新增属性属性值不为空

不同的业务需求,面向的yaml对象不一样,要的效果不一样,下面的代码对比标题6,做了一些变动,以及注释,各位看官可在次基础上自由发挥。(6的升级版本)


    private static final Map<String,String> cacheYamlMap = new HashMap<>();

    public enum ConstantEnum{
        ADD("add"),

        REMOVE("remove");

        private String code;

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }

        ConstantEnum(String code){
            this.code = code;
        }

        public static ConstantEnum getInstance(String code){
            for (ConstantEnum constantEnum: values()) {
                if(constantEnum.getCode().equals(code)){
                    return constantEnum;
                }
            }
            return null;
        }
    }

    public static void main(String[] args) {
        //加两个attr节点下属性,删addd属性
        String oldContent = "nacos:\n" +
                "  dg: 889990\n" +
                "  addd: 444\n" +
                "spring:\n" +
                "  redis:\n" +
                "    path: 3344\n";
        String newContent = "nacos:\n" +
                "  dg: 889333333990\n" +
                "spring:\n" +
                "  redis:\n" +
                "    path: 3344\n" +
                "    attr:\n" +
                "      name: 3333\n" +
                "      value: 4444";

        Yaml yaml = new Yaml();
        //以就模板为基准模板,对比新模板,筛选出新增的属性
        List<Map<String, String>> addAttr = compareAndGetDiffAttr(oldContent, newContent, ConstantEnum.ADD);
        //以旧模板为基准模板,对比新模板,筛选删除属性
        List<String> removeAttr = compareAndGetDiffAttr(oldContent, newContent, ConstantEnum.REMOVE);

        //将筛选出的属性集合,转化为linkMap格式
        Map<String,Object> addMap = (Map<String, Object>) transMapListToLinkMap(addAttr);
        Map<String,Object> removeMap = (Map<String, Object>) transListToLinkMap(removeAttr);

        //以旧模板值为标准值,除了增加的属性值,其他均为旧模板值
        Map originMap = yaml.loadAs(oldContent, Map.class);
        //对旧模板进行新增,删除属性操作
        addAndRemoveYaml(originMap,removeMap,addMap);
        String dump = yaml.dumpAsMap(originMap);
        System.out.println(dump);
    }

    /**
     * trans key list to map
     * demo: spring.redis.host to {spring={redis={host=}}}
     * @param yamlKey
     * @return
     */
    public static Object transListToLinkMap(List<String> yamlKey){
        Map<String,Object> linkMap = new LinkedHashMap();
        for (String val: yamlKey ) {
            Map<String,Object> map = (Map<String, Object>) transStringToLinkMap(val,null);
            addYamlMap(linkMap,map);
        }

        return linkMap;
    }

    public static Object transMapListToLinkMap(List<Map<String, String>> yamlKey){
        Map<String,Object> linkMap = new LinkedHashMap();
        for (Map<String, String> val: yamlKey ) {
            for (Map.Entry<String,String> value :val.entrySet()) {
                Map<String,Object> map = (Map<String, Object>) transStringToLinkMap(value.getKey(),value.getValue());
                addYamlMap(linkMap,map);
            }
        }

        return linkMap;
    }

    public static void addAndRemoveYaml(Map<String,Object> originMap,Map<String,Object> removeMap,Map<String,Object> addMap){
        removeYamlMap(originMap,removeMap);
        addYamlMap(originMap,addMap);
    }

    public static boolean removeYamlMap(Map<String, Object> originMap, Map<String, Object> removeMap){
        for (Map.Entry<String,Object> val : removeMap.entrySet()) {
            for (Map.Entry<String,Object> obj :originMap.entrySet()) {
                if(val.getKey().equals(obj.getKey())){
                    try {
                        Map<String,Object> objVal = (Map<String,Object>) obj.getValue();
                        Map<String,Object> addVal = (Map<String,Object>) val.getValue();
                        if(removeYamlMap(objVal,addVal)){
                            originMap.remove(val.getKey());
                            break;
                        }
                    }catch (Exception e){
                        originMap.remove(val.getKey());
                        break;
                    }
                }
            }
        }
        if(originMap==null || originMap.isEmpty()){
            return true;
        }
        return false;
    }

    /**
     * {spring={redis={host=}}} | {spring={rabbit={host=}}} merge to {spring={redis={host=},rabbit={host=}}}
     *
     * Combine the addMap collection, do not allow the same key value to be overwritten
     * @param originMap
     * @param addMap
     */
    public static void addYamlMap(Map<String, Object> originMap, Map<String, Object> addMap){
        //遍历新旧两个嵌套集合,将值,属性进行合并
        for (Map.Entry<String,Object> val : addMap.entrySet()) {
            boolean common = false;
            for (Map.Entry<String,Object> obj : originMap.entrySet()) {
                if (val.getKey().equals(obj.getKey())){
                    common = true;
                    try {
                        Map<String,Object> objVal = (Map<String,Object>) obj.getValue();
                        Map<String,Object> addVal = (Map<String,Object>) val.getValue();
                        addYamlMap(objVal,addVal);
                    }catch (Exception e){
                        break;
                    }
                    break;
                }
            }
            if(!common){
                originMap.put(val.getKey(),val.getValue());
            }
        }
    }

    /**
     * spring.redis.host to {spring={redis={host=}}}
     *
     * trans string to map,Parse the yaml string
     * @param val
     * @return
     */
    private static Object transStringToLinkMap(String yamlKey,String val){
        int i = yamlKey.indexOf(".");
        if(i < 0){
            Map<String,Object> map = new LinkedHashMap<>();
            map.put(yamlKey,val);
            return map;
        }

        String key = yamlKey.substring(0, i);
        String value = yamlKey.substring(i + 1);
        Map<String ,Object> linkedHashMap = (Map<String, Object>) transStringToLinkMap(value,val);

        Map<String,Object> map = new LinkedHashMap<>();
        map.put(key,linkedHashMap);
        return map;
    }

    /**
     *
     * compare yaml content get diff key list
     * @param oldContent
     * @param newContent
     * @return
     */
    public static List compareAndGetDiffAttr(String oldContent, String newContent,ConstantEnum type){
        Yaml yaml = new Yaml();
        //获取旧模板的key集合
        Iterable<Object> oldYaml = yaml.loadAll(oldContent);
        List<String> oldKey = analyzeYamlToList(oldYaml);

        Iterable<Object> newYaml = yaml.loadAll(newContent);

        //新增比较特殊,需要保留原值,
        if(ConstantEnum.ADD.equals(type)){
            //获取新模板的Key value集合
            List<Map<String, String>> list = analyzeYamlToListMap(newYaml);
            Iterator<Map<String, String>> iterator = list.iterator();

            //遍历,与旧模板进行对比,删除掉相同key的元素,留下的就是新增的
            while (iterator.hasNext()){
                //以新模板为基准对比
                for (Map.Entry<String,String> value :iterator.next().entrySet()) {
                    for (String key :oldKey) {
                        if(key.equals(value.getKey())){
                            iterator.remove();
                            break;
                        }
                    }
                }
            }

            return list;
        }else{
            //旧模板与新模板进行取差集,得到旧模板与新模板的差异属性,即需要删除的属性
            List<String> recent = analyzeYamlToList(newYaml);
            //以旧模板为基准
            List<String> compareList = new ArrayList<>(oldKey);
            compareList.removeAll(recent);
            return compareList;
        }
    }

    public static List<String> analyzeYamlToList(Iterable<Object> newYaml){
        //将yaml遍历器中的嵌套集合转化为单个KEY VALUE对应的Map集合,存放至静态变量
        for (Iterator<Object> it = newYaml.iterator(); it.hasNext();){
            Map<String,Object> object = (Map<String, Object>) it.next();
            parseYamlToMap(object,null);
        }

        //将上一个步骤存放的集Map集合提取成List集合,提取单个Key值
        List<String> keyList = new ArrayList<>();
        cacheYamlMap.forEach((key,val)->{ keyList.add(key); });

        cacheYamlMap.clear();
        return keyList;
    }

    public static List<Map<String,String>> analyzeYamlToListMap(Iterable<Object> newYaml){
        //将yaml遍历器中的嵌套集合转化为单个KEY VALUE对应的Map集合,存放至静态变量
        for (Iterator<Object> it = newYaml.iterator(); it.hasNext();){
            Map<String,Object> object = (Map<String, Object>) it.next();
            parseYamlToMap(object,null);
        }
        //将上一个步骤存放的集Map集合提取成List集合,并且拆分为单个Map,放入集合(便于后续便利)
        List<Map<String,String>> keyList = new ArrayList<>();
        cacheYamlMap.forEach((key,val)->{
            Map<String,String> map = new HashMap<>();
            map.put(key,val);
            keyList.add(map);
        });

        cacheYamlMap.clear();
        return keyList;
    }
    /**
     *  {spring={redis={host=},rabbit={host=}}} to {spring.redis.host= ,spring.rabbit.host=}
     *
     * trans yaml map to key map
     * @param item
     * @param key
     */
    public static void parseYamlToMap(Map<String, Object> item, String key){
        //将嵌套Map集合,转化为单个Key value对应的属性集合
        item.forEach((k,v) -> {
            if(Objects.isNull(v))
                if (key == null)
                    cacheYamlMap.put(k, "");
                else
                    cacheYamlMap.put(key.concat(".").concat(k), v.toString());
            else if (v instanceof LinkedHashMap)
                if (key == null)
                    parseYamlToMap((Map<String, Object>) v,k);
                else
                    parseYamlToMap((Map<String, Object>) v,key.concat(".").concat(k));
            else
            if (key == null)
                cacheYamlMap.put(k, v.toString());
            else
                cacheYamlMap.put(key.concat(".").concat(k), v.toString());
        });
    }


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java yaml配置处理,yaml格式化,yaml节点增加,删除。多yaml合并 的相关文章

随机推荐

  • RabbitMQ(四):RabbitMQ高级特性

    消息队列在使用过程中 面临着很多实际问题需要思考 消息可靠性问题 如何确保发送的消息至少被消费 次 延迟消息问题 如何实现消息的延迟投递 消息堆积问题 如何解决数百万消息堆积 无法及时消费的问题 高可用问题 如何避免单点的MQ故障而导致的不
  • MATLAB ARMA时间序列分析引导——理解与应用

    MATLAB ARMA时间序列分析引导 理解与应用 引言 时间序列分析是一种重要的数据分析方法 广泛应用于金融 经济 自然科学等领域 ARMA模型是时间序列分析中常用的模型之一 它可以帮助我们预测未来的数值趋势和特征 以便做出相应的决策 本
  • 百度Apollo7.0轨迹规划模块

    百度Apollo 7 0 轨迹规划模块是一种用于自动驾驶汽车的软件工具 其中包含了一组算法和工具 用于在道路上规划车辆的路线和轨迹 这个模块能够考虑车辆的动态特性 如转弯半径 最大转弯角度和最大加速度等 并能够在实时环境中规划车辆的路线 此
  • 记一次关于uni的公共样式使用遇到的坑

    今天在使用uniapp开发小程序时遇到一个问题 在app vue中引入公共样式 在其他界面中使用 直接运行到小程序模拟器上时 是可以正常使用的 但是如果分包放到小程序上公共样式就会失效 在网上找了半天也没找到问题所在 后边瞎写的的时候偶然解
  • OpenStack rdo一键allinone部署

    目录 1 环境准备 2 配置阿里yum源 3 安装openstack 4 安装packstack软件包 5 执行一键部署命令 6 遇到一些问题 7 登录OpenStack 1 环境准备 CentOS7 最小化安装 设置静态IP 编辑 vi
  • 关于求职及面试的一些小技巧

    关于面试的一些小窍门 内容仅代表我个人观点 欢迎批评指正 之前已经分享过怎么样做一份看起来还算不错的简历了 老司机的分享 写简历的过程中 都有哪些坑 点开即可查看 1 关于面试时机 对相当一部分的部门需求者而言 如果求职者不是绝对的让部门需
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • “大三在读生”都四面成功拿到字节跳动Offer了,你还有什么理由去摸鱼?

    博主大三在读 投的是字节 Data 的后端开发实习生 base 杭州 时间线 4 12 投递 4 13 安排简历筛选 4 14 安排面试 4 19 16 00 一面 4 22 16 00 二面 4 23 8 00 三面 4 23 16 00
  • 在WINDOW 系统下如何用批处理命令生成代码

    如图要实现一个每次编译都会自动重新生成的代码 一般是 软件版本相关的代码最适合这种自动生成 上图中需在用到编译时间和日期 来直接上代码 BEGIN COLOR 07 cls echo off ECHO ECHO 自动生成软件版本号 ECHO
  • Discuz 如何设置SSL类型的SMTP邮箱

    由于国际与国内均对垃圾邮件进行严格管控 我国 互联网信息服务管理办法 中国互联网协会反垃圾邮件规范 均对垃圾邮件进行说明与管理规范 鉴于服务器25端口被大量垃圾邮件充斥 严重影响广大用户正常使用 很多服务器不再提供25端口邮件服务 包括进站
  • QNX系统的ftp调试,连接FTP调试-QNX的PC104调试ftp

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额1元起步 多少随意 锋影 e mail 174176320 qq com 板子上QNX系统ftp的调试 双网卡 IP分别为 192 192 1 10 192 192
  • Qt编程学习笔记

    新建项目 gt 其他项目 gt Empty qmake Project 添加新文件 项目 gt run gt Run in terminal 发现cin gt gt a无法向a输入数据 检查 pro文件发现缺少参数CONFIG consol
  • chrome黑暗模式设置

    1 前言 使用Chrome有很久了 但一直没发现有令人满意的黑暗模式 期间试过通过在谷歌商店中安装黑暗主题 但感觉不好 主要有以下 除了chrome的界面是黑暗模式外 打开其它的页面还是亮模式 我希望黑暗模式支持以下特性 chrome的标签
  • Android ViewPager实现导航页效果

    效果 源码地址 文章翻译自 https www cnblogs com aademeng articles 6238933 html 代码 MainActivity public class MainActivity extends App
  • mysql APPARENT DEADLOCK!!! Complete Status:Managed Threads: 3 (c3p0,druid)

    问题场景 由于在生产环境出现问题 应用挂掉 作为菜鸟运维 解决问题有点忙手忙脚 线上bug修复 重启tomcat 启动报错 错误截图在下面 根据日志分析像是死锁 使用C3P0连接池 tomcat启动完之后 还能正常运行 解决问题经过 网上有
  • v4l2在帧缓冲区预览摄像头

    在应用层通过v4l2 api将采集的摄像头数据yuv转为rgb后写到帧缓冲区达到预览摄像头的目的 程序运行后切换到tty下就可以看到 我的屏幕是bgra格式的 这点要注意 不同屏幕格式不同 不同r g b的偏移通过修改 0x00 lt lt
  • Activiti定时器事件

    定时器事件用于在特定的日期 时间或者周期触发一个事件 它们可以用做开始事件 中间事件 边界事件 边界事件可以是中断的 也可以是非中断的 默认是中断事件 即当触发定时器时 原执行实例会被删除 开始事件定时器 定时器开始事件用于在指定的时间点或
  • 专利检索工具网站分享

    当今有很多专利检索工具可供使用 以下是一些常用的专利检索工具网站 全球专利数据库 https patentscope wipo int search zh search jsf 中国专利数据库 http www pss system gov
  • 爬虫从入门到放弃——开源爬虫框架

    本文参考自知乎 供本人学习使用 作者 老夏 链接 https www zhihu com question 27042168 answer 70821088 目前主流的网络爬虫框架包括但不限于 Nutch Crawler4j WebMagi
  • java yaml配置处理,yaml格式化,yaml节点增加,删除。多yaml合并

    多环境配置文件管理 增加一个配置属性 多套环境配置文件需同时增加 如果忘记了 那么就报错 对多环境配置文件进行管理 使用yaml作为文件时 就涉及到yaml的一些解析 修改 新增操作 java管理yaml 1 环境依赖 2 snakeyam