jdeprscan throws无法找到类错误

时间:2018-03-28 03:14:38

标签: java java-9 jdeprscan

我在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中提到的每个其他类都会出现此错误。

您需要考虑的几点:

  • 类路径
  • 中提供的路径中有50个以上的jar
  • 我正在尝试扫描的jar位于类路径
  • 中提到的其中一个路径中
  • 我在JDK 9&amp ;;中尝试过jdeprscan。 JDK 10并得到相同的错误
  • 我尝试用 *。jar 替换类路径中的*,没有帮助!

我正在遵循的语法是否有任何错误,或者这是jdeprscan中的已知错误?

2 个答案:

答案 0 :(得分:0)

如果您碰巧在PATH中有一个包含类的JAR文件夹,则该文件夹将不起作用。您必须单独指定JAR(或摆脱类)。

答案 1 :(得分:0)

Windows下的JDK 11上的jdeprscsan的一些初步说明(我知道与CentOS上的JDK 9有关的问题,但也许以下情况也适用...):

  • 使用通配符“ path / to / lib / *。jar”(没有“ .jar”扩展名将不起作用)
  • 不支持具有多个路径的通配符(即--class-path dir1/;dir2/*.jar在通配符上引发解析异常)
  • --class-path指定的目录中的
  • JAR被添加到类路径并按字母顺序分析,这可能会引起一些error : cannot find class X消息,因为JAR a.jar可能取决于JAR {{ 1}}尚未加载。

基于上述发现,我找到了以下3个解决方案。请注意,我对Oracle JDK 12.0.2中的b.jar做了相同的实验,没有任何改进。

解决方案1:类路径上的所有类

  1. 将所有JAR解压缩到特定目录中(忽略已覆盖的文件,例如META-INF / maven / pom.xml),例如jdeprscan(请注意,在此阶段,mylibs目录仅包含由目录包组织的类,而没有JAR)。
  2. 运行以下命令:

mylib

优点:快速(非常手动操作)

缺点:仅分析在命令行(jdeprscan --for-removal --class-path /path/to/mylib /path/to/my-application.jar)上指定的JAR文件

解决方案2:类路径上的所有JAR +一个胖JAR

  1. 将所有JAR库复制到单个my-application.jar目录中
  2. mylib的JAR中提取所有文件(忽略重复的文件),然后将它们重新打包为大的JAR mylib(重命名为mylib/00lib.jar的简单ZIP文件可解决问题)
  3. 运行以下命令:

    .jar

优势:快速(仅需执行一些手动操作)+分析来自jdeprscan --for-removal --class-path path/to/mylib/*.jar path/to/my-application.jar

的JAR

缺点:某些mylib消息将与胖JAR jdeprscan相关,因此您将无法确定哪个库使用了已弃用或删除的类从Java 9或11开始。

解决方案3:在类路径上对JAR文件重新排序

  1. 将所有JAR库复制到单个00lib.jar目录中
  2. 运行以下命令:

    mylib

  3. 检查日志以查看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的手动副本)。