背景
最近在部门内部一直推广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进行部署之前 必须通过本地开发和测试???这个是谁提交的代码呢???定睛一看 居然是笔者本人提交的代码!!!!???
这个问题就很玄幻了!!!笔者对于编译和发布还是比较忠实的 从未出现过这种问题。
因此决定复查一下究竟是如何产生的。
- java.uti.Optional 是java8才提供的 而我们生产环境使用的是jdk7 因此不适合使用。因此我们使用guava的Optional来做替代
- 本人机器编译环境和生产相同因此均是jdk7
- 均在maven compile插件中制定了编译版本
- 该代码没有修改 但是进行了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毕竟是由运维团队搭建】
