3

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 ?

Naman
  • 27,789
  • 26
  • 218
  • 353
Julien Kronegg
  • 4,968
  • 1
  • 47
  • 60

1 Answers1

2

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.

Julien Kronegg
  • 4,968
  • 1
  • 47
  • 60
  • This is awesome! I removed the "Processing class..." messages using Regex Replace on Notepad++ which ended up giving a neat report of all the discontinued classes. – Anu Shibin Joseph Raj Apr 25 '22 at 09:30
  • I faced one minor issue where I was using signed JARs in my EAR. Hence the signature validation was throwing errors when running the ```jdeprscan``` tool. I had to manually delete the *.RSA and MANIFEST.* from 00lib.jar to get it working. – Anu Shibin Joseph Raj Apr 25 '22 at 09:32