该jdeprscan
工具确定列出所有已弃用和不存在的依赖项。它可以在类、目录和 JAR 上运行。
但是如何在 EAR 上运行它?
受https://stackoverflow.com/a/57217414/698168的启发,我使用以下脚本 (Windows) 将 EAR 分解为 JAR:
rem remove previous run
rd /s /q ear
rem extract the EAR
"C:\Program Files\7-Zip\7z" x -oear *.ear
rem extract the WAR
cd ear
"C:\Program Files\7-Zip\7z" x -owar *.war
rem unify JAR from EAR and WAR
copy war\WEB-INF\lib\*.jar lib
rem make JAR with the classes
cd war\WEB-INF\classes
rem "C:\Program Files\7-Zip\7z" a -r my-app.jar
"C:\Program Files\Java\jdk-11\bin\jar" cvf my-app.jar -C . .
rem Note: using 7zip to create the JAR may lead to errors when running jdeprscan, thus we are using the jar command
copy my-app.jar ..\..\..
rem return to origin
cd ..\..\..
rem unpack all libraries...
cd lib
"C:\Program Files\7-Zip\7z" x -aoa -oclasses *.jar
rem .. and repack them as a fat JAR
cd classes
rem "C:\Program Files\7-Zip\7z" a -r 00lib.jar
"C:\Program Files\Java\jdk-11\bin\jar" cvf 00lib.jar -C . .
rem duplicate the fat JAR and make some cleaning
copy 00lib.jar ..\00lib.jar
copy 00lib.jar ..\01lib.jar
cd ..
rd /s /q classes
rem return to origin
cd ..\..
请注意,此脚本不使用来自 JEE 服务器的库(即所有范围为“提供”的 Maven 库都将报告为error: cannot find class
by jdeprscan
)。
jdeprscan
然后我使用以下命令生成报告:
"C:\Program Files\Java\jdk-11\bin\jdeprscan" --for-removal --verbose --class-path ear\lib\*.jar ear\my-app.jar > deprscan.log 2>&1
然后,您可以检查该jdeprscan.log
文件。未找到的类可能不存在于最新的 Java 版本(例如 11)中,或者可能存在于 JEE 模块中。缺少的类如下所示(BASE64Encoder
Java 11 不再提供,但被使用ChecksumHelper
):
Processing class oracle/spatial/security/ChecksumHelper...
error: cannot find class sun/misc/BASE64Encoder
在最好的情况下,您可以在日志文件中找到上面的 JAR 名称(例如Jar file my-lib-2.3.4.jar
),否则您将需要根据类名称来确定库。
注意:以上所有设计都是为了将 Java 8 迁移到 Java 11。