Java jdeprscan抛出找不到类错误
我正在CentOS系统上尝试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——删除——详细—
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
- 由
指定的目录中的JAR被添加到类路径中并按字母顺序进行分析,这可能会导致一些--class path
消息,因为JAR错误:找不到class X
可能依赖于尚未加载的JARa.JAR
b.JAR
jdepscan
做了相同的实验,但没有任何改进
解决方案1:类路径上的所有类
mylib
(注意,在此阶段,mylibs目录只包含由目录包组织的类,而不包含JAR)jdepscan——删除——类path/path/to/mylib/path/to/my application.jar
优势:快速(非常手动操作)
缺点:仅分析命令行上指定的JAR文件(my application.JAR
)
解决方案2:类路径上的所有JAR+一个胖JAR
mylib
目录中mylib
的JAR中提取所有文件(忽略重复的文件),并将它们重新打包到一个大JARmylib/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
mylib
缺点:一些jdepscan
消息将与fat JAR00lib.JAR
相关,因此您无法立即确定哪个库使用了不推荐使用或从Java 9或11中删除的类,但您可以通过查看类名间接地执行此操作,例如。(来自com.atomikos
库的类需要缺少的类javax.jms.jmsceception
):
解决方案3:在类路径上重新排序JAR文件
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,直到库依赖项不产生错误消息为止我将
jdepscan
与解决方案2一起使用。这应该被视为一种解决方法(这是一个不完整的工具文档还是一个bug,我不知道…).请确保要扫描一个JAR文件或一组类文件,您必须首先确保扫描的类所依赖的所有类都存在于类路径中。这可以被确认为通常情况下,您将使用与调用应用程序时使用的类路径相同的类路径。同意,我已经处理好了。我甚至去了ead并取出罐子,以检查
Processing class com/atomikos/datasource/xa/jms/JmsTransactionalResource...
error: cannot find class javax/jms/JMSException