]> git.argeo.org Git - cc0/argeo-build.git/blobdiff - src/org/argeo/build/Repackage.java
Make sure there is at least Automatic-Module-Name
[cc0/argeo-build.git] / src / org / argeo / build / Repackage.java
index f93776bca8dbdde16ecae61960b7531f7ad0da37..02158ad147231f3a5e7e552d8549e2c31416e3c2 100644 (file)
@@ -9,7 +9,7 @@ import static java.nio.file.FileVisitResult.CONTINUE;
 import static java.nio.file.StandardOpenOption.APPEND;
 import static java.nio.file.StandardOpenOption.CREATE;
 import static java.util.jar.Attributes.Name.MANIFEST_VERSION;
-import static org.argeo.build.Repackage.ManifestHeader.ARGEO_DO_NOT_MODIFY;
+import static org.argeo.build.Repackage.ManifestHeader.ARGEO_ORIGIN_DO_NOT_MODIFY;
 import static org.argeo.build.Repackage.ManifestHeader.ARGEO_ORIGIN_M2;
 import static org.argeo.build.Repackage.ManifestHeader.ARGEO_ORIGIN_M2_MERGE;
 import static org.argeo.build.Repackage.ManifestHeader.ARGEO_ORIGIN_M2_REPO;
@@ -23,6 +23,7 @@ import static org.argeo.build.Repackage.ManifestHeader.BUNDLE_VERSION;
 import static org.argeo.build.Repackage.ManifestHeader.ECLIPSE_SOURCE_BUNDLE;
 import static org.argeo.build.Repackage.ManifestHeader.EXPORT_PACKAGE;
 import static org.argeo.build.Repackage.ManifestHeader.IMPORT_PACKAGE;
+//import static org.argeo.build.Repackage.ManifestHeader.REQUIRE_BUNDLE;
 import static org.argeo.build.Repackage.ManifestHeader.SPDX_LICENSE_IDENTIFIER;
 
 import java.io.BufferedWriter;
