1818import java .util .Map ;
1919import java .util .Queue ;
2020import java .util .Set ;
21- import java .util .TreeMap ;
2221import java .util .function .Supplier ;
2322
2423import org .jboss .logging .Logger ;
@@ -56,7 +55,6 @@ class JarTreeShaker {
5655
5756 private final Map <String , Supplier <byte []>> appBytecode = new HashMap <>();
5857 private final Map <String , ArtifactKey > classToDep = new HashMap <>();
59- private final Map <ArtifactKey , Integer > depClassCount = new HashMap <>();
6058 private final Map <String , Set <String >> serviceProviders = new HashMap <>();
6159 private final Map <String , Set <String >> serviceLoaderCalls = new HashMap <>();
6260 private final Set <String > sisuNamedClasses = new HashSet <>();
@@ -163,24 +161,6 @@ private JarTreeShakeBuildItem runInternal() {
163161 }
164162
165163 // Report
166-
167- // Determine which dependencies have reachable classes
168- final Map <ArtifactKey , Integer > depReachableCount = countReachableClasses (reachable );
169-
170- final Set <ArtifactKey > usedDeps = new HashSet <>();
171- final Map <ArtifactKey , int []> usedDepsReport = new TreeMap <>(Comparator .comparing (ArtifactKey ::toString ));
172- int unusedCount = 0 ;
173- for (ResolvedDependency dep : appModel .getRuntimeDependencies ()) {
174- final ArtifactKey key = dep .getKey ();
175- int reached = depReachableCount .getOrDefault (key , 0 );
176- if (reached > 0 ) {
177- usedDeps .add (key );
178- usedDepsReport .put (key , new int [] { reached , depClassCount .getOrDefault (key , 0 ) });
179- } else {
180- unusedCount ++;
181- }
182- }
183-
184164 log .info ("============================================================" );
185165 log .info (" Tree Shake: Dependency Usage Analysis" );
186166 log .info ("============================================================" );
@@ -190,21 +170,16 @@ private JarTreeShakeBuildItem runInternal() {
190170 removedClassCount ,
191171 totalDepClasses > 0 ? (removedClassCount * 100.0 / totalDepClasses ) : 0.0 ,
192172 formatSize (removedBytes ));
193- log .infof (" Used dependencies : %d" , usedDeps .size ());
194- log .infof (" Unused dependencies : %d" , unusedCount );
195173 log .info ("------------------------------------------------------------" );
196174 log .info (" DEPENDENCIES WITH REMOVED CLASSES:" );
197- for (var entry : usedDepsReport .entrySet ()) {
198- int [] counts = entry .getValue ();
199- if (counts [0 ] < counts [1 ]) {
200- log .infof (" - %s (%d / %d classes removed)" ,
201- entry .getKey ().toGacString (), counts [1 ] - counts [0 ], counts [1 ]);
202- }
203- }
175+ removedClassesPerDep .entrySet ().stream ()
176+ .sorted (Map .Entry .comparingByKey (Comparator .comparing (ArtifactKey ::toGacString )))
177+ .forEach (e -> log .infof (" - %s (%d classes removed)" ,
178+ e .getKey ().toGacString (), e .getValue ().size ()));
204179 log .info ("============================================================" );
205180 log .infof ("Done in %s" , (System .currentTimeMillis () - start ));
206181
207- return new JarTreeShakeBuildItem (treeShakeLevel , reachable , usedDeps , removedClassesPerDep );
182+ return new JarTreeShakeBuildItem (treeShakeLevel , reachable , removedClassesPerDep );
208183 }
209184
210185 private void collectRuntimeClasses () {
@@ -216,7 +191,6 @@ private void collectRuntimeClasses() {
216191 // Add all classes from quarkus-bootstrap-runner as roots (fast-jar runtime infrastructure)
217192 final boolean addClassesAsRoots = "quarkus-bootstrap-runner" .equals (dep .getArtifactId ());
218193
219- final int [] classCount = new int [1 ];
220194 // Use walkRaw to get all entries including multi-release versions.
221195 // For multi-release entries, we pick the highest version <= appJavaVersion,
222196 // matching what JarFile.runtimeVersion() resolves at runtime.
@@ -254,7 +228,6 @@ private void collectRuntimeClasses() {
254228 int currentVersion = depBytecodeVersion .getOrDefault (className , -1 );
255229 if (currentVersion < 0 ) {
256230 classToDep .put (className , dep .getKey ());
257- classCount [0 ]++;
258231 }
259232 if (classJavaVersion > currentVersion ) {
260233 depBytecodeVersion .put (className , classJavaVersion );
@@ -283,7 +256,6 @@ private void collectRuntimeClasses() {
283256 parseSisuNamedFile (visit .getPath ());
284257 }
285258 });
286- depClassCount .put (dep .getKey (), classCount [0 ]);
287259 }
288260 }
289261
@@ -357,17 +329,6 @@ private void addStringClassReferenceRoots(Set<String> allKnownClasses) {
357329 }
358330 }
359331
360- private Map <ArtifactKey , Integer > countReachableClasses (Set <String > reachable ) {
361- final Map <ArtifactKey , Integer > depReachableCount = new HashMap <>();
362- for (String className : reachable ) {
363- ArtifactKey dep = classToDep .get (className );
364- if (dep != null ) {
365- depReachableCount .merge (dep , 1 , Integer ::sum );
366- }
367- }
368- return depReachableCount ;
369- }
370-
371332 private OpenPathTree openPathTree (ResolvedDependency dep ) {
372333 var openPathTree = dep .getContentTree ().open ();
373334 openTrees .add (openPathTree );
0 commit comments