Skip to content

Commit 51f7247

Browse files
committed
! improve show-duplicate-java-classes output
- improve format - sort items
1 parent 8f36941 commit 51f7247

File tree

2 files changed

+69
-42
lines changed

2 files changed

+69
-42
lines changed

bin/show-duplicate-java-classes

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,21 +100,42 @@ def find_duplicate_classes(class_to_class_paths):
100100

101101

102102
def print_duplicate_classes_info(class_paths_to_duplicate_classes):
103-
print('Found duplicate classes in below class paths:')
104-
for idx, jars in enumerate(class_paths_to_duplicate_classes, start=1):
105-
print('%-3d(%d@%d): %s' % (idx, len(class_paths_to_duplicate_classes[jars]), len(jars), ' '.join(jars)))
103+
# sort kv pairs
104+
class_paths_to_duplicate_classes = sorted(class_paths_to_duplicate_classes.items(), reverse=True,
105+
key=lambda item: (len(item[0]), len(item[1])))
106+
# sort key(class_paths) and value(duplicate_classes)
107+
class_paths_to_duplicate_classes = [(sorted(list(cps)), sorted(list(dcs)))
108+
for cps, dcs in class_paths_to_duplicate_classes]
109+
110+
print('Found duplicate classes in below %s class paths:' % len(class_paths_to_duplicate_classes))
111+
112+
idx_str_max_len = len(str(len(class_paths_to_duplicate_classes)))
113+
for idx, (class_paths, classes) in enumerate(class_paths_to_duplicate_classes, start=1):
114+
print('[%*d] found %d duplicate classes in %d class paths:\n %s' % (
115+
idx_str_max_len, idx,
116+
len(classes), len(class_paths),
117+
'\n '.join(class_paths)
118+
))
106119

107120
print_box_message('Duplicate classes detail info:')
108-
for idx, (jars, classes) in enumerate(class_paths_to_duplicate_classes.items(), start=1):
109-
print('%-3d(%d@%d): %s' % (idx, len(class_paths_to_duplicate_classes[jars]), len(jars), ' '.join(jars)))
121+
for idx, (class_paths, classes) in enumerate(class_paths_to_duplicate_classes, start=1):
122+
print('[%*d] found %d duplicate classes in %d class paths %s :' % (
123+
idx_str_max_len, idx,
124+
len(classes), len(class_paths), ' '.join(class_paths)
125+
))
126+
class_idx_str_max_len = len(str(len(classes)))
110127
for i, c in enumerate(classes, start=1):
111-
print('%7d %s' % (i, c))
128+
print(' %*d: %s' % (class_idx_str_max_len, i, c))
112129

113130

114131
def print_class_paths_info(class_paths):
115-
print_box_message('class paths to find:')
132+
class_paths = sorted(list(class_paths))
133+
134+
print_box_message('Find in %s class paths:' % len(class_paths))
135+
136+
idx_str_max_len = len(str(len(class_paths)))
116137
for idx, class_path in enumerate(class_paths, start=1):
117-
print('%-3d: %s' % (idx, class_path))
138+
print('%*d: %s' % (idx_str_max_len, idx, class_path))
118139

119140

120141
def main():

