< prev index next >
src/jdk.jlink/share/classes/jdk/tools/jlink/builder/DefaultImageBuilder.java
Print this page
@@ -76,32 +76,27 @@
private final Path home;
private final List<String> args;
private final Set<String> modules;
- public DefaultExecutableImage(Path home, Set<String> modules) {
- this(home, modules, createArgs(home));
- }
-
- private DefaultExecutableImage(Path home, Set<String> modules,
- List<String> args) {
+ DefaultExecutableImage(Path home, Set<String> modules) {
Objects.requireNonNull(home);
- Objects.requireNonNull(args);
if (!Files.exists(home)) {
throw new IllegalArgumentException("Invalid image home");
}
this.home = home;
this.modules = Collections.unmodifiableSet(modules);
- this.args = Collections.unmodifiableList(args);
+ this.args = createArgs(home);
}
private static List<String> createArgs(Path home) {
Objects.requireNonNull(home);
List<String> javaArgs = new ArrayList<>();
- javaArgs.add(home.resolve("bin").
- resolve(getJavaProcessName()).toString());
- return javaArgs;
+ Path binDir = home.resolve("bin");
+ String java = Files.exists(binDir.resolve("java"))? "java" : "java.exe";
+ javaArgs.add(binDir.resolve(java).toString());
+ return Collections.unmodifiableList(javaArgs);
}
@Override
public Path getHome() {
return home;
@@ -128,10 +123,11 @@
}
private final Path root;
private final Path mdir;
private final Set<String> modules = new HashSet<>();
+ private String targetOsName;
/**
* Default image builder constructor.
*
* @param root The image root directory.
@@ -169,10 +165,14 @@
}
@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);
+
files.entries().forEach(f -> {
if (!f.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) {
try {
accept(f);
} catch (IOException ioExp) {
@@ -184,11 +184,12 @@
// Only add modules that contain packages
if (!m.packages().isEmpty()) {
modules.add(m.name());
}
});
- storeFiles(modules, releaseProperties(files));
+
+ storeFiles(modules, release);
if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) {
// launchers in the bin directory need execute permission
Path bin = root.resolve("bin");
if (Files.isDirectory(bin)) {
@@ -224,10 +225,15 @@
desc.osVersion().ifPresent(s -> props.setProperty("OS_VERSION", s));
desc.osArch().ifPresent(s -> props.setProperty("OS_ARCH", s));
props.setProperty("JAVA_VERSION", System.getProperty("java.version"));
});
+ this.targetOsName = props.getProperty("OS_NAME");
+ if (this.targetOsName == null) {
+ throw new RuntimeException("can't determine target OS from java.base descriptor");
+ }
+
Optional<ResourcePoolEntry> release = pool.findEntry("/java.base/release");
if (release.isPresent()) {
try (InputStream is = release.get().content()) {
props.load(is);
}
@@ -371,11 +377,11 @@
Objects.requireNonNull(target);
Files.createDirectories(Objects.requireNonNull(dstFile.getParent()));
Files.createLink(dstFile, target);
}
- private static String nativeDir(String filename) {
+ private String nativeDir(String filename) {
if (isWindows()) {
if (filename.endsWith(".dll") || filename.endsWith(".diz")
|| filename.endsWith(".pdb") || filename.endsWith(".map")) {
return "bin";
} else {
@@ -384,12 +390,12 @@
} else {
return "lib";
}
}
- private static boolean isWindows() {
- return System.getProperty("os.name").startsWith("Windows");
+ private boolean isWindows() {
+ return targetOsName.startsWith("Windows");
}
/**
* chmod ugo+x file
*/
@@ -450,16 +456,14 @@
}
});
}
}
- private static String getJavaProcessName() {
- return isWindows() ? "java.exe" : "java";
- }
-
public static ExecutableImage getExecutableImage(Path root) {
- if (Files.exists(root.resolve("bin").resolve(getJavaProcessName()))) {
+ Path binDir = root.resolve("bin");
+ if (Files.exists(binDir.resolve("java")) ||
+ Files.exists(binDir.resolve("java.exe"))) {
return new DefaultExecutableImage(root, retrieveModules(root));
}
return null;
}
< prev index next >