RFR: JDK-8248239: jpackage adds some arguments twice in case it is re-executed by JLI
Aleksei Voitylov
aleksei.voitylov at bell-sw.com
Wed Jun 24 15:48:46 UTC 2020
Hi,
There are systems that update LD_LIBRARY_PATH or directly return
JNI_TRUE in method RequiresSetenv(const char *jvmpath) from java_md.c
file to request re-execution of the current executable. This leads to
the fact that jpackage application adds some provided arguments twice.
Bug: https://bugs.openjdk.java.net/browse/JDK-8248239
Fix: http://cr.openjdk.java.net/~avoitylov/webrev.8248239.00/
The root cause of the issue is that jpackage application expects one
number of arguments but JLI reexecutes them with another number of
arguments.
For example, a jpackage application can be run with arguments:
./app/bin/app -Dparam2=Param2 B1 B2 B3
it adds arguments from the config file and calls JLI with arguments:
app/bin/app -classpath -Dparam1=Param1 -m com.hello/com.hello.Hello
-Dparam2=Param2 B1 B2 B3
JLI re-executes the app with new arguments so the app adds some
arguments one more time after the re-execution.
./app/bin/app -classpath -Dparam1=Param1 -m
com.hello/com.hello.Hello -classpath -Dparam1=Param1 -m
com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3
A step by step example that illustrates the issue:
Run jpackage to create an executable application:
jpackage --dest output --name app --type app-image --module-path
input-modules --module com.hello/com.hello.Hello --arguments "A1 A2 A3"
--verbose --java-options -Dparam1=Param1
Executable application with the app/lib/app/app.cfg config file is created:
---- app.cfg ----
[Application]
app.name=app
app.version=1.0
app.runtime=$ROOTDIR/lib/runtime
app.identifier=com.hello
app.classpath=
app.mainmodule=com.hello/com.hello.Hello
[JavaOptions]
java-options=-Dparam1=Param1
[ArgOptions]
arguments=A1
arguments=A2
arguments=A3
-----------
Run the application:
./output/app/bin/app -Dparam2=Param2 B1 B2 B3
Chain of JDK methods execution:
LinuxLauncher main()
args: 5 [./app/bin/app -Dparam2=Param2 B1 B2 B3 ]
AppLauncher createJvmLauncher()
args: 4 [-Dparam2=Param2 B1 B2 B3 ]
JvmLauncher.cpp Jvm::initFromConfigFile() - adds JavaOptions from app.cfg
args: 10 [app/bin/app -classpath -Dparam1=Param1 -m
com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3 ]
AppLauncher Jvm::launch() - JLI re-executes the app
LinuxLauncher main()
args: 10 [app/bin/app -classpath -Dparam1=Param1 -m
com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3 ]
AppLauncher createJvmLauncher()
args: 9 [-classpath -Dparam1=Param1 -m com.hello/com.hello.Hello
-Dparam2=Param2 B1 B2 B3 ]
JvmLauncher.cpp Jvm::initFromConfigFile() - adds JavaOptions from app.cfg
args: 15 [./app/bin/app -classpath -Dparam1=Param1 -m
com.hello/com.hello.Hello -classpath -Dparam1=Param1 -m
com.hello/com.hello.Hello -Dparam2=Param2 B1 B2 B3 ]
^^^
Some arguments like "-classpath -Dparam1=Param1 -m
com.hello/com.hello.Hello" are added twice.
Tested with test/jdk/tools/jpackage/share/jdk/jpackage with no
regressions on Linux, Windows, Mac. On systems affected, the tests now pass.
Thanks,
-Aleksei
More information about the core-libs-dev
mailing list