]> git.argeo.org Git - cc0/argeo-build.git/blobdiff - src/org/argeo/build/Make.java
Keep Require-Capability headers
[cc0/argeo-build.git] / src / org / argeo / build / Make.java
index b0066ac99bdf7ca0295b1bef5aef8e04efe4e882..b1d96e2ee9c710d9d86d69f4645722d8c872a5a7 100644 (file)
@@ -45,6 +45,8 @@ import org.eclipse.jdt.core.compiler.CompilationProgress;
 
 import aQute.bnd.osgi.Analyzer;
 import aQute.bnd.osgi.Jar;
+import aQute.bnd.osgi.Resource;
+import aQute.bnd.plugin.jpms.JPMSModuleInfoPlugin;
 
 /**
  * Minimalistic OSGi compiler and packager, meant to be used as a single file
@@ -481,11 +483,18 @@ public class Make {
                if (!Files.exists(binP))
                        Files.createDirectories(binP);
                Manifest manifest;
+               Resource moduleInfoClass = null;
                try (Analyzer bndAnalyzer = new Analyzer()) {
                        bndAnalyzer.setProperties(properties);
                        Jar jar = new Jar(bundleSymbolicName, binP.toFile());
                        bndAnalyzer.setJar(jar);
                        manifest = bndAnalyzer.calcManifest();
+
+                       // JPMS module
+                       jar.setManifest(manifest);
+                       JPMSModuleInfoPlugin jpmsModuleInfoPlugin = new JPMSModuleInfoPlugin();
+                       jpmsModuleInfoPlugin.verify(bndAnalyzer);
+                       moduleInfoClass = bndAnalyzer.getJar().getResource("module-info.class");
                } catch (Exception e) {
                        throw new RuntimeException("Bnd analysis of " + compiled + " failed", e);
                }
@@ -502,6 +511,18 @@ public class Make {
                        manifest.write(out);
                }
 
+               // Write module-info.class
+               if (moduleInfoClass != null) {
+                       Path moduleInfoClassP = binP.resolve("module-info.class");
+                       Files.createDirectories(moduleInfoClassP.getParent());
+                       try (OutputStream out = Files.newOutputStream(moduleInfoClassP)) {
+                               moduleInfoClass.write(out);
+//                             logger.log(INFO, "Wrote " + moduleInfoClassP);
+                       } catch (Exception e) {
+                               throw new RuntimeException("Cannot write module-info.class");
+                       }
+               }
+
                // Load excludes
                List<PathMatcher> excludes = new ArrayList<>();
                Path excludesP = argeoBuildBase.resolve("excludes.txt");