Java jdeprscan抛出找不到类错误

Java jdeprscan抛出找不到类错误,java,java-9,jdeprscan,Java,Java 9,Jdeprscan,我正在CentOS系统上尝试jdepscan。以下是我正在执行的命令: export classpath=<PATH/*>:<ANOTHER/PATH/*>:<SOME/OTHER/PATH/*> jdeprscan --for-removal --verbose --class-path $classpath --release 9 <ANOTHER/PATH>/MyProject.jar 导出类路径=:: jdeprscan——删除——详细—

我正在CentOS系统上尝试
jdepscan
。以下是我正在执行的命令:

export classpath=<PATH/*>:<ANOTHER/PATH/*>:<SOME/OTHER/PATH/*>
jdeprscan --for-removal --verbose --class-path $classpath --release 9 <ANOTHER/PATH>/MyProject.jar
导出类路径=:: jdeprscan——删除——详细——类路径$classpath——版本9/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;
处理类。。。
错误:找不到类
错误:无法解析Methodref.:()Ljava/lang/String;
我已经验证了错误消息中提到的类几乎是类路径中提供的JAR之一。 奇怪的是,我扫描的jar中引用的每一个类都不会出现这个错误

请考虑以下几点:

  • 类路径中提供的路径中有50多个jar
  • 我试图扫描的jar位于类路径中提到的路径之一
  • 我尝试了JDK 9和JDK 10中提供的jdeprscan,得到了相同的错误
  • 我试着用*.jar替换类路径中的*无效

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

如果路径中碰巧有一个文件夹包含类JAR,它将无法工作。您必须单独指定JAR(或去掉类)。

有关Windows下Oracle JDK 11的
jdepscsan
的一些初步说明(我知道与CentOS上的JDK 9相关的问题,但可能以下内容也适用于…)

  • 使用通配符“path/to/lib/*.jar”(如果没有“.jar”扩展名,它将无法工作)
  • 不支持具有多个路径的通配符(即,
    --类路径dir1/;dir2/*.jar
    对通配符引发解析异常)
  • --class path
    指定的目录中的JAR被添加到类路径中并按字母顺序进行分析,这可能会导致一些
    错误:找不到class X
    消息,因为JAR
    a.JAR
    可能依赖于尚未加载的JAR
    b.JAR
基于以上,我找到了以下3种解决方案。注意,我对来自Oracle JDK 12.0.2的
jdepscan
做了相同的实验,但没有任何改进

解决方案1:类路径上的所有类
  • 解压特定目录中的所有JAR(忽略被覆盖的文件,如META-INF/maven/pom.xml),例如
    mylib
    (注意,在此阶段,mylibs目录只包含由目录包组织的类,而不包含JAR)
  • 运行以下命令:
  • jdepscan——删除——类path/path/to/mylib/path/to/my application.jar

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

    缺点:仅分析命令行上指定的JAR文件(
    my application.JAR

    解决方案2:类路径上的所有JAR+一个胖JAR
  • 将所有JARs库复制到一个
    mylib
    目录中
  • mylib
    的JAR中提取所有文件(忽略重复的文件),并将它们重新打包到一个大JAR
    mylib/00lib.JAR
    (一个简单的ZIP文件重命名为
    .JAR
    就可以了)
  • mylib/00lib.jar
    复制到
    mylib/01lib.jar
    以确保对其进行分析
  • 运行以下命令:

    jdepscan--for-remove--verbose--class-path-path/to/mylib/*.jar-path/to/my-application.jar

  • Advantage:快速(仅需少量手动操作)+分析
    mylib

    缺点:一些
    jdepscan
    消息将与fat JAR
    00lib.JAR
    相关,因此您无法立即确定哪个库使用了不推荐使用或从Java 9或11中删除的类,但您可以通过查看类名间接地执行此操作,例如。(来自
    com.atomikos
    库的类需要缺少的类
    javax.jms.jmsceception
    ):

    解决方案3:在类路径上重新排序JAR文件
  • 将所有JARs库复制到一个
    mylib
    目录中
  • 运行以下命令:

    jdepscan——删除——类路径path/to/mylib/*.jar路径/to/my application.jar

  • 检查日志以查看
    错误:找不到不应引发的类
    消息,因为JAR存在于lib目录中。对于每个这样的库,请使用按字母顺序引用它的库名称之前的名称复制库。例如,我在lib目录
    alpha.JAR
    这取决于
    commons-lang-3.0.jar
    (尚未加载到类路径中),因此我将
    commons-lang-3.0.jar
    复制到
    a0commons-lang-3.0.jar
    ,以便在
    alpha.jar
    之前加载它。复制jar非常重要,不要重命名它,否则它可能不会被
    jdepscan
    分析完成后,返回步骤2,直到库依赖项不产生错误消息为止

  • 优点:提供了一个清晰的视图,说明哪个JAR使用了不推荐/删除的类

    缺点:需要很多时间(手动复制每个单独的jar,这会导致类加载问题)

    结论
    我将
    jdepscan
    解决方案2一起使用。这应该被视为一种解决方法(这是一个不完整的工具文档还是一个bug,我不知道…).

    请确保要扫描一个JAR文件或一组类文件,您必须首先确保扫描的类所依赖的所有类都存在于类路径中。这可以被确认为通常情况下,您将使用与调用应用程序时使用的类路径相同的类路径。同意,我已经处理好了。我甚至去了ead并取出罐子,以检查
    Processing class com/atomikos/datasource/xa/jms/JmsTransactionalResource...
    error: cannot find class javax/jms/JMSException