}
public static void _loadFromClasspath(FileUtils base, List<URL> jarList, ClassLoader classLoader) {
PerformanceTimer timer = new PerformanceTimer();
timer.event("create filters");
Options options = SystemInstance.get().getOptions();
String include = "";
String exclude = "";
PatternFilter classpathInclude = new PatternFilter(options.get(DeploymentFilterable.CLASSPATH_INCLUDE, ".*"));
PatternFilter classpathExclude = new PatternFilter(options.get(DeploymentFilterable.CLASSPATH_EXCLUDE, ""));
IncludeExcludeFilter classpathFilter = new IncludeExcludeFilter(classpathInclude, classpathExclude);
PatternFilter packageInclude = new PatternFilter(options.get(DeploymentFilterable.PACKAGE_INCLUDE, ".*"));
PatternFilter packageExclude = new PatternFilter(options.get(DeploymentFilterable.PACKAGE_EXCLUDE, ""));
IncludeExcludeFilter packageFilter;
if (classpathInclude.getPattern().pattern().equals(".*") && packageInclude.getPattern().pattern().equals(".*")) {
timer.event("callers");
Set<String> callers = callers();
timer.event("parse packages");
callers.size();
Set<String> packages = new HashSet<String>();
for (String caller : callers) {
String[] parts = caller.split("\\.");
if (parts.length > 2) {
parts = new String[]{parts[0], parts[1]};
}
packages.add(Join.join(".", parts));
}
Filter includes = Filters.packages(packages.toArray(new String[0]));
packageFilter = new IncludeExcludeFilter(includes, packageExclude);
} else {
packageFilter = new IncludeExcludeFilter(packageInclude, packageExclude);
}
timer.event("urlset");
Set<RequireDescriptors> requireDescriptors = options.getAll(DeploymentFilterable.CLASSPATH_REQUIRE_DESCRIPTOR, RequireDescriptors.CLIENT);
boolean filterDescriptors = options.get(DeploymentFilterable.CLASSPATH_FILTER_DESCRIPTORS, false);
boolean filterSystemApps = options.get(DeploymentFilterable.CLASSPATH_FILTER_SYSTEMAPPS, true);
try {
UrlSet urlSet = new UrlSet(classLoader);
timer.event("exclude system urls");
urlSet = urlSet.exclude(ClassLoader.getSystemClassLoader().getParent());
urlSet = urlSet.excludeJavaExtDirs();
urlSet = urlSet.excludeJavaEndorsedDirs();
urlSet = urlSet.excludeJavaHome();
urlSet = urlSet.excludePaths(System.getProperty("sun.boot.class.path", ""));
urlSet = urlSet.exclude(".*/JavaVM.framework/.*");
timer.event("classpath filter");
UrlSet beforeFiltering = urlSet;
urlSet = urlSet.filter(classpathFilter);
// If the user filtered out too much, that's a problem
if (urlSet.size() == 0) {
final String message = String.format("Classpath Include/Exclude resulted in zero URLs. There were %s possible URLs before filtering and 0 after: include=\"%s\", exclude=\"%s\"", beforeFiltering.size(), include, exclude);
logger.error(message);
logger.info("Eligible Classpath before filtering:");
for (URL url : beforeFiltering) {
logger.info(String.format(" %s", url.toExternalForm()));
}
// throw new IllegalStateException(message);
}
// If they are the same size, than nothing was filtered
// and we know the user did not take action to change the default
final boolean userSuppliedClasspathFilter = beforeFiltering.size() != urlSet.size();
if (!userSuppliedClasspathFilter) {
logger.info("Applying buildin classpath excludes");
timer.event("buildin excludes");
urlSet = applyBuiltinExcludes(urlSet);
}
DeploymentsResolver.processUrls(urlSet.getUrls(), classLoader, EnumSet.allOf(RequireDescriptors.class), base, jarList);
timer.event("package filter");
urlSet = filterArchives(packageFilter, classLoader, urlSet);
timer.event("process urls");
// we should exclude system apps before and apply user properties after
// if (filterSystemApps){
// urlSet = urlSet.exclude(".*/openejb-[^/]+(.(jar|ear|war)(!/)?|/target/(test-)?classes/?)");
// }
List<URL> urls = urlSet.getUrls();
int size = urls.size();
// if (size == 0) {
// logger.warning("No classpath URLs matched. Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + "='" + include + "'");
// return;
// } else if (size == 0 && (!filterDescriptors && prefiltered.getUrls().size() == 0)) {
// return;
// } else if (size < 20) {
// logger.debug("Inspecting classpath for applications: " + urls.size() + " urls.");
// } else {
// // Has the user allowed some module types to be discoverable via scraping?
// boolean willScrape = requireDescriptors.size() < RequireDescriptors.values().length;
//
// if (size < 50 && willScrape) {
// logger.info("Inspecting classpath for applications: " + urls.size() + " urls. Consider adjusting your exclude/include. Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + "='" + include + "'");
// } else if (willScrape) {
// logger.warning("Inspecting classpath for applications: " + urls.size() + " urls.");
// logger.warning("ADJUST THE EXCLUDE/INCLUDE!!!. Current settings: " + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + "='" + include + "'");
// }
// }
long begin = System.currentTimeMillis();
DeploymentsResolver.processUrls(urls, classLoader, requireDescriptors, base, jarList);
long end = System.currentTimeMillis();
long time = end - begin;
timer.stop(System.out);
UrlSet unchecked = new UrlSet();
// if (!filterDescriptors){
// unchecked = prefiltered.exclude(urlSet);
// if (filterSystemApps){