< prev index next >

buildSrc/images/src/main/java/org/openjdk/skara/gradle/images/LinkTask.java

Print this page

 24 package org.openjdk.skara.gradle.images;
 25 
 26 import org.gradle.api.DefaultTask;
 27 import org.gradle.api.GradleException;
 28 import org.gradle.api.artifacts.UnknownConfigurationException;
 29 import org.gradle.api.model.ObjectFactory;
 30 import org.gradle.api.provider.*;
 31 import org.gradle.api.tasks.*;
 32 import org.gradle.jvm.tasks.Jar;
 33 import org.gradle.api.file.*;
 34 
 35 import javax.inject.Inject;
 36 import java.io.*;
 37 import java.net.URI;
 38 import java.nio.file.*;
 39 import java.util.*;
 40 import java.util.stream.Collectors;
 41 
 42 public class LinkTask extends DefaultTask {
 43     private final Property<String> os;

 44     private final Property<String> url;
 45     private final Property<Path> toDir;
 46     private final MapProperty<String, String> launchers;
 47     private final ListProperty<String> modules;
 48     private final SetProperty<RegularFile> modulePath;
 49     private final SetProperty<FileSystemLocation> runtimeModules;
 50 
 51     @Inject
 52     public LinkTask(ObjectFactory factory) {
 53         os = factory.property(String.class);

 54         url = factory.property(String.class);
 55         toDir = factory.property(Path.class);
 56         launchers = factory.mapProperty(String.class, String.class);
 57         modules = factory.listProperty(String.class);
 58         modulePath = factory.setProperty(RegularFile.class);
 59         runtimeModules = factory.setProperty(FileSystemLocation.class);
 60     }
 61 
 62     @OutputDirectory
 63     Property<Path> getToDir() {
 64         return toDir;
 65     }
 66 
 67     @Input
 68     Property<String> getOS() {
 69         return os;
 70     }
 71 





 72     @Input
 73     Property<String> getUrl() {
 74         return url;
 75     }
 76 
 77     @Input
 78     MapProperty<String, String> getLaunchers() {
 79         return launchers;
 80     }
 81 
 82     @Input
 83     ListProperty<String> getModules() {
 84         return modules;
 85     }
 86 
 87     @InputFiles
 88     SetProperty<RegularFile> getModulePath() {
 89         return modulePath;
 90     }
 91 

100                     .map(Path::toFile)
101                     .sorted(Comparator.reverseOrder())
102                     .forEach(File::delete);
103         } catch (IOException io) {
104             throw new RuntimeException(io);
105         }
106     }
107 
108     @TaskAction
109     void link() throws IOException {
110         var project = getProject().getRootProject();
111 
112         var modularJars = new ArrayList<String>();
113         for (var jar : modulePath.get()) {
114             modularJars.add(jar.getAsFile().toString());
115         }
116         for (var jar : runtimeModules.get()) {
117             modularJars.add(jar.getAsFile().toString());
118         }
119 
120         var filename = Path.of(URI.create(url.get()).getPath()).getFileName().toString();
121         var dirname = filename.replace(".zip", "").replace(".tar.gz", "");
122         var jdk = project.getRootDir().toPath().toAbsolutePath().resolve(".jdk").resolve(dirname);





123         var dirs = Files.walk(jdk)
124                         .filter(Files::isDirectory)
125                         .filter(p -> p.getFileName().toString().equals("jmods"))
126                         .collect(Collectors.toList());
127         if (dirs.size() != 1) {
128             var plural = dirs.size() == 0 ? "no" : "multiple";
129             throw new GradleException("JDK at " + jdk.toString() + " contains " + plural + " 'jmods' directories");
130         }
131         var jmodsDir = dirs.get(0).toAbsolutePath();
132 
133         var modulePath = new ArrayList<String>();
134         modulePath.add(jmodsDir.toString());
135         modulePath.addAll(modularJars);
136 
137         var uniqueModules = new HashSet<String>();
138         for (var entry : launchers.get().values()) {
139             var firstSlash = entry.indexOf('/');
140             uniqueModules.add(entry.substring(0, firstSlash));
141         }
142         uniqueModules.addAll(modules.get());
143         var allModules = new ArrayList<String>(uniqueModules);
144 
145         Files.createDirectories(toDir.get());
146         var dest = toDir.get().resolve(os.get());
147         if (Files.exists(dest) && Files.isDirectory(dest)) {
148             clearDirectory(dest);
149         }
150 
151         Collections.sort(modulePath);
152         Collections.sort(allModules);
153 
154         var jlink = Path.of(System.getProperty("java.home"), "bin", "jlink").toAbsolutePath().toString();
155         project.exec((spec) -> {
156             spec.setCommandLine(jlink, "--module-path", String.join(File.pathSeparator, modulePath),
157                                        "--add-modules", String.join(",", allModules),
158                                        "--no-man-pages",
159                                        "--no-header-files",
160                                        "--compress", "2",
161                                        "--vm", "server",
162                                        "--output", dest.toString());
163         });
164 
165         var currentOS = System.getProperty("os.name").toLowerCase().substring(0, 3);
166         if (currentOS.equals(os.get().substring(0, 3))) {
167             var ext = currentOS.startsWith("win") ? ".exe" : "";
168             var javaLaunchers = Files.walk(dest)
169                                      .filter(Files::isExecutable)
170                                      .filter(p -> p.getFileName().toString().equals("java" + ext))
171                                      .collect(Collectors.toList());
172             if (javaLaunchers.size() != 1) {
173                 throw new GradleException("Multiple or no java launchers generated for " + os.get() + " image");
174             }
175             var java = javaLaunchers.get(0);
176             project.exec((spec) -> {
177                 spec.setCommandLine(java, "-Xshare:dump", "-version");
178             });
179         }
180     }
181 }

 24 package org.openjdk.skara.gradle.images;
 25 
 26 import org.gradle.api.DefaultTask;
 27 import org.gradle.api.GradleException;
 28 import org.gradle.api.artifacts.UnknownConfigurationException;
 29 import org.gradle.api.model.ObjectFactory;
 30 import org.gradle.api.provider.*;
 31 import org.gradle.api.tasks.*;
 32 import org.gradle.jvm.tasks.Jar;
 33 import org.gradle.api.file.*;
 34 
 35 import javax.inject.Inject;
 36 import java.io.*;
 37 import java.net.URI;
 38 import java.nio.file.*;
 39 import java.util.*;
 40 import java.util.stream.Collectors;
 41 
 42 public class LinkTask extends DefaultTask {
 43     private final Property<String> os;
 44     private final Property<String> cpu;
 45     private final Property<String> url;
 46     private final Property<Path> toDir;
 47     private final MapProperty<String, String> launchers;
 48     private final ListProperty<String> modules;
 49     private final SetProperty<RegularFile> modulePath;
 50     private final SetProperty<FileSystemLocation> runtimeModules;
 51 
 52     @Inject
 53     public LinkTask(ObjectFactory factory) {
 54         os = factory.property(String.class);
 55         cpu = factory.property(String.class);
 56         url = factory.property(String.class);
 57         toDir = factory.property(Path.class);
 58         launchers = factory.mapProperty(String.class, String.class);
 59         modules = factory.listProperty(String.class);
 60         modulePath = factory.setProperty(RegularFile.class);
 61         runtimeModules = factory.setProperty(FileSystemLocation.class);
 62     }
 63 
 64     @OutputDirectory
 65     Property<Path> getToDir() {
 66         return toDir;
 67     }
 68 
 69     @Input
 70     Property<String> getOS() {
 71         return os;
 72     }
 73 
 74     @Input
 75     Property<String> getCPU() {
 76         return cpu;
 77     }
 78 
 79     @Input
 80     Property<String> getUrl() {
 81         return url;
 82     }
 83 
 84     @Input
 85     MapProperty<String, String> getLaunchers() {
 86         return launchers;
 87     }
 88 
 89     @Input
 90     ListProperty<String> getModules() {
 91         return modules;
 92     }
 93 
 94     @InputFiles
 95     SetProperty<RegularFile> getModulePath() {
 96         return modulePath;
 97     }
 98 

107                     .map(Path::toFile)
108                     .sorted(Comparator.reverseOrder())
109                     .forEach(File::delete);
110         } catch (IOException io) {
111             throw new RuntimeException(io);
112         }
113     }
114 
115     @TaskAction
116     void link() throws IOException {
117         var project = getProject().getRootProject();
118 
119         var modularJars = new ArrayList<String>();
120         for (var jar : modulePath.get()) {
121             modularJars.add(jar.getAsFile().toString());
122         }
123         for (var jar : runtimeModules.get()) {
124             modularJars.add(jar.getAsFile().toString());
125         }
126 
127         Path jdk = null;
128         if (!url.get().equals("local")) {
129             var filename = Path.of(URI.create(url.get()).getPath()).getFileName().toString();
130             var dirname = filename.replace(".zip", "").replace(".tar.gz", "");
131             jdk = project.getRootDir().toPath().toAbsolutePath().resolve(".jdk").resolve(dirname);
132         } else {
133             jdk = Path.of(System.getProperty("java.home"));
134         }
135         var dirs = Files.walk(jdk)
136                         .filter(Files::isDirectory)
137                         .filter(p -> p.getFileName().toString().equals("jmods"))
138                         .collect(Collectors.toList());
139         if (dirs.size() != 1) {
140             var plural = dirs.size() == 0 ? "no" : "multiple";
141             throw new GradleException("JDK at " + jdk.toString() + " contains " + plural + " 'jmods' directories");
142         }
143         var jmodsDir = dirs.get(0).toAbsolutePath();
144 
145         var modulePath = new ArrayList<String>();
146         modulePath.add(jmodsDir.toString());
147         modulePath.addAll(modularJars);
148 
149         var uniqueModules = new HashSet<String>();
150         for (var entry : launchers.get().values()) {
151             var firstSlash = entry.indexOf('/');
152             uniqueModules.add(entry.substring(0, firstSlash));
153         }
154         uniqueModules.addAll(modules.get());
155         var allModules = new ArrayList<String>(uniqueModules);
156 
157         Files.createDirectories(toDir.get());
158         var dest = toDir.get().resolve(os.get() + "-" + cpu.get());
159         if (Files.exists(dest) && Files.isDirectory(dest)) {
160             clearDirectory(dest);
161         }
162 
163         Collections.sort(modulePath);
164         Collections.sort(allModules);
165 
166         var jlink = Path.of(System.getProperty("java.home"), "bin", "jlink").toAbsolutePath().toString();
167         project.exec((spec) -> {
168             spec.setCommandLine(jlink, "--module-path", String.join(File.pathSeparator, modulePath),
169                                        "--add-modules", String.join(",", allModules),
170                                        "--no-man-pages",
171                                        "--no-header-files",
172                                        "--compress", "2",
173                                        "--vm", "server",
174                                        "--output", dest.toString());
175         });
176 
177         var currentOS = System.getProperty("os.name").toLowerCase().substring(0, 3);
178         if (os.get().equals("local") || currentOS.equals(os.get().substring(0, 3))) {
179             var ext = currentOS.startsWith("win") ? ".exe" : "";
180             var javaLaunchers = Files.walk(dest)
181                                      .filter(Files::isExecutable)
182                                      .filter(p -> p.getFileName().toString().equals("java" + ext))
183                                      .collect(Collectors.toList());
184             if (javaLaunchers.size() != 1) {
185                 throw new GradleException("Multiple or no java launchers generated for " + os.get() + "-" + cpu.get() + " image");
186             }
187             var java = javaLaunchers.get(0);
188             project.exec((spec) -> {
189                 spec.setCommandLine(java, "-Xshare:dump", "-version");
190             });
191         }
192     }
193 }
< prev index next >