allow to include current module in metadata builder even if not yet packaged
diff --git a/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/FatJar.java b/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/FatJar.java
index e7eb4b8..defcdfc 100644
--- a/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/FatJar.java
+++ b/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/FatJar.java
@@ -21,6 +21,11 @@
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
@@ -47,29 +52,55 @@
byte[] buffer = new byte[8192];
final Set<String> alreadyAdded = new HashSet<>();
configuration.jars.forEach(shadedJar -> {
- try (final JarInputStream inputStream = new JarInputStream(new BufferedInputStream(new FileInputStream(shadedJar)))) {
- metadataBuilder.onJar(shadedJar.getName(), inputStream);
+ if (shadedJar.isDirectory()) {
+ final Path root = shadedJar.toPath();
+ metadataBuilder.visitFolder(configuration.defaultArtifactName, root, new SimpleFileVisitor<Path>() {
- ZipEntry nextEntry;
- while ((nextEntry = inputStream.getNextEntry()) != null) {
- final String name = nextEntry.getName();
- if (!alreadyAdded.add(name)) {
- continue;
+ @Override
+ public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException {
+ outputStream.putNextEntry(new JarEntry(toPath(dir) + '/'));
+ outputStream.closeEntry();
+ return super.preVisitDirectory(dir, attrs);
}
- metadataBuilder.onFile(name);
- outputStream.putNextEntry(nextEntry);
- int count;
- while ((count = inputStream.read(buffer, 0, buffer.length)) >= 0) {
- if (count > 0) {
- outputStream.write(buffer, 0, count);
+
+ @Override
+ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
+ outputStream.putNextEntry(new JarEntry(toPath(file)));
+ Files.copy(file, outputStream);
+ outputStream.closeEntry();
+ return super.visitFile(file, attrs);
+ }
+
+ private String toPath(final Path file) {
+ return root.resolve(file).toString().replace("\\", "/");
+ }
+
+ });
+ } else {
+ try (final JarInputStream inputStream = new JarInputStream(new BufferedInputStream(new FileInputStream(shadedJar)))) {
+ metadataBuilder.onJar(shadedJar.getName(), inputStream.getManifest());
+
+ ZipEntry nextEntry;
+ while ((nextEntry = inputStream.getNextEntry()) != null) {
+ final String name = nextEntry.getName();
+ if (!alreadyAdded.add(name)) {
+ continue;
}
+ metadataBuilder.onFile(name);
+ outputStream.putNextEntry(nextEntry);
+ int count;
+ while ((count = inputStream.read(buffer, 0, buffer.length)) >= 0) {
+ if (count > 0) {
+ outputStream.write(buffer, 0, count);
+ }
+ }
+ outputStream.closeEntry();
}
- outputStream.closeEntry();
+ } catch (final IOException e) {
+ throw new IllegalStateException(e);
}
- } catch (final IOException e) {
- throw new IllegalStateException(e);
+ metadataBuilder.afterJar();
}
- metadataBuilder.afterJar();
});
outputStream.putNextEntry(new JarEntry("WINEGROWER-INF/"));
@@ -93,12 +124,14 @@
private final Collection<File> jars;
private final File output;
private final boolean skipIfNoActivator;
+ private final String defaultArtifactName;
public Configuration(final Collection<File> jars, final File output,
- final boolean skipIfNoActivator) {
+ final boolean skipIfNoActivator, final String defaultArtifactName) {
this.jars = jars;
this.output = output;
this.skipIfNoActivator = skipIfNoActivator;
+ this.defaultArtifactName = defaultArtifactName;
}
}
}
diff --git a/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/MetadataBuilder.java b/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/MetadataBuilder.java
index a4dfcb6..f02714b 100644
--- a/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/MetadataBuilder.java
+++ b/winegrower-extension/winegrower-build/winegrower-build-common/src/main/java/org/apache/winegrower/extension/build/common/MetadataBuilder.java
@@ -15,13 +15,19 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.nio.charset.StandardCharsets;
+import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitor;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
-import java.util.jar.JarInputStream;
import java.util.jar.Manifest;
public class MetadataBuilder {
@@ -44,8 +50,7 @@
return meta;
}
- public void onJar(final String jarName, final JarInputStream jarInputStream) {
- final Manifest manifest = jarInputStream.getManifest();
+ public void onJar(final String jarName, final Manifest manifest) {
if (skipIfNoActivator && (manifest == null || manifest.getMainAttributes().getValue("Bundle-Activator") == null)) {
return;
}
@@ -76,4 +81,52 @@
currentJar = null;
files = null;
}
+
+ public void visitFolder(final String projectArtifactName, final Path root, final FileVisitor<Path> visitor) {
+ final Path manifest = root.resolve("META-INF/MANIFEST.MF");
+ if (Files.exists(manifest)) {
+ try (final InputStream stream = Files.newInputStream(manifest)) {
+ onJar(projectArtifactName, new Manifest(stream));
+ } catch (final IOException e) {
+ throw new IllegalStateException(e);
+ }
+ } else {
+ onJar(projectArtifactName, null);
+ }
+ try {
+ Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException {
+ if ("META-INF/MANIFEST.MF".equals(root.relativize(file).toString())) {
+ return FileVisitResult.CONTINUE;
+ }
+ onVisit(file);
+ return visitor.visitFile(file, attrs);
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException {
+ onVisit(dir);
+ return visitor.postVisitDirectory(dir, exc);
+ }
+
+ @Override
+ public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+ return visitor.preVisitDirectory(dir, attrs);
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+ return visitor.visitFileFailed(file, exc);
+ }
+
+ private void onVisit(final Path path) {
+ onFile(root.relativize(path).toString());
+ }
+ });
+ afterJar();
+ } catch (final IOException e) {
+ throw new IllegalStateException(e);
+ }
+ }
}
diff --git a/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java b/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java
index 861bdeb..9f3b093 100644
--- a/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java
+++ b/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java
@@ -43,7 +43,8 @@
new FatJar(new FatJar.Configuration(
asList(junitApi, osgiCore),
output,
- false
+ false,
+ null
)).run();
assertTrue(output.exists());
final List<String> entries;
diff --git a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/BaseClasspathMojo.java b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/BaseClasspathMojo.java
index 162cc1c..cad3760 100644
--- a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/BaseClasspathMojo.java
+++ b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/BaseClasspathMojo.java
@@ -35,12 +35,25 @@
@Parameter(property = "winegrower.excludeArtifacts")
private Collection<String> excludeArtifacts;
+ @Parameter(defaultValue = "${project.build.outputDirectory}")
+ private File classes;
+
+ @Parameter(defaultValue = "${project.build.finalName}.${project.packaging}")
+ private String projectArtifactName;
+
@Parameter(defaultValue = "${project.build.directory}/${project.build.finalName}.${project.packaging}", property = "winegrower.buildArtifact")
private File buildArtifact;
@Parameter(defaultValue = "false", property = "winegrower.skipIfNoActivator")
protected boolean skipIfNoActivator;
+ public String getProjectArtifactName() {
+ if (projectArtifactName.endsWith(".bundle")) {
+ return projectArtifactName.substring(0, projectArtifactName.length() - "bundle".length()) + "jar";
+ }
+ return projectArtifactName;
+ }
+
protected Collection<File> collectJars() {
return Stream.concat(
project.getArtifacts().stream()
@@ -48,9 +61,17 @@
.filter(it -> excludeArtifacts == null ||
(!excludeArtifacts.contains(it.getArtifactId()) && !excludeArtifacts.contains(it.getGroupId() + ':' + it.getArtifactId())))
.map(Artifact::getFile),
- Stream.of(buildArtifact))
+ Stream.of(buildArtifact.exists() ? buildArtifact : classes)
+ .map(this::fixBundleExtension))
.filter(Objects::nonNull)
.filter(File::exists)
.collect(toList());
}
+
+ private File fixBundleExtension(final File file) {
+ if (!file.exists() && file.getName().endsWith(".bundle")) {
+ return new File(file.getParent(), file.getName().substring(0, file.getName().length() - "bundle".length()) + "jar");
+ }
+ return file;
+ }
}
diff --git a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/FatJarMojo.java b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/FatJarMojo.java
index bc32893..041f09e 100644
--- a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/FatJarMojo.java
+++ b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/FatJarMojo.java
@@ -39,7 +39,7 @@
@Override
public void execute() {
- new FatJar(new FatJar.Configuration(collectJars(), output, skipIfNoActivator)).run();
+ new FatJar(new FatJar.Configuration(collectJars(), output, skipIfNoActivator, getProjectArtifactName())).run();
if (attach) {
helper.attachArtifact(project, output, classifier);
}
diff --git a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/MetadataBuilderMojo.java b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/MetadataBuilderMojo.java
index fbddb45..521c001 100644
--- a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/MetadataBuilderMojo.java
+++ b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/MetadataBuilderMojo.java
@@ -22,6 +22,7 @@
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarInputStream;
@@ -44,21 +45,25 @@
final MetadataBuilder metadataBuilder = new MetadataBuilder(skipIfNoActivator);
final Set<String> alreadyAdded = new HashSet<>();
collectJars().forEach(jar -> {
- try (final JarInputStream inputStream = new JarInputStream(new BufferedInputStream(new FileInputStream(jar)))) {
- metadataBuilder.onJar(jar.getName(), inputStream);
+ if (jar.isDirectory()) {
+ metadataBuilder.visitFolder(getProjectArtifactName(), jar.toPath(), new SimpleFileVisitor<Path>() {});
+ } else {
+ try (final JarInputStream inputStream = new JarInputStream(new BufferedInputStream(new FileInputStream(jar)))) {
+ metadataBuilder.onJar(jar.getName(), inputStream.getManifest());
- ZipEntry nextEntry;
- while ((nextEntry = inputStream.getNextEntry()) != null) {
- final String name = nextEntry.getName();
- if (!alreadyAdded.add(name)) {
- continue;
+ ZipEntry nextEntry;
+ while ((nextEntry = inputStream.getNextEntry()) != null) {
+ final String name = nextEntry.getName();
+ if (!alreadyAdded.add(name)) {
+ continue;
+ }
+ metadataBuilder.onFile(name);
}
- metadataBuilder.onFile(name);
+ } catch (final IOException e) {
+ throw new IllegalStateException(e);
}
- } catch (final IOException e) {
- throw new IllegalStateException(e);
+ metadataBuilder.afterJar();
}
- metadataBuilder.afterJar();
});
metadataBuilder.getMetadata().forEach((key, value) -> {