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一起使用。这应该被视为一种解决方法(它是不完整的工具文档还是错误,我不知道......)。