< prev index next >
src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java
Print this page
*** 139,179 ****
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 {
- StringBuilder builder = new StringBuilder();
- int i = 0;
- for (String m : modules) {
- builder.append(m);
- if (i < modules.size() - 1) {
- builder.append(",");
}
! i++;
}
- props.setProperty("MODULES", quote(builder.toString()));
}
@Override
public void storeFiles(ResourcePool files) {
try {
! // populate release properties up-front. targetOsName
! // field is assigned from there and used elsewhere.
! Properties release = releaseProperties(files);
! Path bin = root.resolve("bin");
// check any duplicated resource files
Map<Path, Set<String>> duplicates = new HashMap<>();
files.entries()
.filter(f -> f.type() != ResourcePoolEntry.Type.CLASS_OR_RESOURCE)
.collect(groupingBy(this::entryToImagePath,
--- 139,183 ----
this.root = root;
this.mdir = root.resolve("lib");
Files.createDirectories(mdir);
}
! private void storeRelease(ResourcePool pool) throws IOException {
! Properties props = new Properties();
! Optional<ResourcePoolEntry> release = pool.findEntry("/java.base/release");
! if (release.isPresent()) {
! try (InputStream is = release.get().content()) {
! props.load(is);
}
}
! File r = new File(root.toFile(), "release");
! try (FileOutputStream fo = new FileOutputStream(r)) {
! props.store(fo, null);
}
}
@Override
public void storeFiles(ResourcePool files) {
try {
! // populate targetOsName field up-front because it's used elsewhere.
! Optional<ResourcePoolModule> javaBase = files.moduleView().findModule("java.base");
! javaBase.ifPresent(mod -> {
! // fill release information available from transformed "java.base" module!
! ModuleDescriptor desc = mod.descriptor();
! desc.osName().ifPresent(s -> {
! this.targetOsName = s;
! });
! });
+ if (this.targetOsName == null) {
+ throw new PluginException("TargetPlatform attribute is missing for java.base module");
+ }
+
+ // store 'release' file
+ storeRelease(files);
+
+ Path bin = root.resolve("bin");
// check any duplicated resource files
Map<Path, Set<String>> duplicates = new HashMap<>();
files.entries()
.filter(f -> f.type() != ResourcePoolEntry.Type.CLASS_OR_RESOURCE)
.collect(groupingBy(this::entryToImagePath,
*** 207,218 ****
if (!m.packages().isEmpty()) {
modules.add(m.name());
}
});
- storeFiles(modules, release);
-
if (root.getFileSystem().supportedFileAttributeViews()
.contains("posix")) {
// launchers in the bin directory need execute permission.
// On Windows, "bin" also subdirectories containing jvm.dll.
if (Files.isDirectory(bin)) {
--- 211,220 ----
*** 239,294 ****
} catch (IOException ex) {
throw new PluginException(ex);
}
}
- // Parse version string and return a string that includes only version part
- // leaving "pre", "build" information. See also: java.lang.Runtime.Version.
- private static String parseVersion(String str) {
- return Runtime.Version.parse(str).
- version().
- stream().
- map(Object::toString).
- collect(joining("."));
- }
-
- private static String quote(String str) {
- return "\"" + str + "\"";
- }
-
- 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", quote(s));
- this.targetOsName = s;
- });
- desc.osVersion().ifPresent(s -> props.setProperty("OS_VERSION", quote(s)));
- desc.osArch().ifPresent(s -> props.setProperty("OS_ARCH", quote(s)));
- desc.version().ifPresent(s -> props.setProperty("JAVA_VERSION",
- quote(parseVersion(s.toString()))));
- desc.version().ifPresent(s -> props.setProperty("JAVA_FULL_VERSION",
- quote(s.toString())));
- });
-
- if (this.targetOsName == null) {
- throw new PluginException("TargetPlatform attribute is missing for java.base module");
- }
-
- 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.
--- 241,250 ----
*** 559,569 ****
} catch (IOException ex) {
System.err.println("Can't read release file " + ex);
}
String mods = release.getProperty("MODULES");
if (mods != null) {
! String[] arr = mods.split(",");
for (String m : arr) {
modules.add(m.trim());
}
}
--- 515,525 ----
} catch (IOException ex) {
System.err.println("Can't read release file " + ex);
}
String mods = release.getProperty("MODULES");
if (mods != null) {
! String[] arr = mods.substring(1, mods.length() - 1).split(" ");
for (String m : arr) {
modules.add(m.trim());
}
}
< prev index next >