in src/main/java/org/apache/maven/shared/jar/classes/JarClassesAnalysis.java [175:241]
private JarClasses analyze(String jarFilename, List<JarEntry> classList) {
JarClasses classes = new JarClasses();
classes.setDebugPresent(false);
double maxVersion = 0.0;
double moduleInfoVersion = 0.0;
for (JarEntry entry : classList) {
String classname = entry.getName();
try {
ClassParser classParser = new ClassParser(jarFilename, classname);
JavaClass javaClass = classParser.parse();
String classSignature = javaClass.getClassName();
if (!classes.isDebugPresent()) {
if (hasDebugSymbols(javaClass)) {
classes.setDebugPresent(true);
}
}
double classVersion = javaClass.getMajor();
if (javaClass.getMinor() > 0) {
classVersion = classVersion + javaClass.getMinor() / 10.0;
}
if ("module-info".equals(classSignature)) {
// ignore the module-info.class for computing the maxVersion, since it will always be >= 9
moduleInfoVersion = classVersion;
} else if (classVersion > maxVersion) {
maxVersion = classVersion;
}
Method[] methods = javaClass.getMethods();
for (Method method : methods) {
classes.addMethod(classSignature + "." + method.getName() + method.getSignature());
}
String classPackageName = javaClass.getPackageName();
classes.addClassName(classSignature);
classes.addPackage(classPackageName);
ImportVisitor importVisitor = new ImportVisitor(javaClass);
DescendingVisitor descVisitor = new DescendingVisitor(javaClass, importVisitor);
javaClass.accept(descVisitor);
classes.addImports(importVisitor.getImports());
} catch (ClassFormatException e) {
logger.warn("Unable to process class " + classname + " in JarAnalyzer File " + jarFilename, e);
} catch (IOException e) {
logger.warn("Unable to process JarAnalyzer File " + jarFilename, e);
}
}
if (maxVersion == 0.0 && moduleInfoVersion > 0.0) {
// the one and only class file was module-info.class
maxVersion = moduleInfoVersion;
}
Optional.ofNullable(JAVA_CLASS_VERSIONS.get(maxVersion)).ifPresent(classes::setJdkRevision);
return classes;
}