8136365: Provider "jrt" is not available after bootmodules.jimage recreation
Summary: META-INF content was lost during recreate.
Reviewed-by: jlaskey, sundar
--- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageFileCreator.java Mon Oct 05 08:16:11 2015 -0700
+++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageFileCreator.java Tue Oct 06 09:12:00 2015 +0200
@@ -261,6 +261,7 @@
Map<String, List<Entry>> entriesForModule,
ByteOrder byteOrder) throws IOException {
ResourcePoolImpl resources = new ResourcePoolImpl(byteOrder);
+ // Doesn't contain META-INF
Set<String> mods = modulePackagesMap.keySet();
for (String mn : mods) {
for (Entry entry : entriesForModule.get(mn)) {
@@ -286,6 +287,31 @@
Archive archive = nameToArchive.get(mn);
archive.close();
}
+ // Fix for 8136365. Do we have an archive with module name "META-INF"?
+ // If yes, we are recreating a jimage.
+ // This is a workaround for META-INF being at the top level of resource path
+ String mn = "META-INF";
+ Archive archive = nameToArchive.get(mn);
+ if (archive != null) {
+ try {
+ for (Entry entry : entriesForModule.get(mn)) {
+ String path = entry.name();
+ try (InputStream stream = entry.stream()) {
+ byte[] bytes = readAllBytes(stream);
+ path = mn + "/" + path;
+ try {
+ resources.addResource(new ResourcePool.Resource(path,
+ ByteBuffer.wrap(bytes)));
+ } catch (Exception ex) {
+ throw new IOException(ex);
+ }
+ }
+ }
+ } finally {
+ // Done with this archive, close it.
+ archive.close();
+ }
+ }
return resources;
}