【问题标题】:JavaFX jfx:native output exe does not run Java main classJavaFX jfx:native output exe 不运行 Java 主类
【发布时间】:2017-01-09 20:44:17
【问题描述】:

这是我的简单 JavaFX 应用程序,我可以使用 jfx:native 和 Maven 构建本机安装程序:

public class HelloWorld extends Application {
    public static void main(String... args){
        launch(args);
    }
    @Override
    public void start(Stage primaryStage) throws Exception {
        System.out.println("Hello world!");
    }
}

运行该 maven 构建时正在创建安装程序。

  • 即使运行由安装程序安装的 exe 文件,Main 类也无法执行的问题可能是什么原因(在这种情况下,“Hello Word!”未按预期显示在控制台中?
  • 可以通过什么方式调整下面的 maven 插件,以便在安装本机包时将 exe 添加到 PATH 中?

这是 JavaFX 的 POM 部分:

<plugin>
        <groupId>com.zenjava</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>8.7.0</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>native</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <mainClass>com.mycompany.HelloWorld</mainClass>
          <nativeInstallers/>
        </configuration>
      </plugin>

【问题讨论】:

  • 只是为了确定:您是从控制台启动可执行文件吗?否则甚至不应该有控制台。
  • 是的,从控制台调用exe,它运行但根本没有输出
  • 在这种情况下,JVM 的标准输出将是您启动 exe 的控制台,这一点并不明显。如果您打开一个简单的窗口,例如primaryStage.setScene(new Scene(new StackPane(),400,400));primaryStage.show();,你看到窗户了吗?
  • 嗯...它确实运行了。所以看起来 System.out.println 不适用于 JavaFX?实际上我正在尝试做一个 CLI(命令行界面)应用程序,所以命令行工作很重要。
  • 不清楚您要做什么。 JavaFX 是一个 GUI 工具包。为什么要在 GUI 应用程序中使用命令行界面?

标签: java maven javafx


【解决方案1】:

免责声明:我是 javafx-maven-plugin 的维护者!

我假设你在 Windows 上使用这个 maven-plugin,因为这是我对你的问题的期望。

首先:您不能调用“本机”包,因为它是作为 maven-lifecycle 运行的特殊设置。请将执行更改为:

<executions>
    <execution>
        <!-- required before build-native -->
        <id>create-jfxjar</id>
        <phase>package</phase>
        <goals>
            <goal>build-jar</goal>
        </goals>
    </execution>
    <execution>
        <id>create-native</id>
        <phase>package</phase>
        <goals>
            <goal>build-native</goal>
        </goals>
    </execution>
</executions>

其次:链接的 Windows 可执行文件不会调用javaw,也不会调用java。该 windows 可执行文件仅构建为 GUI 应用程序,这意味着从 CLI 调用 exe 文件不会在命令行上打印任何内容。

我前段时间已经给出了这个答案:Write to console from a native javafx app created with Inno Setup and maven

经过进一步挖掘,我发现了一些有趣的东西: 生成的 EXE 文件是一个简单的 windows 可执行文件,没有 cli-executable 如启动器源代码中所示,这就是原因 您没有看到任何控制台输出,但在流水线操作时有结果 到某个文件中。

这意味着您需要使用自己的预构建 exe 文件,或者只删除 SysOuts。

【讨论】:

  • “删除 SysOuts”是什么意思?
  • 是的,如果我们这样做 > out.txt 输出就在那里,不知何故我认为应该有一种方法可以最终显示控制台
  • 还有没有办法让系统PATH的已安装应用程序的exe路径?
  • 你不应该使用System.out.println(),你应该使用记录器框架而不是依赖于CLI。要将您的应用程序添加到系统路径,您需要更改安装程序脚本,请参阅项目post 1post 2 上的这两个不同的帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2014-10-10
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多