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;
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;
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"), //
/** 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).
* 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.).
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;
// 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 {
/** 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
}
// 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;
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)");
// 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));
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":