当前位置:首页|资讯

Invalid classpath container: 'JUnit 4' in project ...

作者:风华旋舞发布时间:2024-09-09

0x00

今天一上班,打开Eclipse,发现工作区里很多项目都突然报错,选中项目看到的报错信息令人不解:

Invalid classpath container: 'JUnit 4' in project ...

进入项目属性检查后发现,报错的项目都是构建路径里添加了JUnit4库,或依赖的项目的构建路径里有JUnit4。

0x01

既然是JUnit 4库搞的鬼,那么思路无非就是删掉或者换版本。

经测试,从构建路径里删除JUnit 4库,或替换成JUnit 3或5都能去除报错。但是,需要我每个项目都去修改,这不是我想要的。

0x02

在搜索引擎的帮助下,很快锁定了一个Issue,提交日期是两周前,地址如下:

https://github.com/eclipse/xtext/issues/3178

在这个Issue中,提交人提到这个错误的出现原因是eclipse的plugins目录下出现了org.hamcrest包的两个版本,因为重复加载导致了问题。

我一看,果然有两个版本!这个错误原因可真Java哈。

Issue最后,有人提交了一个PR,用于解决这个问题:

https://github.com/eclipse-jdt/eclipse.jdt.ui/pull/1611

PR里的解决方案是,把hamcrest的3.0版本纳入版本依赖范围,而且只需要改几个字符串就行。

0x03

eclipse\plugins目录下找到org.eclipse.jdt.junit.core_3.13.200.v20240524-2038.jar,复制出来备份好以防万一。

根据PR里的文件路径,解压出第一个要修改文件JunitPreferenceInitializer.class。用任意十六进制编辑器打开,搜索字符串:http://hamcrest.org/JavaHamcrest/javadoc/1.3/

PR里对这个字符串有两个更改。首先把http改为了https,其次把结尾的1.3改为3.0。这里有个注意点,字符串前面的两个字节记录了字符串的长度,针对这个字符串,长度值为002D,即45,原字符串的长度确实是45个字符,因为修改这个字符串添加了一个s,因此需要把长度值对应的修改为002E,即46。

保存修改后,将文件替换回jar包。

同样的方式处理一下BuildPathSupport.class。

最后把修改过的jar包放回eclipse\plugins下,重启eclipse,项目上的报错顺利消失了,运行一个单元测试也正常。



Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1