我如何使用 launch4j 包装一个也提供命令行界面的 GUI 应用程序?
How can I use launch4j to wrap a GUI application that also provides a command line interface?
我正在开发一个Java应用程序,它主要是一个GUI应用程序。但是,它也提供命令行界面。我可以将命令行参数分为三种不同的类型:
- 第一种参数改变了 GUI 的行为。
- 第二种以特定状态启动 GUI。
- 第三种类型导致应用程序直接执行操作而不显示 GUI。
当我使用 java -jar <application-name>.jar -parameter
执行应用程序时,一切都按预期进行。应用程序执行它被要求做的事情。应用程序关闭或完成后,shell提示returns.
问题
当我使用 launch4j 从 jar 文件创建一个 windows 包装器时,这种行为发生了变化。 shell 提示总是立即 returns。因此,我仍然可以传递命令行参数,但无法通过终端与应用程序交互。它不会打印写入 stdout 或 stderr 的任何内容,也无法从 stdin 读取任何内容。
问题
我如何配置 launch4j 来创建一个 exe 包装器,它提供与包装的 jar 文件相同的命令行行为?
附加信息
我使用具有以下配置的 launch4j maven 插件:
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.7.8</version>
<executions>
<execution>
<id>launch4j</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<stayAlive>true</stayAlive>
<outfile>path/to/outfile.exe</outfile>
<jar>path/to/infile.jar</jar>
<dontWrapJar>false</dontWrapJar>
<errTitle>Error in Launcher</errTitle>
<classPath>
<mainClass>com.example.Launch</mainClass>
<addDependencies>false</addDependencies>
</classPath>
<icon>path/to/icon.ico</icon>
<jre>
<minVersion>1.8.0</minVersion>
<initialHeapSize>512</initialHeapSize>
<maxHeapSize>1024</maxHeapSize>
</jre>
</configuration>
</execution>
</executions>
</plugin>
documentation of launch4j 表示,设置 headerType=gui
和 stayAlive=true
的给定组合将 等待应用程序关闭 ,这事实并非如此。
因为我没有可用的 windows 机器,所以我无法尝试设置 headerType=console
时会发生什么。文档说这会导致包装器 始终等待并 return 应用程序的退出代码 。但是,由于我的应用程序主要是一个 GUI 应用程序,我想知道这个设置是否有任何负面影响。在这一点上,我开始问自己为什么我希望包装的应用程序具有不同于 jar 文件的另一种命令行行为。
我终于弄到了一台 windows 机器,然后 运行 自己测试一下。
我通过替换这个解决了这个问题
<headerType>gui</headerType>
<stayAlive>true</stayAlive>
据此
<headerType>console</headerType>
根据文档 stayAlive=true
实际上是由 headerType=console
隐含的,因此我可以安全地将其从配置中删除。
我没有注意到这对 GUI 有任何副作用。唯一烦人的是,这会打开一个显示控制台输出的控制台。
所以,我想这个问题的预期解决方案是问题中描述的配置:headerType=gui
和 stayAlive=true
。但是,这不起作用。我认为这是 launch4j 中的错误。
我正在开发一个Java应用程序,它主要是一个GUI应用程序。但是,它也提供命令行界面。我可以将命令行参数分为三种不同的类型:
- 第一种参数改变了 GUI 的行为。
- 第二种以特定状态启动 GUI。
- 第三种类型导致应用程序直接执行操作而不显示 GUI。
当我使用 java -jar <application-name>.jar -parameter
执行应用程序时,一切都按预期进行。应用程序执行它被要求做的事情。应用程序关闭或完成后,shell提示returns.
问题
当我使用 launch4j 从 jar 文件创建一个 windows 包装器时,这种行为发生了变化。 shell 提示总是立即 returns。因此,我仍然可以传递命令行参数,但无法通过终端与应用程序交互。它不会打印写入 stdout 或 stderr 的任何内容,也无法从 stdin 读取任何内容。
问题
我如何配置 launch4j 来创建一个 exe 包装器,它提供与包装的 jar 文件相同的命令行行为?
附加信息
我使用具有以下配置的 launch4j maven 插件:
<plugin>
<groupId>com.akathist.maven.plugins.launch4j</groupId>
<artifactId>launch4j-maven-plugin</artifactId>
<version>1.7.8</version>
<executions>
<execution>
<id>launch4j</id>
<phase>package</phase>
<goals>
<goal>launch4j</goal>
</goals>
<configuration>
<headerType>gui</headerType>
<stayAlive>true</stayAlive>
<outfile>path/to/outfile.exe</outfile>
<jar>path/to/infile.jar</jar>
<dontWrapJar>false</dontWrapJar>
<errTitle>Error in Launcher</errTitle>
<classPath>
<mainClass>com.example.Launch</mainClass>
<addDependencies>false</addDependencies>
</classPath>
<icon>path/to/icon.ico</icon>
<jre>
<minVersion>1.8.0</minVersion>
<initialHeapSize>512</initialHeapSize>
<maxHeapSize>1024</maxHeapSize>
</jre>
</configuration>
</execution>
</executions>
</plugin>
documentation of launch4j 表示,设置 headerType=gui
和 stayAlive=true
的给定组合将 等待应用程序关闭 ,这事实并非如此。
因为我没有可用的 windows 机器,所以我无法尝试设置 headerType=console
时会发生什么。文档说这会导致包装器 始终等待并 return 应用程序的退出代码 。但是,由于我的应用程序主要是一个 GUI 应用程序,我想知道这个设置是否有任何负面影响。在这一点上,我开始问自己为什么我希望包装的应用程序具有不同于 jar 文件的另一种命令行行为。
我终于弄到了一台 windows 机器,然后 运行 自己测试一下。
我通过替换这个解决了这个问题
<headerType>gui</headerType>
<stayAlive>true</stayAlive>
据此
<headerType>console</headerType>
根据文档 stayAlive=true
实际上是由 headerType=console
隐含的,因此我可以安全地将其从配置中删除。
我没有注意到这对 GUI 有任何副作用。唯一烦人的是,这会打开一个显示控制台输出的控制台。
所以,我想这个问题的预期解决方案是问题中描述的配置:headerType=gui
和 stayAlive=true
。但是,这不起作用。我认为这是 launch4j 中的错误。