吐槽背景:
前阵子领导要求一应服务上Docker,其中包含一个连接Hadoop集群,认证kerberos后通过将SQL传给Inceptor(hive)查数据这么一个功能。
老项目部署条件是:Tomcat7 + 行内框架(类似SSM) + JDK1.7.0_79 + Linux
新环境是把 Tomcat7 升级到 Tomcat8,JDK升级到 Open1.8,加Docker;
本来是想就相当于把部署的东西平移到docker上,换汤不换药,稀松平常就好,结果因为 Driver 驱动包引发了一个血案!
InceptorDriver 驱动包里有大量的非依赖方式引入的包,导致 mvn dependency 根本查不出是哪里有冲突,而tomcat8 又会因为环境问题导致加载类顺序不同使项目在这边好,到了服务器上就不行的问题,然后一报错就是sun.sec…某个类或方法找不到。
最开始通过调整 tomcat8 的 Context.xml 的 preresource 来优先加载有冲突的jar,但是行里投产tomcat这种介质是一致的还不许改,就算硬改,当容器重启时,从新拉介质又完蛋。。。
最终还是一个同事因为他连接的hbase 没有引用InceptorDriver 只引用了Hadoop-client(厂商提供的,auth、common等集合体)我突然想到了 InceptorDriver 里面可能有与Hadoop-Auth重合的部分。因为在调整tomcat8的Context.xml时,将hadoop-auth这个jar优先加载可以回避这个问题,然后我将 InceptorDriver 解压一看,果然如我所料,手动将 InceptorDriv