JDK-8240571 : [macos] the working directory is unexpectedly set to the system root folder
  • Type: Bug
  • Component: tools
  • Sub-Component: jpackage
  • Affected Version: 14
  • Priority: P4
  • Status: Closed
  • Resolution: Not an Issue
  • OS: os_x
  • CPU: x86
  • Submitted: 2020-03-01
  • Updated: 2020-12-09
  • Resolved: 2020-03-24
Related Reports
Relates :  
Description
ADDITIONAL SYSTEM INFORMATION :
macOS Mojave 10.14.6, Compiling and jlinking with OpenJDK/OpenJFX 13.0.2. Packaging with the latest OpenJDK 14 EA.

A DESCRIPTION OF THE PROBLEM :
I tried to package a JavaFX application with the latest jpackage available on Java 14 EA. This generates a macOS application as expected but the working folder is set by default to "/" when I launch the application by double-clicking on the application root folder.
When I go inside the application folder and double-click on <app root>/Contents/MacOS/<app exec>, the working folder becomes "~/".

I would expect the application to be something like <app root>/Contents/app.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1. Create a OpenJDK 13 / Maven project with Netbeans 11.2 using the source code provided.
2. Compile this Maven project in order to get a dmg file.
3. Double-click on this dmg file and install the application in the Application folder.
4. Double-click on the installed application to launch it

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Launching the application should pop up a JavaFX window giving the current working folder.
The current working folder should be "/Application/<application name>/Contents/app"
ACTUAL -
The current working folder is "/"

---------- BEGIN SOURCE ----------
// App.java
package com.mycompany.mavenproject1;

import java.nio.file.Path;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 * JavaFX App
 */
public class App extends Application {

    @Override
    public void start(Stage stage) {
        var path = Path.of(".").toAbsolutePath();
        var label = new Label("Hello, JavaFX.\nWorking folder: " + path.toString());
        var scene = new Scene(new StackPane(label), 640, 480);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}

// pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mycompany</groupId>
    <artifactId>mavenproject1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <jpackage.home>${java.home}/../../../jdk-14.jdk/Contents/Home</jpackage.home>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <release>11</release>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <id>copy-libs</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/modules</outputDirectory>
                            <includeScope>runtime</includeScope>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.coderplus.maven.plugins</groupId>
                <artifactId>copy-rename-maven-plugin</artifactId>
                <version>1.0.1</version>
                <executions>
                    <execution>
                        <id>copy-target</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <sourceFile>${project.build.directory}/${project.build.finalName}.jar</sourceFile>
                            <destinationFile>${project.build.directory}/modules/${project.build.finalName}.jar</destinationFile>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.moditect</groupId>
                <artifactId>moditect-maven-plugin</artifactId>
                <version>1.0.0.Beta2</version>
                <executions>
                    <execution>
                        <id>create-runtime-image</id>
                        <phase>package</phase>
                        <goals>
                            <goal>create-runtime-image</goal>
                        </goals>
                        <configuration>
                            <modulePath>
                                <path>${project.build.directory}/modules</path>
                            </modulePath>
                            <modules>
                                <module>com.mycompany.mavenproject1</module>
                            </modules>
                            <stripDebug>true</stripDebug>
                            <compression>2</compression>
                            <no-header-files>true</no-header-files>
                            <no-man-pages>true</no-man-pages>
                            <ignoreSigningInformation>true</ignoreSigningInformation>
                            <jdepsExtraArgs>
                                <args>-strip-native-commands</args>
                                <arg>-multi-release</arg>
                                <arg>9</arg>
                            </jdepsExtraArgs>
                            <outputDirectory>${project.build.directory}/jlink</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.6.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <executable>${java.home}/bin/java</executable>
                            <arguments>
                                <argument>--module-path</argument>
                                <argument>${project.build.directory}/modules</argument>
                                <argument>--module</argument>
                                <argument>com.mycompany.mavenproject1/com.mycompany.mavenproject1.App</argument>
                            </arguments>
                        </configuration>
                    </execution>
                    <execution>
                        <id>create-package</id>
                        <phase>package</phase>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                        <configuration>
                            <!-- compiling with OpenJDK 13 GA but packaging with OpenJDK 14 EA as 14 GA isn't available yet and 13 GA doesn't have javapackager.exe nor jpackage.exe -->
                            <!-- GA (General Availability) = final version, EA (Early Access) = beta version -->
                            <executable>${jpackage.home}/bin/jpackage</executable>
                            <workingDirectory>${project.build.directory}</workingDirectory>
                            <longModulepath>false</longModulepath>
                            <environmentVariables>
                                <JAVA_HOME>${jpackage.home}</JAVA_HOME>
                            </environmentVariables>
                            <arguments>
                                <argument>--app-version</argument>
                                <argument>${project.version}</argument>
                                <argument>--name</argument>
                                <argument>${project.name}</argument>
                                
                                <argument>--runtime-image</argument>
                                <argument>${project.build.directory}/jlink</argument>
                                
                                <argument>--module</argument>
                                <argument>com.mycompany.mavenproject1/com.mycompany.mavenproject1.App</argument>
                            </arguments>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
---------- END SOURCE ----------

FREQUENCY : always



Comments
Jpackage app launcher itself also does not do anything to set the working directory. This is the expected behavior.
24-03-2020

I can confirm that this is a behavior of jpackage, independent of JavaFX. The attached Swing application behaves the same way. As would a non-GUI console application. I do not believe that this is a bug, but is rather the expected behavior. I'll assign it to Andy to confirm.
10-03-2020

There is nothing in the JavaFX library that sets the working directory, so it seem likely that this is a jpackage issue. I will double-check this and then transfer it to tools/jpackage if this turns out to be the case.
05-03-2020