Skip to content

Commit d15982e

Browse files
committed
Support 'app-image' as explicit target
1 parent 6fa2901 commit d15982e

File tree

1 file changed

+42
-27
lines changed
  • src/main/java/org/gradlex/javamodule/packaging/tasks

1 file changed

+42
-27
lines changed

src/main/java/org/gradlex/javamodule/packaging/tasks/Jpackage.java

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ abstract public class Jpackage extends DefaultTask {
125125
@OutputDirectory
126126
abstract public DirectoryProperty getDestination();
127127

128+
/**
129+
* To copy resources before adding them. This allows ressource filtering via Gradle
130+
* FileCollection and FileTree APIs.
131+
*/
128132
@Internal
129133
abstract public DirectoryProperty getTempDirectory();
130134

@@ -157,33 +161,30 @@ public void runJpackage() throws Exception {
157161
String executableName = WINDOWS.equals(os) ? "jpackage.exe" : "jpackage";
158162
String jpackage = getJavaInstallation().get().getInstallationPath().file("bin/" + executableName).getAsFile().getAbsolutePath();
159163

160-
Directory appImageParent = getTempDirectory().get().dir("app-image");
161-
File appImageFolder;
162-
if (getSingleStepPackaging().get()) {
163-
appImageFolder = appImageParent.dir(getName()).getAsFile();
164-
} else {
165-
performAppImageStep(jpackage, resourcesDir, appImageParent);
166-
appImageFolder = requireNonNull(appImageParent.getAsFile().listFiles())[0];
164+
File appContentTmpFolder = getTempDirectory().get().dir("app-content").getAsFile();
165+
166+
// build 'app-image' target if required (either needed for the next step or explicitly requested)
167+
if (!getSingleStepPackaging().get() || getPackageTypes().get().contains("app-image")) {
168+
performAppImageStep(jpackage, resourcesDir);
169+
File appImageFolder = appImageFolder();
170+
File appRootFolder;
171+
if (os.contains("macos")) {
172+
appRootFolder = new File(appImageFolder, "Contents");
173+
} else if (os.contains("windows")) {
174+
appRootFolder = appImageFolder;
175+
} else {
176+
appRootFolder = new File(appImageFolder, "lib");
177+
}
178+
copyAdditionalRessourcesToImageFolder(appRootFolder);
167179
}
168180

169-
File appRootFolder;
170-
if (os.contains("macos")) {
171-
appRootFolder = new File(appImageFolder, "Contents");
172-
} else if (os.contains("windows")) {
173-
appRootFolder = appImageFolder;
174-
} else {
175-
appRootFolder = new File(appImageFolder, "lib");
181+
if (getSingleStepPackaging().get()) {
182+
// an isolated folder which is later inserted via '--app-content' parameter
183+
copyAdditionalRessourcesToImageFolder(appContentTmpFolder);
176184
}
177185

178-
// copy additional resource into app-image folder
179-
getFiles().copy(c -> {
180-
c.into(appRootFolder);
181-
c.from(getTargetResources());
182-
c.from(getResources(), to -> to.into("app")); // 'app' is the folder Java loads resources from at runtime
183-
});
184-
185186
// package with additional resources
186-
getPackageTypes().get().forEach(packageType ->
187+
getPackageTypes().get().stream().filter(t -> !"app-image".equals(t)).forEach(packageType ->
187188
getExec().exec(e -> {
188189
e.commandLine(
189190
jpackage,
@@ -196,13 +197,13 @@ public void runJpackage() throws Exception {
196197
);
197198
if (getSingleStepPackaging().get()) {
198199
configureJPackageArguments(e, resourcesDir);
199-
if (appRootFolder.exists()) {
200-
for (File appContent : requireNonNull(appRootFolder.listFiles())) {
200+
if (appContentTmpFolder.exists()) {
201+
for (File appContent : requireNonNull(appContentTmpFolder.listFiles())) {
201202
e.args("--app-content", appContent.getPath());
202203
}
203204
}
204205
} else {
205-
e.args("--app-image", appImageFolder.getPath());
206+
e.args("--app-image", appImageFolder().getPath());
206207
}
207208
for (String option : getOptions().get()) {
208209
e.args(option);
@@ -213,14 +214,28 @@ public void runJpackage() throws Exception {
213214
generateChecksums();
214215
}
215216

216-
private void performAppImageStep(String jpackage, Directory resourcesDir, Directory appImageParent) {
217+
private File appImageFolder() {
218+
return Arrays.stream(requireNonNull(getDestination().get().getAsFile().listFiles()))
219+
.filter(File::isDirectory).findFirst().get();
220+
}
221+
222+
private void copyAdditionalRessourcesToImageFolder(File appRootFolder) {
223+
// copy additional resource into the app-image folder
224+
getFiles().copy(c -> {
225+
c.into(appRootFolder);
226+
c.from(getTargetResources());
227+
c.from(getResources(), to -> to.into("app")); // 'app' is the folder Java loads resources from at runtime
228+
});
229+
}
230+
231+
private void performAppImageStep(String jpackage, Directory resourcesDir) {
217232
getExec().exec(e -> {
218233
e.commandLine(
219234
jpackage,
220235
"--type",
221236
"app-image",
222237
"--dest",
223-
appImageParent.getAsFile().getPath()
238+
getDestination().get().getAsFile().getPath()
224239
);
225240
configureJPackageArguments(e, resourcesDir);
226241
});

0 commit comments

Comments
 (0)