Java项目无法加载最新的class

12月 22nd, 2015 2,080 留下评论 阅读评论

问题

一个Java项目,无论怎么替换jar包Jar1,运行中某个类A无法加载到最新的class,一直以替换前的旧版本运行导致报错;而Jar1中新加入的类B可以被正确执行,每次替换jar包都能加载到B最新的class。

背景

此Java项目依赖于2个目录加载多个jar包,bin目录和lib目录(bin优先于lib,因为在classpath中靠前),正常情况下bin目录中有1个jar包,lib目录中有很多jar包,此次替换的jar包Jar1位于lib目录。

原因

通过打印类A的class的加载路径找到答案

class.getProtectionDomain().getCodeSource().getLocation()

上一次替换Jar1时,将更新的Jar1误多传入到bin目录下一份,当然lib目录下也替换了。启动,没有问题,此时系统加载的是bin下的Jar1。

这次再替换Jar1时,就因为优先加载了bin目录下的old-Jar1,覆盖了lib目录下的new-Jar1,导致类A新的class无法被加载,而类B因为是新加入的类,却可以被加载到。

解决

删除bin目录下的old-Jar1包即可

Categories: Java 标签:
  1. 1月 18th, 2016 19:26

    大神做个友链好吗