@@ -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