jenkins编译之Optional小坑


声明:本文转载自https://my.oschina.net/qixiaobo025/blog/1817654,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

背景

最近在部门内部一直推广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毕竟是由运维团队搭建】

 

 

 

本文发表于2018年05月24日 00:00
(c)注:本文转载自https://my.oschina.net/qixiaobo025/blog/1817654,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2242 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1