Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run `jdeprscan` on an EAR

The jdeprscan tool determines lists all deprecated and non-existing dependencies. It can run on classes, directories and on a JAR.

But how to run it on an EAR ?

like image 261
Julien Kronegg Avatar asked Dec 08 '25 09:12

Julien Kronegg


1 Answers

Inspired by https://stackoverflow.com/a/57217414/698168, I explode the EAR into JARs using the following script (Windows) :

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 ..\..

Note that this script does not use the librairies from the JEE Server (i.e. all the Maven librairies with scope "provided" will be reported as error: cannot find class by jdeprscan).

Then I generate a jdeprscan report using the following command :

"C:\Program Files\Java\jdk-11\bin\jdeprscan" --for-removal --verbose --class-path ear\lib\*.jar ear\my-app.jar > deprscan.log 2>&1

You can then inspect the jdeprscan.log file. The classes that are not found may not exist in the newest Java version (such as 11) or may be present in the JEE modules. A missing class looks like the following (BASE64Encoder is not provided anymore by Java 11 but is used by ChecksumHelper):

Processing class oracle/spatial/security/ChecksumHelper...
error: cannot find class sun/misc/BASE64Encoder

In the best case, you can find the JAR name above in the log file (e.g. Jar file my-lib-2.3.4.jar), otherwise you will need to determine the library from the class name.

Note: all the above was designed with the idea to migrate Java 8 to Java 11.

like image 114
Julien Kronegg Avatar answered Dec 10 '25 21:12

Julien Kronegg



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!