docs/java.md

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ $ show-busy-java-threads
227227
----------------------
228228
229229
找出`Java Lib``Java`库,即`Jar`文件)或`Class`目录(类目录)中的重复类。
230-
全系统支持(`Python`实现,安装`Python`即可),如`Linux``Mac``Windows`
230+
全系统支持(`Python 3`实现,安装`Python 3`即可),如`Linux``Mac``Windows`
231231
232232
`Java`开发的一个麻烦的问题是`Jar`冲突(即多个版本的`Jar`),或者说重复类。会出`NoSuchMethod`等的问题,还不见得当时出问题。找出有重复类的`Jar`,可以防患未然。
233233
@@ -330,52 +330,58 @@ $ show-duplicate-java-classes WEB-INF/lib
330330
COOL! No duplicate classes found!
331331
332332
================================================================================
333-
class paths to find:
333+
Find in 150 class paths:
334334
================================================================================
335-
1 : WEB-INF/lib/sourceforge.spring.modules.context-2.5.6.SEC02.jar
336-
2 : WEB-INF/lib/misc.htmlparser-0.0.0.jar
337-
3 : WEB-INF/lib/normandy.client-1.0.2.jar
335+
1: WEB-INF/lib/aopalliance-1.0.jar
336+
2: WEB-INF/lib/asm-3.2.jar
337+
3: WEB-INF/lib/aspectjrt-1.6.1.jar
338+
4: WEB-INF/lib/aspectjweaver-1.6.6.jar
338339
...
339340
340341
$ show-duplicate-java-classes -c WEB-INF/classes WEB-INF/lib
341-
Found duplicate classes in below class path:
342-
1 (293@2): WEB-INF/lib/sourceforge.spring-2.5.6.SEC02.jar WEB-INF/lib/sourceforge.spring.modules.orm-2.5.6.SEC02.jar
343-
2 (2@3): WEB-INF/lib/servlet-api-3.0-alpha-1.jar WEB-INF/lib/jsp-api-2.1-rev-1.jar WEB-INF/lib/jstl-api-1.2-rev-1.jar
344-
3 (104@2): WEB-INF/lib/commons-io-2.2.jar WEB-INF/lib/jakarta.commons.io-2.0.jar
345-
4 (6@3): WEB-INF/lib/jakarta.commons.logging-1.1.jar WEB-INF/lib/commons-logging-1.1.1.jar WEB-INF/lib/org.slf4j.jcl104-over-slf4j-1.5.6.jar
346-
5 (344@2): WEB-INF/lib/sourceforge.spring-2.5.6.SEC02.jar WEB-INF/lib/sourceforge.spring.modules.context-2.5.6.SEC02.jar
342+
Found duplicate classes in below 9 class paths:
343+
[1] found 188 duplicate classes in 2 class paths:
344+
WEB-INF/lib/jdom-2.0.2.jar
345+
WEB-INF/lib/jdom2-2.0.6.jar
346+
[2] found 150 duplicate classes in 2 class paths:
347+
WEB-INF/lib/netty-all-4.0.35.Final.jar
348+
WEB-INF/lib/netty-common-4.1.31.Final.jar
349+
[3] found 148 duplicate classes in 2 class paths:
350+
WEB-INF/lib/netty-all-4.0.35.Final.jar
351+
WEB-INF/lib/netty-handler-4.1.31.Final.jar
352+
[4] found 103 duplicate classes in 2 class paths:
353+
WEB-INF/lib/hessian-3.0.14.bugfix-tae3.jar
354+
WEB-INF/lib/hessian-4.0.38.jar
347355
...
348356
349357
================================================================================
350358
Duplicate classes detail info:
351359
================================================================================
352-
1 (293@2): WEB-INF/lib/sourceforge.spring-2.5.6.SEC02.jar WEB-INF/lib/sourceforge.spring.modules.orm-2.5.6.SEC02.jar
353-
1 org/springframework/orm/toplink/TopLinkTemplate$13.class
354-
2 org/springframework/orm/hibernate3/HibernateTemplate$24.class
355-
3 org/springframework/orm/jpa/vendor/HibernateJpaDialect.class
356-
4 org/springframework/orm/hibernate3/TypeDefinitionBean.class
357-
5 org/springframework/orm/hibernate3/SessionHolder.class
358-
...
359-
2 (2@3): WEB-INF/lib/servlet-api-3.0-alpha-1.jar WEB-INF/lib/jsp-api-2.1-rev-1.jar WEB-INF/lib/jstl-api-1.2-rev-1.jar
360-
1 javax/servlet/ServletException.class
361-
2 javax/servlet/ServletContext.class
362-
3 (104@2): WEB-INF/lib/commons-io-2.2.jar WEB-INF/lib/jakarta.commons.io-2.0.jar
363-
1 org/apache/commons/io/input/ProxyReader.class
364-
2 org/apache/commons/io/output/FileWriterWithEncoding.class
365-
3 org/apache/commons/io/output/TaggedOutputStream.class
366-
4 org/apache/commons/io/filefilter/NotFileFilter.class
367-
5 org/apache/commons/io/filefilter/TrueFileFilter.class
368-
...
360+
[1] found 188 duplicate classes in 2 class paths WEB-INF/lib/jdom-2.0.2.jar WEB-INF/lib/jdom2-2.0.6.jar :
361+
1: org/jdom2/Attribute.class
362+
2: org/jdom2/AttributeList$1.class
363+
3: org/jdom2/AttributeList$ALIterator.class
364+
4: org/jdom2/AttributeList.class
365+
5: org/jdom2/AttributeType.class
366+
...
367+
[2] found 150 duplicate classes in 2 class paths WEB-INF/lib/netty-all-4.0.35.Final.jar WEB-INF/lib/netty-common-4.1.31.Final.jar :
368+
1: io/netty/util/AbstractReferenceCounted.class
369+
2: io/netty/util/Attribute.class
370+
3: io/netty/util/AttributeKey.class
371+
4: io/netty/util/AttributeMap.class
372+
5: io/netty/util/CharsetUtil.class
373+
...
369374
...
370375
371376
================================================================================
372-
class paths to find:
377+
Find in 232 class paths:
373378
================================================================================
374-
1 : WEB-INF/lib/sourceforge.spring.modules.context-2.5.6.SEC02.jar
375-
2 : WEB-INF/lib/misc.htmlparser-0.0.0.jar
376-
3 : WEB-INF/lib/normandy.client-1.0.2.jar
377-
4 : WEB-INF/lib/xml.xmlgraphics__batik-css-1.7.jar-1.7.jar
378-
5 : WEB-INF/lib/jakarta.ecs-1.4.2.jar
379+
1: WEB-INF/classes
380+
2: WEB-INF/lib/HikariCP-2.7.8.jar
381+
3: WEB-INF/lib/accessors-smart-1.2.jar
382+
4: WEB-INF/lib/alimonitor-jmonitor-1.1.3.jar
383+
5: WEB-INF/lib/aopalliance-1.0.jar
384+
6: WEB-INF/lib/asm-5.0.4.jar
379385
...
380386
```
381387

0 commit comments

Comments
 (0)