/** * * @return - a list of jar pairs that have overlapping class files - only a limited list of classpath resources is * considered. * */ public List<JarPair> findOverlappingJars(List<ClasspathResource> classpathResources, boolean excludeSameSizeDups) { List<ClasspathResource> classFilesWithDuplicates = findClassFileDuplicates(classpathResources, excludeSameSizeDups); //jar overlap report Map<JarPair, JarPair> overlapPairs = new HashMap<>(); for (ClasspathResource classFile : classFilesWithDuplicates) { List<ClasspathResourceVersion> versions = classFile.getResourceFileVersions(); findOverlappingJarsPairs(versions, overlapPairs, 0); } List<JarPair> overlapReportLines = new ArrayList<>(overlapPairs.keySet()); Comparator<JarPair> comparator = new Comparator<JarPair>() { @Override public int compare(JarPair line1, JarPair line2) { return -1 * line1.getDupClassesTotal().compareTo(line2.getDupClassesTotal()); } }; Collections.sort(overlapReportLines, comparator); return overlapReportLines; }
/** * * @return - a list of jar pairs that have overlapping class files - scans the whole classpath * */ public List<JarPair> findOverlappingJars(boolean excludeSameSizeDups) { return findOverlappingJars(findAllClasspathResources(), excludeSameSizeDups); }
/** * Finds all class loaders on the classpath. * * All classloaders names will be returned, with an indication if they are supported by jHades or not. * * @return */ public List<ClazzLoader> findAllClassLoaders() { return findAllClassLoaders(getClass().getClassLoader()); }
public JHades findResource(String resource) { if (resource == null) { throw new IllegalArgumentException("Resource path cannot be null."); } System.out.println(">> jHades printResourcePath >> searching for " + resource + "\n"); List<URL> allVersions = scanner.findAllResourceVersions(resource); boolean resultsFound = allVersions != null && allVersions.size() > 0; System.out.println("All versions:\n"); for (URL version : allVersions) { System.out.println(version); } URL currentVersion = scanner.findCurrentResourceVersion(resource); if (resultsFound && currentVersion != null) { System.out.println("\nCurrent version being used: \n\n" + currentVersion); } endCommand(resultsFound); return this; }
boolean isExcludeSameSizeDups = "true".equals(System.getProperty("exclude.same.size.dups")); List<JarPair> overlapReportLines = scanner.findOverlappingJars(classpathResources, isExcludeSameSizeDups); List<ClasspathResource> resourcesWithDifferentSizeDups = scanner.findClassFileDuplicates(classpathResources, isExcludeSameSizeDups); DuplicatesReport report = new DuplicatesReport(resourcesWithDifferentSizeDups, new StandaloneReportUrlFormatter()); report.print(); List<ClasspathResource> searchResults = scanner.findByRegex(searchByFileName); if (searchResults != null && !searchResults.isEmpty()) { System.out.println("\nSearch results using regular expression: " + searchByFileName + "\n");
public JHades findByRegex(String search) { if (search == null || search.isEmpty()) { throw new IllegalArgumentException("search string cannot be null or empty."); } System.out.println(">> jHades search >> Searching for resorce using search string: " + search + "\n"); List<ClasspathResource> classpathResources = scanner.findByRegex(search); boolean resultsFound = classpathResources != null && classpathResources.size() > 0; if (resultsFound) { System.out.println("\nResults Found:\n"); for (ClasspathResource classpathResource : classpathResources) { System.out.println(classpathResource.getName()); } } endCommand(resultsFound); return this; }
public JHades overlappingJarsReport() { System.out.println("\n>> jHades - scanning classpath for overlapping jars: \n"); List<JarPair> jarOverlapReportLines = scanner.findOverlappingJars(); for (JarPair jarOverlapReportLine : jarOverlapReportLines) { String reportLine = jarOverlapReportLine.getJar1().getUrl() + " overlaps with \n" + jarOverlapReportLine.getJar2().getUrl() + " - total overlapping classes: " + jarOverlapReportLine.getDupClassesTotal() + " - "; if (jarOverlapReportLine.getJar1().getClassLoader().equals(jarOverlapReportLine.getJar2().getClassLoader())) { reportLine += "same classloader ! This is an ERROR!\n"; } else { reportLine += "different classloaders.\n"; } System.out.println(reportLine); } endCommand(jarOverlapReportLines.size() > 0); return this; }
/** * * Finds a list of all classpath resources that contain duplicates. * * A duplicate classpath resource can be for example a configuration file such as log4.xml, that exists by accident * multiple times on the classpath. * * @param excludeSameSizeDups - excludes from the reports files for which all classpath versions have the same size * @return classpath resources that have multiple versions on the classpath */ public List<ClasspathResource> findAllResourcesWithDuplicates(boolean excludeSameSizeDups) { List<ClasspathResource> resourceFiles = findAllClasspathResources(); return ClasspathResources.findResourcesWithDuplicates(resourceFiles, excludeSameSizeDups); }
/** * * Scans the classpath for all resource files. * * @return - the full list of resources on the classpath, including all its known versions. */ public List<ClasspathResource> findAllClasspathResources() { List<ClasspathEntry> classpathEntries = findAllClasspathEntries(); return ClasspathEntries.findClasspathResourcesInEntries(classpathEntries, logger, null); }
public JHades multipleClassVersionsReport(boolean excludeSameSizeDups) { List<ClasspathResource> resourcesWithDuplicates = scanner.findAllResourcesWithDuplicates(excludeSameSizeDups); DuplicatesReport report = new DuplicatesReport(resourcesWithDuplicates); report.print(); return this; }
public JHades findClass(Class clazz) { if (clazz == null) { throw new IllegalArgumentException("Class name cannot be null."); } System.out.println(">> jHades searchClass >> Searching for class: " + clazz.getCanonicalName() + "\n"); ClasspathResource foundClass = scanner.findClass(clazz); for (ClasspathResourceVersion version : foundClass.getResourceFileVersions()) { System.out.println(version.getClasspathEntry().getUrl() + foundClass.getName() + " size = " + version.getFileSize()); } endCommand(foundClass != null); return this; }
public JHades findByRegex(String search) { if (search == null || search.isEmpty()) { throw new IllegalArgumentException("search string cannot be null or empty."); } System.out.println(">> jHades search >> Searching for resorce using search string: " + search + "\n"); List<ClasspathResource> classpathResources = scanner.findByRegex(search); boolean resultsFound = classpathResources != null && classpathResources.size() > 0; if (resultsFound) { System.out.println("\nResults Found:\n"); for (ClasspathResource classpathResource : classpathResources) { System.out.println(classpathResource.getName()); } } endCommand(resultsFound); return this; }
public JHades overlappingJarsReport() { System.out.println("\n>> jHades - scanning classpath for overlapping jars: \n"); List<JarPair> jarOverlapReportLines = scanner.findOverlappingJars(); for (JarPair jarOverlapReportLine : jarOverlapReportLines) { String reportLine = jarOverlapReportLine.getJar1().getUrl() + " overlaps with \n" + jarOverlapReportLine.getJar2().getUrl() + " - total overlapping classes: " + jarOverlapReportLine.getDupClassesTotal() + " - "; if (jarOverlapReportLine.getJar1().getClassLoader().equals(jarOverlapReportLine.getJar2().getClassLoader())) { reportLine += "same classloader ! This is an ERROR!\n"; } else { reportLine += "different classloaders.\n"; } System.out.println(reportLine); } endCommand(jarOverlapReportLines.size() > 0); return this; }
public JHades findResource(String resource) { if (resource == null) { throw new IllegalArgumentException("Resource path cannot be null."); } System.out.println(">> jHades printResourcePath >> searching for " + resource + "\n"); List<URL> allVersions = scanner.findAllResourceVersions(resource); boolean resultsFound = allVersions != null && allVersions.size() > 0; System.out.println("All versions:\n"); for (URL version : allVersions) { System.out.println(version); } URL currentVersion = scanner.findCurrentResourceVersion(resource); if (resultsFound && currentVersion != null) { System.out.println("\nCurrent version being used: \n\n" + currentVersion); } endCommand(resultsFound); return this; }
/** * * Finds a list of all classpath resources that contain duplicates. * * A duplicate classpath resource can be for example a configuration file such as log4.xml, that exists by accident * multiple times on the classpath. * * @param excludeSameSizeDups - excludes from the reports files for which all classpath versions have the same size * @return classpath resources that have multiple versions on the classpath */ public List<ClasspathResource> findAllResourcesWithDuplicates(boolean excludeSameSizeDups) { List<ClasspathResource> resourceFiles = findAllClasspathResources(); return ClasspathResources.findResourcesWithDuplicates(resourceFiles, excludeSameSizeDups); }
/** * * Scans the classpath for all resource files. * * @return - the full list of resources on the classpath, including all its known versions. */ public List<ClasspathResource> findAllClasspathResources() { List<ClasspathEntry> classpathEntries = findAllClasspathEntries(); return ClasspathEntries.findClasspathResourcesInEntries(classpathEntries, logger, null); }
public JHades multipleClassVersionsReport(boolean excludeSameSizeDups) { List<ClasspathResource> resourcesWithDuplicates = scanner.findAllResourcesWithDuplicates(excludeSameSizeDups); DuplicatesReport report = new DuplicatesReport(resourcesWithDuplicates); report.print(); return this; }
public JHades findClass(Class clazz) { if (clazz == null) { throw new IllegalArgumentException("Class name cannot be null."); } System.out.println(">> jHades searchClass >> Searching for class: " + clazz.getCanonicalName() + "\n"); ClasspathResource foundClass = scanner.findClass(clazz); for (ClasspathResourceVersion version : foundClass.getResourceFileVersions()) { System.out.println(version.getClasspathEntry().getUrl() + foundClass.getName() + " size = " + version.getFileSize()); } endCommand(foundClass != null); return this; }
/** * * @return - a list of jar pairs that have overlapping class files - scans the whole classpath * */ public List<JarPair> findOverlappingJars(boolean excludeSameSizeDups) { return findOverlappingJars(findAllClasspathResources(), excludeSameSizeDups); }
/** * * @return - a list of jar pairs that have overlapping class files - only a limited list of classpath resources is * considered. * */ public List<JarPair> findOverlappingJars(List<ClasspathResource> classpathResources, boolean excludeSameSizeDups) { List<ClasspathResource> classFilesWithDuplicates = findClassFileDuplicates(classpathResources, excludeSameSizeDups); //jar overlap report Map<JarPair, JarPair> overlapPairs = new HashMap<>(); for (ClasspathResource classFile : classFilesWithDuplicates) { List<ClasspathResourceVersion> versions = classFile.getResourceFileVersions(); findOverlappingJarsPairs(versions, overlapPairs, 0); } List<JarPair> overlapReportLines = new ArrayList<>(overlapPairs.keySet()); Comparator<JarPair> comparator = new Comparator<JarPair>() { @Override public int compare(JarPair line1, JarPair line2) { return -1 * line1.getDupClassesTotal().compareTo(line2.getDupClassesTotal()); } }; Collections.sort(overlapReportLines, comparator); return overlapReportLines; }