39 import java.io.OutputStreamWriter;
40 import java.io.UncheckedIOException;
41 import java.io.Writer;
42 import java.lang.module.ModuleDescriptor;
43 import java.nio.charset.StandardCharsets;
44 import java.nio.file.Files;
45 import java.nio.file.Path;
46 import java.nio.file.StandardOpenOption;
47 import java.nio.file.attribute.PosixFileAttributeView;
48 import java.nio.file.attribute.PosixFilePermission;
49 import java.util.ArrayList;
50 import java.util.Collections;
51 import java.util.HashSet;
52 import java.util.List;
53 import java.util.Map;
54 import java.util.Objects;
55 import java.util.Optional;
56 import java.util.Properties;
57 import java.util.Set;
58 import jdk.tools.jlink.internal.BasicImageWriter;
59 import jdk.tools.jlink.internal.plugins.FileCopierPlugin;
60 import jdk.tools.jlink.internal.plugins.FileCopierPlugin.SymImageFile;
61 import jdk.tools.jlink.internal.ExecutableImage;
62 import jdk.tools.jlink.plugin.ResourcePool;
63 import jdk.tools.jlink.plugin.ResourcePoolEntry;
64 import jdk.tools.jlink.plugin.ResourcePoolModule;
65 import jdk.tools.jlink.plugin.PluginException;
66
67 /**
68 *
69 * Default Image Builder. This builder creates the default runtime image layout.
70 */
71 public final class DefaultImageBuilder implements ImageBuilder {
72
73 /**
74 * The default java executable Image.
75 */
76 static final class DefaultExecutableImage implements ExecutableImage {
77
78 private final Path home;
79 private final List<String> args;
167 i++;
168 }
169 props.setProperty("MODULES", builder.toString());
170 }
171
172 @Override
173 public void storeFiles(ResourcePool files) {
174 try {
175 files.entries().forEach(f -> {
176 if (!f.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) {
177 try {
178 accept(f);
179 } catch (IOException ioExp) {
180 throw new UncheckedIOException(ioExp);
181 }
182 }
183 });
184 files.moduleView().modules().forEach(m -> {
185 // Only add modules that contain packages
186 if (!m.packages().isEmpty()) {
187 // Skip the fake module used by FileCopierPlugin when copying files.
188 if (m.name().equals(FileCopierPlugin.FAKE_MODULE)) {
189 return;
190 }
191 modules.add(m.name());
192 }
193 });
194 storeFiles(modules, releaseProperties(files));
195
196 if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) {
197 // launchers in the bin directory need execute permission
198 Path bin = root.resolve("bin");
199 if (Files.isDirectory(bin)) {
200 Files.list(bin)
201 .filter(f -> !f.toString().endsWith(".diz"))
202 .filter(f -> Files.isRegularFile(f))
203 .forEach(this::setExecutable);
204 }
205
206 // jspawnhelper is in lib or lib/<arch>
207 Path lib = root.resolve("lib");
208 if (Files.isDirectory(lib)) {
209 Files.find(lib, 2, (path, attrs) -> {
210 return path.getFileName().toString().equals("jspawnhelper")
|
39 import java.io.OutputStreamWriter;
40 import java.io.UncheckedIOException;
41 import java.io.Writer;
42 import java.lang.module.ModuleDescriptor;
43 import java.nio.charset.StandardCharsets;
44 import java.nio.file.Files;
45 import java.nio.file.Path;
46 import java.nio.file.StandardOpenOption;
47 import java.nio.file.attribute.PosixFileAttributeView;
48 import java.nio.file.attribute.PosixFilePermission;
49 import java.util.ArrayList;
50 import java.util.Collections;
51 import java.util.HashSet;
52 import java.util.List;
53 import java.util.Map;
54 import java.util.Objects;
55 import java.util.Optional;
56 import java.util.Properties;
57 import java.util.Set;
58 import jdk.tools.jlink.internal.BasicImageWriter;
59 import jdk.tools.jlink.internal.plugins.FileCopierPlugin.SymImageFile;
60 import jdk.tools.jlink.internal.ExecutableImage;
61 import jdk.tools.jlink.plugin.ResourcePool;
62 import jdk.tools.jlink.plugin.ResourcePoolEntry;
63 import jdk.tools.jlink.plugin.ResourcePoolModule;
64 import jdk.tools.jlink.plugin.PluginException;
65
66 /**
67 *
68 * Default Image Builder. This builder creates the default runtime image layout.
69 */
70 public final class DefaultImageBuilder implements ImageBuilder {
71
72 /**
73 * The default java executable Image.
74 */
75 static final class DefaultExecutableImage implements ExecutableImage {
76
77 private final Path home;
78 private final List<String> args;
166 i++;
167 }
168 props.setProperty("MODULES", builder.toString());
169 }
170
171 @Override
172 public void storeFiles(ResourcePool files) {
173 try {
174 files.entries().forEach(f -> {
175 if (!f.type().equals(ResourcePoolEntry.Type.CLASS_OR_RESOURCE)) {
176 try {
177 accept(f);
178 } catch (IOException ioExp) {
179 throw new UncheckedIOException(ioExp);
180 }
181 }
182 });
183 files.moduleView().modules().forEach(m -> {
184 // Only add modules that contain packages
185 if (!m.packages().isEmpty()) {
186 modules.add(m.name());
187 }
188 });
189 storeFiles(modules, releaseProperties(files));
190
191 if (Files.getFileStore(root).supportsFileAttributeView(PosixFileAttributeView.class)) {
192 // launchers in the bin directory need execute permission
193 Path bin = root.resolve("bin");
194 if (Files.isDirectory(bin)) {
195 Files.list(bin)
196 .filter(f -> !f.toString().endsWith(".diz"))
197 .filter(f -> Files.isRegularFile(f))
198 .forEach(this::setExecutable);
199 }
200
201 // jspawnhelper is in lib or lib/<arch>
202 Path lib = root.resolve("lib");
203 if (Files.isDirectory(lib)) {
204 Files.find(lib, 2, (path, attrs) -> {
205 return path.getFileName().toString().equals("jspawnhelper")
|