Windows 下 Oracle JDK 11 的一些初步说明jdeprscsan(我知道与 CentOS 上的 JDK 9 相关的问题,但也许以下也适用......):
- 使用通配符“path/to/lib/*.jar”(如果没有“.jar”扩展名,它将无法工作)
- 不支持具有多个路径的通配符(即
--class-path dir1/;dir2/*.jar在通配符上引发解析异常)
- 指定目录中的 JAR
--class-path被添加到类路径并按字母顺序分析,这可能会导致一些error : cannot find class X消息,因为 JARa.jar可能依赖于b.jar尚未加载的 JAR。
基于以上,我找到了以下3个解决方案。请注意,我jdeprscan从 Oracle JDK 12.0.2 进行了相同的实验,没有任何改进。
解决方案1:类路径上的所有类
- 解压缩特定目录中的所有 JAR(忽略 META-INF/maven/pom.xml 等被覆盖的文件),例如
mylib(请注意,在此阶段,mylibs 目录仅包含由目录包组织的类,没有 JAR)。
- 运行以下命令:
jdeprscan --for-removal --class-path /path/to/mylib /path/to/my-application.jar
优点:速度快(非常手动操作)
缺点:只分析已经在命令行(my-application.jar)指定的JAR文件
解决方案 2:所有 JAR + 类路径上的胖 JAR
- 将所有 JAR 库复制到一个
mylib目录中
- 从(忽略重复文件)的 JAR 中提取所有文件
mylib并将它们重新打包到一个大 JARmylib/00lib.jar中(一个简单的 ZIP 文件重命名为.jar诀窍)
- 复制
mylib/00lib.jar以mylib/01lib.jar确保对其进行分析
运行以下命令:
jdeprscan --for-removal --verbose --class-path path/to/mylib/*.jar path/to/my-application.jar
优点:快速(只需少量手动操作)+ 分析来自mylib
缺点:一些jdeprscan消息将与胖 JAR 相关,00lib.jar因此您将无法立即确定哪个库使用了已弃用或从 Java 9 或 11 中删除的类,但您可以通过查看类名间接地做到这一点,例如(com.atomikos库中的一个类需要缺少的类javax.jms.JMSException):
Processing class com/atomikos/datasource/xa/jms/JmsTransactionalResource...
error: cannot find class javax/jms/JMSException
解决方案 3:对类路径中的 JAR 文件重新排序
- 将所有 JAR 库复制到一个
mylib目录中
运行以下命令:
jdeprscan --for-removal --class-path path/to/mylib/*.jar path/to/my-application.jar
检查日志以查看error: cannot find class不应引发的消息,因为 JAR 存在于 lib 目录中。对于每个这样的库,复制一个名称在按字母顺序引用它的库名称之前的库。例如,我在 lib 目录中有一个 JAR,alpha.jar它依赖于commons-lang-3.0.jar(尚未加载到类路径中),所以我复制commons-lang-3.0.jar到a0commons-lang-3.0.jar它以便在alpha.jar. 复制 JAR 并且不要重命名它很重要,否则它可能不会被分析jdeprscan(不会出现在每个 JAR 上)。完成后,返回第 2 步,直到没有出现库依赖项产生的错误消息。
优点:清楚地显示哪些 JAR 使用了已弃用/已删除的类。
缺点:需要很多时间(每个 JAR 的手动副本会导致类加载问题)。
结论
我jdeprscan与解决方案 2一起使用。这应该被视为一种解决方法(它是不完整的工具文档还是错误,我不知道......)。