jenkins编译之Optional小坑

背景

最近在部门内部一直推广Guava https://my.oschina.net/qixiaobo025/blog?search=guava

其中对于可空对象建议各位使用Optional封装。

问题

最近发现了奇怪的问题

[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /data/jenkins/workspace/f6-local-test-erp/biz-service-impl/src/main/java/com/air/tqb/service/base/impl/ServiceCategoryServiceImpl.java:[83,8] 错误: 对Optional的引用不明确
[ERROR]   java.util 中的类 java.util.Optional 和 com.google.common.base 中的类 com.google.common.base.Optional 都匹配
/data/jenkins/workspace/f6-local-test-erp/biz-service-impl/src/main/java/com/air/tqb/service/base/impl/ServiceCategoryServiceImpl.java:[114,8] 错误: 对Optional的引用不明确
[ERROR]   java.util 中的类 java.util.Optional 和 com.google.common.base 中的类 com.google.common.base.Optional 都匹配
/data/jenkins/workspace/f6-local-test-erp/biz-service-impl/src/main/java/com/air/tqb/service/base/impl/ServiceCategoryServiceImpl.java:[122,8] 错误: 对Optional的引用不明确
[INFO] 3 errors

分析

我们在对于开发要求在上jenkins进行部署之前 必须通过本地开发和测试???这个是谁提交的代码呢???定睛一看 居然是笔者本人提交的代码!!!!???

这个问题就很玄幻了!!!笔者对于编译和发布还是比较忠实的 从未出现过这种问题。

因此决定复查一下究竟是如何产生的。

  1. java.uti.Optional 是java8才提供的 而我们生产环境使用的是jdk7 因此不适合使用。因此我们使用guava的Optional来做替代
  2. 本人机器编译环境和生产相同因此均是jdk7
  3. 均在maven compile插件中制定了编译版本
  4. 该代码没有修改 但是进行了format【针对import】
     

问题很明确了 由于jenkins上jdk版本为jdk8【才能解释包含了java.util.Optional】

而我们本地机器通常安装jdk7 因此不包含java.util.Optional

而我们之前代码中import如下

import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import models.constants.Constants;
import models.model.Pstation;
import models.model.TcustomProjectNew;
import models.rmi.WxFactoryRmiService;
import models.vo.query.TcustomProjectNewQuery;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import javax.annotation.Nullable;
import java.util.*;

由于代码发生了变化 idea贴心的做了合并 变成了如下

import com.google.common.base.*;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import models.constants.Constants;
import models.model.Pstation;
import models.model.TcustomProjectNew;
import models.rmi.WxFactoryRmiService;
import models.vo.query.TcustomProjectNewQuery;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import javax.annotation.Nullable;
import java.util.*;

这样由于本地使用jdk7 因此不会将Optional识别出错。

而到了jenkins编译缺变成了二义性选择【毕竟都是用*引入 无法判断使用哪一个。而之前是显示的引入com.google.common.base.Optional 因此无二义】

修改方案

彩蛋

通常我们对于import不太重视 毕竟合并完成之后idea编译一遍自然全部引入了。

idea也提供了自动导入非二义性import 但是对于不同jdk版本碰到此类问题还是要注意!!!【jenkins毕竟是由运维团队搭建】

猜你喜欢

转载自my.oschina.net/qixiaobo025/blog/1817654