我在CentOS系统上尝试jdeprscan
。以下是我正在执行的命令:
export classpath=<PATH/*>:<ANOTHER/PATH/*>:<SOME/OTHER/PATH/*>
jdeprscan --for-removal --verbose --class-path $classpath --release 9 <ANOTHER/PATH>/MyProject.jar
尽管提供了类路径,但我遇到了多种类型的错误
Processing class <some/class/in/MyProject.jar>...
error: cannot find class <some/class/in/a/different/jar>
error: cannot resolve Methodref <some/class/in/a/different/jar>.<method>:()Ljava/lang/String;
我已经验证错误消息中提到的类几乎是类路径中提供的其中一个jar。 奇怪的是,我正在扫描的jar中提到的每个其他类都会出现此错误。
您需要考虑的几点:
我正在遵循的语法是否有任何错误,或者这是jdeprscan中的已知错误?
答案 0 :(得分:0)
如果您碰巧在PATH中有一个包含和类的JAR文件夹,则该文件夹将不起作用。您必须单独指定JAR(或摆脱类)。
答案 1 :(得分:0)
Windows下的JDK 11上的jdeprscsan
的一些初步说明(我知道与CentOS上的JDK 9有关的问题,但也许以下情况也适用...):
--class-path dir1/;dir2/*.jar
在通配符上引发解析异常)--class-path
指定的目录中的error : cannot find class X
消息,因为JAR a.jar
可能取决于JAR {{ 1}}尚未加载。基于上述发现,我找到了以下3个解决方案。请注意,我对Oracle JDK 12.0.2中的b.jar
做了相同的实验,没有任何改进。
jdeprscan
(请注意,在此阶段,mylibs目录仅包含由目录包组织的类,而没有JAR)。 mylib
优点:快速(非常手动操作)
缺点:仅分析在命令行(jdeprscan --for-removal --class-path /path/to/mylib /path/to/my-application.jar
)上指定的JAR文件
my-application.jar
目录中mylib
的JAR中提取所有文件(忽略重复的文件),然后将它们重新打包为大的JAR mylib
(重命名为mylib/00lib.jar
的简单ZIP文件可解决问题)运行以下命令:
.jar
优势:快速(仅需执行一些手动操作)+分析来自jdeprscan --for-removal --class-path path/to/mylib/*.jar path/to/my-application.jar
缺点:某些mylib
消息将与胖JAR jdeprscan
相关,因此您将无法确定哪个库使用了已弃用或删除的类从Java 9或11开始。
00lib.jar
目录中运行以下命令:
mylib
检查日志以查看jdeprscan --for-removal --class-path path/to/mylib/*.jar path/to/my-application.jar
消息,因为lib目录中存在JAR,因此不应提出这些消息。对于每个此类库,请复制一个库名称,该名称应位于按字母顺序引用该库名称的库名称之前。例如,我在lib目录error: cannot find class
中有一个JAR,它依赖于alpha.jar
(尚未加载到类路径中),因此我将commons-lang-3.0.jar
复制到commons-lang-3.0.jar
它将在a0commons-lang-3.0.jar
之前加载。重要的是复制JAR而不要重命名它,否则alpha.jar
可能不会对其进行分析(并非在每个JAR上都发生)。完成后,请返回第2步,直到没有库依赖项产生的错误消息出现为止。
优点:清晰地显示哪些JAR使用了不推荐使用/已删除的类。
缺点:需要很多时间(导致类加载问题的每个JAR的手动副本)。