The idea is very simple, untied war bag, untied jar package and found that they reported the same name package.class out, regardless of whether or not "compatible" ..
import zipfile import io from collections import defaultdict import sys if len(sys.argv) < 2: print("{0} /path/xxx.war".format(sys.argv[0])) exit(1) exit_code = 0 jar_classes = defaultdict(set) war_file = zipfile.ZipFile(sys.argv[1], "r") for jar_file in war_file.infolist(): if jar_file.filename.endswith(".jar"): jar_content = io.BytesIO(war_file.read(jar_file)) jar_zip_file = zipfile.ZipFile(jar_content, "r") for jar_item in jar_zip_file.infolist(): if jar_item.filename.endswith(".class"): class_full_name = jar_item.filename jar_classes[class_full_name].add(jar_file.filename.split("/")[-1].strip()) for class_full_name in sorted(jar_classes.keys()): jar_filename_set = jar_classes[class_full_name] if len(jar_filename_set) > 1: exit_code = 1 class_full_name = ".".join(class_full_name.replace("/", ".").split(".")[:-1]) print("{1}\t{0}".format(class_full_name, ", ".join(jar_filename_set))) war_file.close() exit(exit_code)