其实那只是jar包正在被应用导致的,怎样化解一些maven带来的冲突问题

在平时支付中,当社团内有人将新的代码打成jar文件提交,并且未改名的时候,可能会产出这么的谬误“error:
unable to unlink old ‘Test/lib/xxx-1.0.0.jar’ (Invalid argument)”  
 。咋一看很纳闷,说是不能废除旧的链接,还认为是jar包内部的转移导致龃龉,其实那只是jar包正在被利用导致的,解决办法就是将运行的代码停止后在重复git
pull一下就足以了。

初稿出处: 等你归去来

maven是一个很好的品类管理工具,你可以轻松的定义一个引用,从而达到使用别人写好的库的作用。且maven可以轻松地和jenkins合营,从而使打包布署变得更便于。

但是也因为这么,我们变得更傻瓜了,以致于有时候都忘了一部分原本的基本功的办法了,当然那不是本文的目标,本文的意在,如何化解一部分maven带来的争执问题。

问题1: jenkins 打包失利了,导致我不可以安装代码到测试环境,如何是好?

答:
一般大家都会基于jenkins做一些二次开发,以适应公司里面的须要,或者优化一些修改化的事物。
然而出于jenkins本身照旧相比较复杂的,有时候难免我们搞不清楚其规律,从而造成有的无法打包的题材。
当然,我那边遇见的题目一般都是由于jenkins的缓存机制导致的问题,所以,在我本地可以打包的代码,放到jenkins上就死活打不了包,因为自身体贴的一个jar包,由于被jenkins缓存了一个老版本的包,里面没有自己新的东西从而导致打包失败,看起来长期内不能化解这几个缓存问题。

于是乎,我经过本地ide工具打好war包后,上传到服务器的tomcat目录,等待tomcat自动布署形成后就足以重新开动新代码了,从而绕过了jenkins失利的题材了。

本着jar包,则越来越方便,间接本地生成jar包,然后替换服务器上的相应包,重启服务即可。

简单的说,那里的缓解方案就是,当工具出了问题的时候,我们就不可能再依靠工具了,回到原来状态解决问题。

问题2:
当大家运行了代码(war/jar)后,报某个方法未找到,即:java.lang.NoSuchMethodError:,
仔细查阅代码,其实是有该措施的,怎么着排查?

答:
针对该问题,一般意况下都是出于引入了两个相同效果的jar包,且包路径完全一致,而在类加载器加载时,可能会加载到您不想要加载的类,从而造成没有该措施。

解决办法就是,删除不是和谐的引用,从而达到使用自己打算的类。maven中即表现为清除某个信赖,如:

<dependency>
            <groupId>com.xx.activity</groupId>
            <artifactId>abc</artifactId>
            <version>2.0.13-SNAPSHOT</version>
            <classifier>dubbo</classifier>
            <exclusions>
                <exclusion>
                    <groupId>com.meidusa.venus</groupId>
                    <artifactId>venus-backend</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

可是,还有个问题,那就是哪些才能找到是引用了哪位包,才致使的冲突吧?因为您从当地代码来看,没有一点极度。

大家得以直接搜索整个包的引用,并肢解其中的代码,查看是争持的类(抵触方法比较难找出来),当然是直接在服务器上进行查找了。

find . -name '*.jar' -exec jar -tvf {} \; | grep EE   # 即找出所有的jar包,再解压出其文件列表,再搜索冲突的类名

假如有察觉四个一样的结果,那么就是争持了,解决该抵触即可。

当然,如若引入的jar文件不多,或者您有中央趋向怀疑是哪位包冲突了,那么,直接将该包下载下来,用反编译工具(如jd-gui)编译出来,查看其内部景况,便一目精晓。

题材3:
发现tomcat启动卓殊快,而且许多加载流程都未曾,就一贯开行了,实际上各类应有的劳动都不存在,那怎么排查?

答: 那种题材比较没有头绪,解决起来也基本靠运气。
那里tomcat看起来正常启动了,但是实际上很多业务都没做,没加载。从另一个角度来说,就是加载中断了。最麻烦的是日记中一点信息都不会付出。一般可以先从代码的变更处先导排查,以一段一段的代码还原情势为重大排查手段。

个中有一很要紧的问题不怕,你引用了一个jdk版本比你自己的周转条件高的jar包,依据jvm的加载原理,其会先检查class文件的版本号,假诺过量自己所能加载的本子,那么,它就间接拒绝加载了,而并不会检讨该class文件是还是不是引用了有的不认得的表征。倘使jvm不加载类了,那么你继续流程就不可以进展了。

一旦的确是因为jar包版本导致的题材,那么,问题就好解决了。 1.
如故叫给你提供jar包的同学将其包装的jdk版本降到你须要的本子就足以了。 2.
升任自己的jvm运行环境,升级jdk, 当然那几个风险可能会有,小心行事。

上述,就是一点点问题排查心得,聊以慰藉。也指望对有像样的题材的同窗指喜宝(Beingmate)个方向。

相见题目标时候咱们往往是这么,一个问题,可能几天下来也不必然能化解,然而到确实化解了的时候,发现实际很简短。然后,也许下两回,又持续!

相关文章