]> git.argeo.org Git - cc0/argeo-build.git/blobdiff - src/org/argeo/build/Make.java
Close directory stream
[cc0/argeo-build.git] / src / org / argeo / build / Make.java
index 2b6187bcd6d9912d570232e7c40dd0426f5ffa86..67246d527d3d17920579a2ec106e9d08de388225 100644 (file)
@@ -45,6 +45,7 @@ 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;
 
 /**
@@ -482,14 +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);
                }
@@ -506,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");
@@ -660,7 +677,7 @@ public class Make {
        Map<String, Path> listLegalFilesToInclude(Path bundleBase) throws IOException {
                Map<String, Path> toInclude = new HashMap<>();
                if (!noSdkLegal) {
-                       DirectoryStream<Path> sdkSrcLegal = Files.newDirectoryStream(sdkSrcBase, (p) -> {
+                       try (DirectoryStream<Path> sdkSrcLegal = Files.newDirectoryStream(sdkSrcBase, (p) -> {
                                String fileName = p.getFileName().toString();
                                return switch (fileName) {
                                case "NOTICE":
@@ -671,9 +688,10 @@ public class Make {
                                default:
                                        yield false;
                                };
-                       });
-                       for (Path p : sdkSrcLegal)
-                               toInclude.put(p.getFileName().toString(), p);
+                       });) {
+                               for (Path p : sdkSrcLegal)
+                                       toInclude.put(p.getFileName().toString(), p);
+                       }
                }
                for (Iterator<Map.Entry<String, Path>> entries = toInclude.entrySet().iterator(); entries.hasNext();) {
                        Map.Entry<String, Path> entry = entries.next();