2

jdeprscan工具确定列出所有已弃用和不存在的依赖项。它可以在类、目录和 JAR 上运行。

但是如何在 EAR 上运行它?

4

1 回答 1

1

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 classby 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 模块中。缺少的类如下所示(BASE64EncoderJava 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。

于 2019-07-29T14:36:42.227 回答