< prev index next >
src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java
Print this page
*** 32,41 ****
--- 32,42 ----
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
+ import java.io.UncheckedIOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UncheckedIOException;
import java.io.Writer;
import java.lang.module.ModuleDescriptor;
*** 58,67 ****
--- 59,69 ----
import jdk.tools.jlink.internal.plugins.FileCopierPlugin;
import jdk.tools.jlink.internal.plugins.FileCopierPlugin.SymImageFile;
import jdk.tools.jlink.internal.ExecutableImage;
import jdk.tools.jlink.plugin.ResourcePool;
import jdk.tools.jlink.plugin.ResourcePoolEntry;
+ import jdk.tools.jlink.plugin.ResourcePoolModule;
import jdk.tools.jlink.plugin.PluginException;
/**
*
* Default Image Builder. This builder creates the default runtime image layout.
*** 142,159 ****
this.root = root;
this.mdir = root.resolve("lib");
Files.createDirectories(mdir);
}
! private void storeFiles(Set<String> modules, Map<String, String> release) throws IOException {
if (release != null) {
! Properties props = new Properties();
! props.putAll(release);
! addModules(props, modules);
File r = new File(root.toFile(), "release");
try (FileOutputStream fo = new FileOutputStream(r)) {
! props.store(fo, null);
}
}
}
private void addModules(Properties props, Set<String> modules) throws IOException {
--- 144,159 ----
this.root = root;
this.mdir = root.resolve("lib");
Files.createDirectories(mdir);
}
! private void storeFiles(Set<String> modules, Properties release) throws IOException {
if (release != null) {
! addModules(release, modules);
File r = new File(root.toFile(), "release");
try (FileOutputStream fo = new FileOutputStream(r)) {
! release.store(fo, null);
}
}
}
private void addModules(Properties props, Set<String> modules) throws IOException {
*** 189,199 ****
return;
}
modules.add(m.name());
}
});
! storeFiles(modules, files.releaseProperties());
if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) {
// launchers in the bin directory need execute permission
Path bin = root.resolve("bin");
if (Files.isDirectory(bin)) {
--- 189,199 ----
return;
}
modules.add(m.name());
}
});
! storeFiles(modules, releaseProperties(files));
if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) {
// launchers in the bin directory need execute permission
Path bin = root.resolve("bin");
if (Files.isDirectory(bin)) {
*** 217,226 ****
--- 217,247 ----
} catch (IOException ex) {
throw new PluginException(ex);
}
}
+ private Properties releaseProperties(ResourcePool pool) throws IOException {
+ Properties props = new Properties();
+ Optional<ResourcePoolModule> javaBase = pool.moduleView().findModule("java.base");
+ javaBase.ifPresent(mod -> {
+ // fill release information available from transformed "java.base" module!
+ ModuleDescriptor desc = mod.descriptor();
+ desc.osName().ifPresent(s -> props.setProperty("OS_NAME", s));
+ desc.osVersion().ifPresent(s -> props.setProperty("OS_VERSION", s));
+ desc.osArch().ifPresent(s -> props.setProperty("OS_ARCH", s));
+ });
+
+ Optional<ResourcePoolEntry> release = pool.findEntry("/java.base/release");
+ if (release.isPresent()) {
+ try (InputStream is = release.get().content()) {
+ props.load(is);
+ }
+ }
+
+ return props;
+ }
+
/**
* Generates launcher scripts.
*
* @param imageContent The image content.
* @param modules The set of modules that the runtime image contains.
*** 315,324 ****
--- 336,347 ----
path.toFile().setExecutable(true);
break;
case CONFIG:
writeEntry(in, destFile("conf", filename));
break;
+ case TOP:
+ break;
case OTHER:
if (file instanceof SymImageFile) {
SymImageFile sym = (SymImageFile) file;
Path target = root.resolve(sym.getTargetPath());
if (!Files.exists(target)) {
< prev index next >