@@ -148,8 +149,10 @@ public class Repackage {
                EXPORT_PACKAGE("Export-Package"), //
                /** OSGi imported packages list. */
                IMPORT_PACKAGE("Import-Package"), //
-               /** OSGi path to embedded jar. */
-               BUNDLE_CLASSPATH("Bundle-Classpath"), //
+//             /** OSGi required bundles. */
+//             REQUIRE_BUNDLE("Require-Bundle"), //
+//             /** OSGi path to embedded jar. */
+//             BUNDLE_CLASSPATH("Bundle-Classpath"), //
                // Java
                /** Java module name. */
                AUTOMATIC_MODULE_NAME("Automatic-Module-Name"), //
@@ -174,10 +177,12 @@ public class Repackage {
                /** Maven repository, if not the default one. */
                ARGEO_ORIGIN_M2_REPO("Argeo-Origin-M2-Repo"), //
                /**
-                * Do not perform BND analysis of the origin component. Typically Import_package
+                * Do not perform BND analysis of the origin component. Typically Import-Package
                 * and Export-Package will be kept untouched.
                 */
                ARGEO_ORIGIN_NO_METADATA_GENERATION("Argeo-Origin-NoMetadataGeneration"), //
+               /** Keep JPMS module-info */
+               ARGEO_ORIGIN_KEEP_MODULE_INFO("Argeo-Origin-KeepModuleInfo"), //
 //             /**
 //              * Embed the original jar without modifying it (may be required by some
 //              * proprietary licenses, such as JCR Day License).
@@ -187,7 +192,7 @@ public class Repackage {
                 * Do not modify original jar (may be required by some proprietary licenses,
                 * such as JCR Day License).
                 */
-               ARGEO_DO_NOT_MODIFY("Argeo-Origin-Do-Not-Modify"), //
+               ARGEO_ORIGIN_DO_NOT_MODIFY("Argeo-Origin-Do-Not-Modify"), //
                /**
                 * Origin (non-Maven) URI of the component. It may be anything (jar, archive,
                 * etc.).
@@ -373,7 +378,7 @@ public class Repackage {
                        Path downloaded = downloadMaven(fileProps, artifact);
 
                        boolean doNotModify = Boolean
-                                       .parseBoolean(fileProps.getOrDefault(ARGEO_DO_NOT_MODIFY.toString(), "false").toString());
+                                       .parseBoolean(fileProps.getOrDefault(ARGEO_ORIGIN_DO_NOT_MODIFY.toString(), "false").toString());
                        if (doNotModify) {
                                processNotModified(targetCategoryBase, downloaded, fileProps, artifact);
                                return;
@@ -467,8 +472,8 @@ public class Repackage {
                                // download
                                Path downloaded = downloadMaven(mergedProps, artifact);
 
-                               boolean doNotModify = Boolean
-                                               .parseBoolean(mergedProps.getOrDefault(ARGEO_DO_NOT_MODIFY.toString(), "false").toString());
+                               boolean doNotModify = Boolean.parseBoolean(
+                                               mergedProps.getOrDefault(ARGEO_ORIGIN_DO_NOT_MODIFY.toString(), "false").toString());
                                if (doNotModify) {
                                        processNotModified(targetCategoryBase, downloaded, mergedProps, artifact);
                                } else {
@@ -1015,8 +1020,10 @@ public class Repackage {
        /** Normalise a single (that is, non-merged) bundle. */
        Path processBundleJar(Path file, Path targetBase, Map<String, String> entries, A2Origin origin) throws IOException {
 //             boolean embed = Boolean.parseBoolean(entries.getOrDefault(ARGEO_ORIGIN_EMBED.toString(), "false").toString());
-               boolean doNotModify = Boolean
-                               .parseBoolean(entries.getOrDefault(ManifestHeader.ARGEO_DO_NOT_MODIFY.toString(), "false").toString());
+               boolean doNotModify = Boolean.parseBoolean(
+                               entries.getOrDefault(ManifestHeader.ARGEO_ORIGIN_DO_NOT_MODIFY.toString(), "false").toString());
+               boolean keepModuleInfo = Boolean.parseBoolean(
+                               entries.getOrDefault(ManifestHeader.ARGEO_ORIGIN_KEEP_MODULE_INFO.toString(), "false").toString());
                NameVersion nameVersion;
                Path bundleDir;
                // singleton
@@ -1075,7 +1082,7 @@ public class Repackage {
                        }
 
                        // force Java 9 module name
-                       entries.put(ManifestHeader.AUTOMATIC_MODULE_NAME.toString(), nameVersion.getName());
+                       entries.put(AUTOMATIC_MODULE_NAME.toString(), nameVersion.getName());
 
                        boolean isNative = false;
                        String os = null;
@@ -1099,8 +1106,12 @@ public class Repackage {
                                                continue entries;
                                        }
                                        if (entry.getName().endsWith("module-info.class")) { // skip Java 9 module info
-                                               origin.deleted.add("Java module information (module-info.class)");
-                                               continue entries;
+                                               if (keepModuleInfo) {
+                                                       entries.remove(AUTOMATIC_MODULE_NAME.toString());
+                                               } else {
+                                                       origin.deleted.add("Java module information (module-info.class)");
+                                                       continue entries;
+                                               }
                                        }
                                        if (entry.getName().startsWith("META-INF/versions/")) { // skip multi-version
                                                origin.deleted.add("additional Java versions (META-INF/versions)");
@@ -1128,7 +1139,7 @@ public class Repackage {
                                // native libraries
                                boolean removeDllFromJar = true;
                                if (isNative && (entry.getName().endsWith(".so") || entry.getName().endsWith(".dll")
-                                               || entry.getName().endsWith(".jnilib"))) {
+                                               || entry.getName().endsWith(".jnilib") || entry.getName().endsWith(".a"))) {
                                        Path categoryDir = bundleDir.getParent();
                                        boolean copyDll = false;
                                        Path targetDll = categoryDir.resolve(bundleDir.relativize(target));
@@ -1216,7 +1227,11 @@ public class Repackage {
                for (Iterator<Map.Entry<Object, Object>> manifestEntries = manifest.getMainAttributes().entrySet()
                                .iterator(); manifestEntries.hasNext();) {
                        Map.Entry<Object, Object> manifestEntry = manifestEntries.next();
-                       switch (manifestEntry.getKey().toString()) {
+                       String key = manifestEntry.getKey().toString();
+                       // TODO make it more generic
+//                     if (key.equals(REQUIRE_BUNDLE.toString()) && nameVersion.getName().equals("com.sun.jna.platform"))
+//                             manifestEntries.remove();
+                       switch (key) {
                        case "Archiver-Version":
                        case "Build-By":
                        case "Created-By":