maven处理重复依赖不同版本的方式
前言大家在处理maven依赖时,肯定都有遇到过包冲突的问题,其中最常见的就是在多级依赖时,会同时引入一个jar包的不同版本,导致在运行时出现NoSuchMethodError的错误,那么大家肯定会好奇对于这些情况maven是怎么去选择版本的呢?其中网上挺多文章已经都解密了它的处理方式,我这里先把这些方式抛出来,然后一个个的去验证它们。当一个项目中出现重复的依赖包时,maven 2.0.9之后的版本会用如下的规则来决定使用哪一个版本的包:
1231.最短路径原则:多级依赖不同路径2.声明优先原则:多级依赖相同路径3.同级依赖后加载覆盖先加载:直接同级依赖
分析与验证准备:创建一个验证工程已经多个验证模块,并根据校验场景来引入依赖关系,其中作为验证对象的testD构建两个不同版本(1.0和2.0)的jar
最短路径原则分析对于服务A直接依赖了服务B和E,其中B和E都直接或间接的引用了D的两个版本1.0和2.0,此时根据最短路径原则,A最终引用的应该是D的2.0版本
验证
通过对A执行mvn dependency:tree 命令来分析A的依赖树(进入A模块pom.xml文件所在路径 ...
java基础随笔11.27-12.02
Java中更换Map中的键key的名称在项目中,经常会遇到需要调整查询结果map中key的值,以便后面逻辑的执行,我们可以采用以下方式来实现
1map.put("newKey", map.remove("oldKey"));
上述语句可以实现将map中的oldKey变更为newKey,同时,根据上述语句也不难看出:map.remove("key")的返回值为key对应的value
此外,如果查询结果为一个map的list,可以循环替换
1234list.forEach(map -> { map.put("newKey1", map.remove("oldKey1")); map.put("newKey2", map.remove("oldKey2"));});
String与Date的转换DateFormatString转Date
12345678DateFormat format1 = new SimpleD ...
Mybatis的QueryWrapper
eq、ne
eq:等于。wrapper.eq("name", "hanser");
ne:不等于。wrapper.ne("name", "hanser");
gt、ge、lt、le
gt:大于。wrapper.gt("age", 27);
ge:大于等于。wrapper.ge("age", 27);
lt:小于。wrapper.lt("age", 27);
le:小于等于。wrapper.le("age", 27);
between、notBetween
between:在值1和值2之间。wrapper.between("age", 10, 20);
notBetween:不在值1和值2之间。wrapper.notBetween("age", 10, 20);
需要注意的是,between的含义包含边界值,而notBetween不包含边界值,也就是说上述例子的含义为,
找到年龄大于 ...
数据库随笔11.20-11.26
oracle数据库判断某表是否存在查询所有表1select count(*) from user_tables where table_name =upper('表名')
这个是查询当前登录用户中的所有表中是否存在该表。注意表名区分大小写,如果参数不限制,那这里就必须要加上upper函数 。
查询指定用户下是否有某个表1234SELECT COUNT(*) FROM ALL_TABLES WHERE OWNER = UPPER('user1') AND TABLE_NAME = UPPER('表名')
这个是查询 user1 这个用户下的表中是否存在该表。比如你登录的是user2 这个用户,在它的查询面板上执行上边的sql,就可以查询user 这个用户下是否存在某表。
sql查询时添加一列为固定值12//sql查询添加一列固定值SELECT 表字段1,表字段2,表字段3,'内容' AS extendStr FROM 表名称
mysql查询每个部门的员工个数内连接查询首先最直观的思路就是两张表联表查询,如下
...
UNION / UNION ALL
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
123456789-- 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。 --SELECT column_name(s) FROM table_name1UNIONSELECT column_name(s) FROM table_name2-- 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。 --SELECT column_name(s) FROM table_name1UNION ALLSELECT column_name(s) FROM table_name2
另外,UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名。如下面的方法查询结果的字段名为id和name
12345SELECT ID id,NAME nameFROM table1UNIONSELEC ...
JDK1.8新特性 Stream
传统集合的遍历几乎所有的集合(如Collection接口或Map接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历,如:
123456789101112public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("159"); list.add("111"); list.add("373"); list.add("10"); list.add("101"); list.add("564"); for (String s : list) { System.out.println(s); }}
循环遍历的弊端:
Java 8的Lambda让我们可以更加专注于做什么(What), ...
平台public包方法
从配置文件取值:ConfigConfig类用于获取config.properties和该文件import的配置文件的值,构造方法如下所示:
123456789101112private Config() { // 加载config.properties配置文件 this.loadProperties("/config.properties"); String importproperties = ConvertUtil.convertToString(properties.getProperty("import.propertiesfile")); // 加载config配置文件引入的配置文件 if (!importproperties.isEmpty()) { String[] arrays = importproperties.split(";"); for (String temp : arrays) { this.loadProperties(temp); } ...
Optional
简介从 Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。
本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。我们从一个简单的用例开始。在 Java 8 之前,任何访问对象方法或属性的调用都可能导致 NullPointerException:
1String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();
在上述示例中,如果我们需要确保不触发异常,就得在访问每一个值之前对其进行明确地检查:
123456789101112if (user != null) { Address address = user.getAddress(); if (address ...
平台service包方法
TapControllerinsert与TapService内方法一样,也有插入前、插入后的处理逻辑。具体逻辑如下:
12345678910111213141516171819@Override@PostMapping(value = "/insert")public ResponseResult<Object> insert(@RequestBody(required = false) Map<String, Object> paraMap) { try { Map<String, Object> dataMap = paraMap; // 插入前执行逻辑 beforeInsert(dataMap, paraMap); Class<T> entityClass = this.entityClass; TapEntity entity = entityClass.newInstance(); entity.convertF ...
平台server包方法
BasicServicesetDispFields设置字段显示值。效果为把某个字段的code转化成name、把状态的-1/1转化成无效/有效等等。具体逻辑大致如下所示:
1234567891011public void setDispFields(Map<String, Object> mapRow, DatacodeCache datacodeCache) { String temp; if (mapRow.get(TmbMsgPushTaskEntity.FieldRegister) != null) { temp = ConvertUtil.convertToString(mapRow.get(TmbMsgPushTaskEntity.FieldRegister)); mapRow.put("disp" + TmbMsgPushTaskEntity.FieldRegister, this.getNameFromSysCode(temp)); } if (mapRow. ...