aboutsummaryrefslogtreecommitdiffstats
path: root/bundle-plugin
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2019-10-18 19:41:18 +0200
committergjoranv <gv@verizonmedia.com>2019-10-22 14:31:10 +0200
commit4a41de337c1f2c803b66bdfdf9c621d23e0aa2f4 (patch)
treea86b3d2def3cc0668e4cd78b776ebd84950a776b /bundle-plugin
parent5600ccae4b945229e8100642d5c9dfe1bce385fa (diff)
Add option to use artifact version as ExportPackage version
Diffstat (limited to 'bundle-plugin')
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java15
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java17
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateOsgiManifestMojo.java52
-rw-r--r--bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java7
4 files changed, 62 insertions, 29 deletions
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java
index 13a306a0c1c..d586f324f77 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/Analyze.java
@@ -1,17 +1,18 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.container.plugin.classanalysis;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Optional;
-import static com.yahoo.container.plugin.util.IO.withFileInputStream;
/**
* Main entry point for class analysis
@@ -21,16 +22,20 @@ import static com.yahoo.container.plugin.util.IO.withFileInputStream;
*/
public class Analyze {
public static ClassFileMetaData analyzeClass(File classFile) {
+ return analyzeClass(classFile, null);
+ }
+
+ public static ClassFileMetaData analyzeClass(File classFile, ArtifactVersion artifactVersion) {
try {
- return withFileInputStream(classFile, Analyze::analyzeClass);
- } catch (RuntimeException e) {
+ return analyzeClass(new FileInputStream(classFile), artifactVersion);
+ } catch (Exception e) {
throw new RuntimeException("An error occurred when analyzing " + classFile.getPath(), e);
}
}
- public static ClassFileMetaData analyzeClass(InputStream inputStream) {
+ public static ClassFileMetaData analyzeClass(InputStream inputStream, ArtifactVersion artifactVersion) {
try {
- AnalyzeClassVisitor visitor = new AnalyzeClassVisitor();
+ AnalyzeClassVisitor visitor = new AnalyzeClassVisitor(artifactVersion);
new ClassReader(inputStream).accept(visitor, ClassReader.SKIP_DEBUG);
return visitor.result();
} catch (IOException e) {
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java
index 0225c43e4b8..e37a9caa7cc 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/classanalysis/AnalyzeClassVisitor.java
@@ -3,6 +3,7 @@ package com.yahoo.container.plugin.classanalysis;
import com.yahoo.osgi.annotation.ExportPackage;
import com.yahoo.osgi.annotation.Version;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
import org.objectweb.asm.ClassVisitor;
@@ -27,8 +28,11 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector {
private Set<String> imports = new HashSet<>();
private Optional<ExportPackageAnnotation> exportPackageAnnotation = Optional.empty();
- AnalyzeClassVisitor() {
+ private final Optional<ArtifactVersion> defaultExportPackageVersion;
+
+ AnalyzeClassVisitor(ArtifactVersion defaultExportPackageVersion) {
super(Opcodes.ASM7);
+ this.defaultExportPackageVersion = Optional.ofNullable(defaultExportPackageVersion);
}
@Override
@@ -99,9 +103,14 @@ class AnalyzeClassVisitor extends ClassVisitor implements ImportCollector {
private AnnotationVisitor visitExportPackage() {
return new AnnotationVisitor(Opcodes.ASM7) {
- private int major = defaultVersionValue("major");
- private int minor = defaultVersionValue("minor");
- private int micro = defaultVersionValue("micro");
+ private int major = defaultExportPackageVersion.map(ArtifactVersion::getMajorVersion)
+ .orElse(defaultVersionValue("major"));
+ private int minor = defaultExportPackageVersion.map(ArtifactVersion::getMinorVersion)
+ .orElse(defaultVersionValue("minor"));
+ private int micro = defaultExportPackageVersion.map(ArtifactVersion::getIncrementalVersion)
+ .orElse(defaultVersionValue("micro"));
+
+ // Default qualifier is the empty string.
private String qualifier = defaultVersionValue("qualifier");
@Override
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 c23e55a9eec..11a82ab7443 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
@@ -14,6 +14,8 @@ import com.yahoo.container.plugin.osgi.ImportPackages.Import;
import com.yahoo.container.plugin.util.Strings;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
@@ -44,8 +46,7 @@ import static com.yahoo.container.plugin.osgi.ExportPackages.exportsByPackageNam
import static com.yahoo.container.plugin.osgi.ImportPackages.calculateImports;
import static com.yahoo.container.plugin.util.Files.allDescendantFiles;
import static com.yahoo.container.plugin.util.IO.withFileOutputStream;
-import static com.yahoo.container.plugin.util.JarFiles.withInputStream;
-import static com.yahoo.container.plugin.util.JarFiles.withJarFile;
+
/**
* @author Tony Vaagenes
@@ -57,6 +58,15 @@ public class GenerateOsgiManifestMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}")
private MavenProject project = null;
+ /**
+ * If set to true, the artifact's version is used as default package version for ExportPackages.
+ * Packages from included (compile scoped) artifacts will use the version for their own artifact.
+ * If the package is exported with an explicit version in package-info.java, that version will be
+ * used regardless of this parameter.
+ */
+ @Parameter(alias = "UseArtifactVersionForExportPackages", defaultValue = "false")
+ private boolean useArtifactVersionForExportPackages;
+
@Parameter
private String discApplicationClass = null;
@@ -215,8 +225,11 @@ public class GenerateOsgiManifestMojo extends AbstractMojo {
Map<String, Optional<String>> manualImports, Collection<Import> imports, PackageTally pluginPackageTally) {
Map<String, String> ret = new HashMap<>();
String importPackage = Stream.concat(manualImports.entrySet().stream().map(e -> asOsgiImport(e.getKey(), e.getValue())),
- imports.stream().map(Import::asOsgiImport)).sorted().collect(Collectors.joining(","));
- String exportPackage = osgiExportPackages(pluginPackageTally.exportedPackages()).stream().sorted().collect(Collectors.joining(","));
+ imports.stream().map(Import::asOsgiImport)).sorted()
+ .collect(Collectors.joining(","));
+
+ String exportPackage = osgiExportPackages(pluginPackageTally.exportedPackages()).stream().sorted()
+ .collect(Collectors.joining(","));
for (Pair<String, String> element : Arrays.asList(//
Pair.of("Created-By", "vespa container maven plugin"), //
@@ -301,34 +314,47 @@ public class GenerateOsgiManifestMojo extends AbstractMojo {
artifact.getId(), artifact.getType())));
}
+ private ArtifactVersion artifactVersionOrNull(String version) {
+ return useArtifactVersionForExportPackages ? new DefaultArtifactVersion(version) : null;
+ }
+
private PackageTally getProjectClassesTally() {
File outputDirectory = new File(project.getBuild().getOutputDirectory());
- List<ClassFileMetaData> analyzedClasses = allDescendantFiles(outputDirectory).filter(file -> file.getName().endsWith(".class"))
- .map(Analyze::analyzeClass).collect(Collectors.toList());
+ List<ClassFileMetaData> analyzedClasses = allDescendantFiles(outputDirectory)
+ .filter(file -> file.getName().endsWith(".class"))
+ .map(classFile -> Analyze.analyzeClass(classFile, artifactVersionOrNull(bundleVersion)))
+ .collect(Collectors.toList());
return PackageTally.fromAnalyzedClassFiles(analyzedClasses);
}
- private static PackageTally definedPackages(Collection<Artifact> jarArtifacts) {
- return PackageTally.combine(jarArtifacts.stream().map(ja -> withJarFile(ja.getFile(), GenerateOsgiManifestMojo::definedPackages))
- .collect(Collectors.toList()));
+ private PackageTally definedPackages(Collection<Artifact> jarArtifacts) {
+ List<PackageTally> tallies = new ArrayList<>();
+ for (var artifact : jarArtifacts) {
+ try {
+ tallies.add(definedPackages(new JarFile(artifact.getFile()), artifactVersionOrNull(artifact.getVersion())));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return PackageTally.combine(tallies);
}
- private static PackageTally definedPackages(JarFile jarFile) throws MojoExecutionException {
+ private static PackageTally definedPackages(JarFile jarFile, ArtifactVersion version) throws MojoExecutionException {
List<ClassFileMetaData> analyzedClasses = new ArrayList<>();
for (Enumeration<JarEntry> entries = jarFile.entries(); entries.hasMoreElements();) {
JarEntry entry = entries.nextElement();
if (! entry.isDirectory() && entry.getName().endsWith(".class")) {
- analyzedClasses.add(analyzeClass(jarFile, entry));
+ analyzedClasses.add(analyzeClass(jarFile, entry, version));
}
}
return PackageTally.fromAnalyzedClassFiles(analyzedClasses);
}
- private static ClassFileMetaData analyzeClass(JarFile jarFile, JarEntry entry) throws MojoExecutionException {
+ private static ClassFileMetaData analyzeClass(JarFile jarFile, JarEntry entry, ArtifactVersion version) throws MojoExecutionException {
try {
- return withInputStream(jarFile, entry, Analyze::analyzeClass);
+ return Analyze.analyzeClass(jarFile.getInputStream(entry), version);
} catch (Exception e) {
throw new MojoExecutionException(
String.format("While analyzing the class '%s' in jar file '%s'", entry.getName(), jarFile.getName()), e);
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java
index a1e313b920b..654fb700a43 100644
--- a/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java
+++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/util/IO.java
@@ -13,13 +13,6 @@ import java.io.OutputStream;
* @author ollivir
*/
public class IO {
- public static <T> T withFileInputStream(File file, ThrowingFunction<FileInputStream, T> f) {
- try (FileInputStream fis = new FileInputStream(file)) {
- return f.apply(fis);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
/**
* Creates a new file and all its parent directories, and provides a file output stream to the file.