问题
With JPackage I am unable to get --win-console option to work apart for for the main launcher, but I want the main launcher not to output to console, but have a debug version that does.
i.e if I run
jpackage --add-launcher SongKongDebug=jpackage.properties @jpackage.txt
jpackage.txt
-i C:\Code\jthink\SongKong\target\songkong-6.10
--runtime-image C:\code\jthink\songkong\JVM64
--main-class com.jthink.songkong.cmdline.SongKong
--name SongKong
--win-dir-chooser
--main-jar lib\SongKong-6.10.jar
--app-version 6.10
--install-dir Jthink\SongKong
--copyright "Copyright 2020 JThink Ltd, United Kingdom"
--license-file C:\Code\jthink\SongKong\src\main\scripts\license.txt
--java-options "-Dhttps.protocols=TLSv1.1,TLSv1.2"
--java-options "--add-opens java.base/java.lang=ALL-UNNAMED"
--java-options "-XX:MaxRAMPercentage=75.0"
--java-options "-XX:MetaspaceSize=45 "
--java-options "-Dcom.mchange.v2.log.MLog=com.mchange.v2.log.jdk14logging.Jdk14MLog"
--java-options "-Dorg.jboss.logging.provider=jdk"
--java-options "-Djava.util.logging.config.class=com.jthink.songkong.logging.StandardLogging"
--vendor JThink
--win-menu
--win-shortcut
--win-menu-group Jthink
jpackage.properties
win-console=--win-console
then both SongKong and SongKongDebug run without console
I also tried modifying jpackage.properties (whicch is meant to be name/value pairs) to
--win-console
and it still didnt work
Whereas if I add
--win-console
to jpackage.txt and
win-console
to jpackage.properties
then SongKong will run as console, and SongKongDebug will not, but is wrong way round for me.
If I rename SongKong to SongKongDebug and SongKongDebug to SongKong
e.g
jpackage --add-launcher SongKong=jpackage.properties @jpackage.txt
and modify
set --name SongKongDebug
in jpackage.txt
then it works but now when install SongKong it says installing SongKongDebug which is wrong.
I have tried both current Java 14 release and early access java 15 and 16 releases but makes no difference.
I found this bug reported, but then user closed it as no problem https://bugs.openjdk.java.net/browse/JDK-8213717 and I find the jpackage help a bit confusing so I wonder if I am doing this the wrong way.
The help says
Options for creating the application launcher(s):
--add-launcher launcher name=file path
Name of launcher, and a path to a Properties file that contains a list of key, value pairs (absolute path or relative to the current
directory).
The keys "module", "add-modules", "main-jar", "main-class", "arguments", "java-options", "app-version", "icon", and "win-console"
can be used.
These options are added to, or used to overwrite, the original command line options to build an additional alternative launcher. The
main application launcher will be built from the command line options. Additional alternative launchers can be built using this option, and this option can be used multiple times to build multiple additional launchers. --arguments main class arguments
Command line arguments to pass to the main class if no command line arguments are given to the launcher. This option can be used multiple times.
--java-options java options
Options to pass to the Java runtime. This option can be used multiple times.
--main-class class name
Qualified name of the application main class to execute. This option can only be used if --main-jar is specified.
--main-jar main jar file
The main JAR of the application; containing the main class (specified as a path relative to the input path). Either --module or --main-jar option can be specified but not both.
--module or -m module name/main class]
The main module (and optionally main class) of the application This module must be located on the module path. When this option is specified, the main module will be linked in the Java runtime image. Either --module or --main-jar option can be
specified but not both.
So yo can create addtional launcher with the --add-launcher and use a properties file, but it also makes it sounds yo can can pass extra arguments as additional comand line options, but how could that be as it would not be clear which launcher they refer to ?
回答1:
Hopefully someone else can provide a full answer, but I don't think you can do what you want in current JDK14 (and 15 by the look of your observations). The rules as far as I can see are:
- If you remove
--win-console
from jpackage.txt then NO EXE will have console. - If you add
--win-console
to jpackage.txt then each launcher.properties has win-console unless you addwin-console
which turns OFF console. - The
--name XYZ
parameter defines main EXE and the label seen when installing and "Apps & features"
Therefore you can't have "SongKong\SongKong.EXE" as a non-console app and "SongKong\SongKongDebug.exe" as console.
You can get close to what you want but with the limitations of having a new --name
plus a dummy -main-class
. That would mean something like jpackage.txt:
--win-console
--install-dir Jthink\\SongKong
--name "JThink - SongKong"
--add-launcher SongKong=SongKong.properties
--add-launcher SongKongDebug=SongKongDebug.properties
... and SongKong.properties contains this to switch off console:
win-console
The above gives you some console app "Jthink\SongKong\JThink - SongKong.exe" with a console, but you also get "Jthink\SongKong\SongKong.exe" and "Jthink\SongKong\SongKongDebug.exe" as you want - though not in the path you want.
You could of course set the --main-class
in jpackage.txt a simple class which runs the non-console main.exe a call to Runtime.getRuntime().exec("SongKong.exe")
passing on any command line arguments.
来源:https://stackoverflow.com/questions/62847475/with-jpackage-on-windows-is-it-possible-to-make-main-exe-not-run-as-console-bu