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) -> {