jreleaser / jreleaser

:rocket: Release projects quickly and easily with JReleaser
https://jreleaser.org
Apache License 2.0
944 stars 109 forks source link

[assemble] jpackage does not escape spaces in Maven plugin #1547

Closed theonejj closed 10 months ago

theonejj commented 10 months ago

Thanks for creating this amazing project!!

Task List

Steps to Reproduce

  1. Add spaces to either vendor or copyright or description in your POM
  2. Assemble with jpackage
  3. Will fail in jpackage

Expected Behaviour

Actual Behaviour

The jpackage step will fail without with a null pointer error

Environment Information

Please paste stacktraces from [out|build|target]/jreleaser/trace.log.

[INFO]      [jpackage] assembling app distribution
[DEBUG]     [jpackage] creating props for jpackage/app
[DEBUG]     [jpackage] filling git properties into props
[DEBUG]     [jpackage] filling assembler properties into props
[DEBUG]     [jpackage] jdk version is 17.0.9 /home/jjansen/Code/test-archtype/target/jdks/temurin17Linux/jdk-17.0.9+9
[DEBUG]     [jpackage] resolving templates for jpackage/app
[DEBUG]     [jpackage] resolving templates from classpath
[DEBUG]     [jpackage] resolving template from classpath for jpackage.jpackage
[DEBUG]     [jpackage] copying JARs to target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/files
[DEBUG]     [jpackage] copying test-archtype-0.0.1.jar
[DEBUG]     [jpackage] resolving resource from classpath for META-INF/jreleaser/icons/linux/duke.png
[DEBUG]     [jpackage] copying files from /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app-jlink/jlink/work-linux-x86_64/com.example.test.test-archtype-0.0.1-linux-x86_64 to /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/runtime-image
[INFO]      [jpackage] - packaging as deb
[DEBUG]     [jpackage] /home/jjansen/Work/test-archtype/target/jdks/temurin17Linux/jdk-17.0.9+9/bin/jpackage --type deb --dest /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage --input /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/files --name app --runtime-image /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/runtime-image --app-version 0.0.1 --vendor My Example Company --copyright 2023 My Example Company --description My test archtype Description --main-class com.example.test.App --main-jar test-archtype-0.0.1.jar --icon /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/app.png

I have only tested it using the maven plugin, if necessary I am happy to test other ways or give more info.

theonejj commented 10 months ago

quoting the values in the pom doesn't solve the issue

tail of mvn jreleaser:assemble -X ``` [INFO] [jpackage] assembling app distribution [DEBUG] [jpackage] creating props for jpackage/app [DEBUG] [jpackage] filling git properties into props [DEBUG] [jpackage] filling assembler properties into props [DEBUG] [jpackage] jdk version is 17.0.9 /home/jjansen/Work/test-archtype/target/jdks/temurin17Linux/jdk-17.0.9+9 [DEBUG] [jpackage] resolving templates for jpackage/app [DEBUG] [jpackage] resolving templates from classpath [DEBUG] [jpackage] resolving template from classpath for jpackage.jpackage [DEBUG] [jpackage] copying JARs to target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/files [DEBUG] [jpackage] copying test-archtype-0.0.1.jar [DEBUG] [jpackage] resolving resource from classpath for META-INF/jreleaser/icons/linux/duke.png [DEBUG] [jpackage] copying files from /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app-jlink/jlink/work-linux-x86_64/com.example.test.test-archtype-0.0.1-linux-x86_64 to /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/runtime-image [INFO] [jpackage] - packaging as deb [DEBUG] [jpackage] /home/jjansen/Work/test-archtype/target/jdks/temurin17Linux/jdk-17.0.9+9/bin/jpackage --type deb --dest /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage --input /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/files --name app --runtime-image /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/runtime-image --app-version 0.0.1 --vendor "My Example Company" --copyright "2023 My Example Company" --description "My test-archtype Description" --main-class com.example.test.App --main-jar test-archtype-0.0.1.jar --icon /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/app.png [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 38.137 s [INFO] Finished at: 2023-12-04T22:45:55+01:00 [INFO] ------------------------------------------------------------------------ [ERROR] Failed to execute goal org.jreleaser:jreleaser-maven-plugin:1.9.0:assemble (default-cli) on project test-archtype: Execution default-cli of goal org.jreleaser:jreleaser-maven-plugin:1.9.0:assemble failed.: NullPointerException -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.jreleaser:jreleaser-maven-plugin:1.9.0:assemble (default-cli) on project test-archtype: Execution default-cli of goal org.jreleaser:jreleaser-maven-plugin:1.9.0:assemble failed. at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:333) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174) at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75) at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162) at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283) at org.apache.maven.cli.MavenCli.main (MavenCli.java:206) at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103) at java.lang.reflect.Method.invoke (Method.java:580) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348) Caused by: org.apache.maven.plugin.PluginExecutionException: Execution default-cli of goal org.jreleaser:jreleaser-maven-plugin:1.9.0:assemble failed. at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:133) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174) at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75) at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162) at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283) at org.apache.maven.cli.MavenCli.main (MavenCli.java:206) at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103) at java.lang.reflect.Method.invoke (Method.java:580) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348) Caused by: java.lang.NullPointerException at java.util.concurrent.ConcurrentHashMap.putVal (ConcurrentHashMap.java:1011) at java.util.concurrent.ConcurrentHashMap.put (ConcurrentHashMap.java:1006) at java.util.Properties.put (Properties.java:1346) at org.jreleaser.model.internal.JReleaserContext.report (JReleaserContext.java:955) at org.jreleaser.workflow.WorkflowImpl.doExecute (WorkflowImpl.java:164) at org.jreleaser.workflow.WorkflowImpl.execute (WorkflowImpl.java:52) at org.jreleaser.maven.plugin.JReleaserAssembleMojo.doExecute (JReleaserAssembleMojo.java:73) at org.jreleaser.maven.plugin.AbstractJReleaserMojo.execute (AbstractJReleaserMojo.java:109) at org.jreleaser.maven.plugin.JReleaserAssembleMojo.execute (JReleaserAssembleMojo.java:34) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:126) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 (MojoExecutor.java:328) at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:316) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:212) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:174) at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:75) at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:162) at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39) at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:159) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:73) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:53) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) at org.apache.maven.cli.MavenCli.execute (MavenCli.java:906) at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:283) at org.apache.maven.cli.MavenCli.main (MavenCli.java:206) at jdk.internal.reflect.DirectMethodHandleAccessor.invoke (DirectMethodHandleAccessor.java:103) at java.lang.reflect.Method.invoke (Method.java:580) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:283) at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:226) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:407) at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:348) [ERROR] [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException [DEBUG] Shutting down adapter factory; available factories [file-lock, rwlock-local, semaphore-local, noop]; available name mappers [discriminating, file-gav, file-hgav, file-static, gav, static] [DEBUG] Shutting down 'file-lock' factory [DEBUG] Shutting down 'rwlock-local' factory [DEBUG] Shutting down 'semaphore-local' factory [DEBUG] Shutting down 'noop' factory ```

