diff options
author | gjoranv <gv@verizonmedia.com> | 2019-07-17 02:40:13 +0200 |
---|---|---|
committer | gjoranv <gv@verizonmedia.com> | 2019-07-17 02:40:47 +0200 |
commit | b41bd18a422633d23504c36fd3da650dc8ac467c (patch) | |
tree | 7ab9d3c3b4aeb0f77eb518f3dd9a025d0753e199 /bundle-plugin | |
parent | ec2b47c9ff86a105006af73d1a5671d5ad207d92 (diff) |
WIP: Log missing packages.
TODO: clean up, but don't remove JdkPackages until final commit
Diffstat (limited to 'bundle-plugin')
-rw-r--r-- | bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java | 42 | ||||
-rw-r--r-- | bundle-plugin/src/main/java/com/yahoo/container/plugin/util/JdkPackages.java | 39 |
2 files changed, 77 insertions, 4 deletions
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java index 48827212baa..130e726f3d4 100644 --- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java @@ -10,7 +10,6 @@ import com.yahoo.container.plugin.classanalysis.PackageTally; import com.yahoo.container.plugin.osgi.ExportPackageParser; import com.yahoo.container.plugin.osgi.ExportPackages; import com.yahoo.container.plugin.osgi.ExportPackages.Export; -import com.yahoo.container.plugin.osgi.ImportPackages; import com.yahoo.container.plugin.osgi.ImportPackages.Import; import com.yahoo.container.plugin.util.Strings; import org.apache.commons.lang3.tuple.Pair; @@ -101,11 +100,14 @@ public class GenerateOsgiManifestMojo extends AbstractMojo { AnalyzeBundle.PublicPackages publicPackagesFromProvidedJars = publicPackagesAggregated( artifactSet.getJarArtifactsProvided().stream().map(Artifact::getFile).collect(Collectors.toList())); + // Packaged defined in this project's code + PackageTally projectPackages = getProjectClassesTally(); + // Packages defined in compile scoped jars - PackageTally compileJarPackages = definedPackages(artifactSet.getJarArtifactsToInclude()); + PackageTally compileJarsPackages = definedPackages(artifactSet.getJarArtifactsToInclude()); // The union of packages in the project and compile scoped jars - PackageTally includedPackages = projectClassesTally().combine(compileJarPackages); + PackageTally includedPackages = projectPackages.combine(compileJarsPackages); warnIfPackagesDefinedOverlapsGlobalPackages(includedPackages.definedPackages(), publicPackagesFromProvidedJars.globals); @@ -116,6 +118,9 @@ public class GenerateOsgiManifestMojo extends AbstractMojo { .map(e -> "(" + e.getPackageNames().toString() + ", " + e.version().orElse("")).collect(Collectors.joining(", "))); } + // TODO: skip if jdisc_core is not in class path? + logMissingPackages(publicPackagesFromProvidedJars, projectPackages, compileJarsPackages, includedPackages); + Map<String, Import> calculatedImports = calculateImports(includedPackages.referencedPackages(), includedPackages.definedPackages(), exportsByPackageName(publicPackagesFromProvidedJars.exports)); @@ -133,6 +138,35 @@ public class GenerateOsgiManifestMojo extends AbstractMojo { } } + private void logMissingPackages(AnalyzeBundle.PublicPackages publicPackagesFromProvidedJars, PackageTally projectPackages, PackageTally compileJarPackages, PackageTally includedPackages) { + Set<String> exportedPackagesFromProvidedDeps = publicPackagesFromProvidedJars.exports + .stream() + .map(Export::getPackageNames) + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + getLog().debug("Exported packages of provided deps: " + exportedPackagesFromProvidedDeps); + + + Set<String> definedAndExportedPackages = Sets.union(includedPackages.definedPackages(), exportedPackagesFromProvidedDeps); + Set<String> missingProjectPackages = Sets.difference(projectPackages.referencedPackages(), definedAndExportedPackages).stream() + .filter(pkg -> ! pkg.startsWith("java.")) + .collect(Collectors.toSet()); + + if (! missingProjectPackages.isEmpty()) { + getLog().warn("Packages unavailable runtime are referenced from project classes (annotations can usually be ignored): " + + missingProjectPackages); + } + + Set<String> missingCompilePackages = Sets.difference(compileJarPackages.referencedPackages(), definedAndExportedPackages).stream() + .filter(pkg -> ! pkg.startsWith("java.")) + .collect(Collectors.toSet()); + + if (! missingCompilePackages.isEmpty()) { + getLog().info("Packages referenced from compile scoped jars, but not available runtime: " + + missingCompilePackages); + } + } + private static void warnIfPackagesDefinedOverlapsGlobalPackages(Set<String> internalPackages, List<String> globalPackages) throws MojoExecutionException { Set<String> overlap = Sets.intersection(internalPackages, new HashSet<>(globalPackages)); @@ -243,7 +277,7 @@ public class GenerateOsgiManifestMojo extends AbstractMojo { artifact.getId(), artifact.getType()))); } - private PackageTally projectClassesTally() { + private PackageTally getProjectClassesTally() { File outputDirectory = new File(project.getBuild().getOutputDirectory()); List<ClassFileMetaData> analyzedClasses = allDescendantFiles(outputDirectory).filter(file -> file.getName().endsWith(".class")) diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/JdkPackages.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/JdkPackages.java new file mode 100644 index 00000000000..0786272bc70 --- /dev/null +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/JdkPackages.java @@ -0,0 +1,39 @@ +package com.yahoo.container.plugin.util; + +import java.net.URL; + +/** + * @author gjoranv + */ +public class JdkPackages { + + /** + * Returns a boolean indicating (via best effort) if the given package is part of the JDK. + */ + public static boolean isJdkPackage(String pkg) { + return hasJdkExclusivePrefix(pkg) + || isResourceInPlatformClassLoader(pkg); // TODO: must be a class, not a package, due to module encapsulation + } + + private static boolean isResourceInPlatformClassLoader(String klass) { + String klassAsPath = klass.replaceAll("\\.", "/") + ".class"; + URL resource = getPlatformClassLoader().getResource(klassAsPath); + return !(resource == null); + } + + private static ClassLoader getPlatformClassLoader() { + ClassLoader platform = JdkPackages.class.getClassLoader().getParent(); + + // Will fail upon changes in classloader hierarchy between JDK versions + assert (platform.getName().equals("platform")); + + return platform; + } + + private static boolean hasJdkExclusivePrefix(String pkg) { + return pkg.startsWith("java.") + || pkg.startsWith("sun."); + } + +} + |