manualy packaging outside of maven does work

 /home/jjansen/Work/test-archtype/target/jdks/temurin17Linux/jdk-17.0.9+9/bin/jpackage --type deb --dest /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage --input /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/files --name app --runtime-image /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/runtime-image --app-version 0.0.1 --vendor "My Example Company" --copyright "2023 My Example Company" --description "My test-archtype Description" --main-class com.example.test.App --main-jar test-archtype-0.0.1.jar --icon /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/app.png
aalmiray commented 10 months ago

JReleaser invokes jpackage as an external process and thus creates a commandline that's passed to the underlying OS. I believe explicit quotes must be set on the command args.

aalmiray commented 10 months ago

Here's the location where the commandline is created https://github.com/jreleaser/jreleaser/blob/b2255dc3a41be0e1ee903591727e14b4b26c578d/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/JpackageAssemblerProcessor.java#L226

Which relies on a helper method named maybeQuote that's implemented in this way

https://github.com/jreleaser/jreleaser/blob/b2255dc3a41be0e1ee903591727e14b4b26c578d/core/jreleaser-engine/src/main/java/org/jreleaser/assemblers/AbstractAssemblerProcessor.java#L309

As a matter of fact calls to maybeQuote should be replaced with StringUtils.quote.

theonejj commented 10 months ago

Thanks the infomation @aalmiray,

I have an update, I just tried to package again, but I can not reproduce the issue anymore. I even tried to add leading spaces and "-" values but it does not break the build anymore

[INFO]     [jpackage] assembling app distribution
[DEBUG]    [jpackage] creating props for jpackage/app
[DEBUG]    [jpackage] filling git properties into props
[DEBUG]    [jpackage] filling assembler properties into props
[DEBUG]    [jpackage] jdk version is 17.0.9 /home/jjansen/Work/test-archtype/target/jdks/temurin17Linux/jdk-17.0.9+9
[DEBUG]    [jpackage] resolving templates for jpackage/app
[DEBUG]    [jpackage] resolving templates from classpath
[DEBUG]    [jpackage] resolving template from classpath for jpackage.jpackage
[DEBUG]    [jpackage] copying JARs to target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/files
[DEBUG]    [jpackage] copying test-archtype-0.0.2.jar
[DEBUG]    [jpackage] resolving resource from classpath for META-INF/jreleaser/icons/linux/duke.png
[DEBUG]    [jpackage] copying files from /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app-jlink/jlink/work-linux-x86_64/com.example.test.test-archtype-0.0.2-linux-x86_64 to /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/runtime-image
[INFO]     [jpackage] - packaging as deb
[DEBUG]    [jpackage] /home/jjansen/Work/test-archtype/target/jdks/temurin17Linux/jdk-17.0.9+9/bin/jpackage --type deb --dest /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage --input /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/files --name app --runtime-image /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/runtime-image --app-version 0.0.2 --vendor Example Company B.V. --copyright 2023 - My Example Company --description My test archtype Description --verbose --main-class com.example.test.App --main-jar test-archtype-0.0.2.jar --icon /home/jjansen/Work/test-archtype/target/jreleaser/assemble/app/jpackage/work-linux-x86_64/inputs/app.png

I am not sure what was happening before 😩

aalmiray commented 10 months ago

Quite strange as quotes may only be applied when running on Windows, not Linux. Will double check in any case.

theonejj commented 10 months ago

Strange indeed, I would have like to send you an example project. Feel free to close the issue. If I get the issue again I will let you know

aalmiray commented 10 months ago

It's OK. https://github.com/jreleaser/helloworld-java-jpackage may be used as a starter.

aalmiray commented 10 months ago

Cannot reproduce it either.