【问题标题】:How to generate a jar and native bundle (dmg, exe, etc) from the same code in JavaFX如何从 JavaFX 中的相同代码生成 jar 和本机包(dmg、exe 等)
【发布时间】:2017-11-15 07:38:29
【问题描述】:

我在 IntelliJ 中有一个 JavaFX 应用程序设置。这个应用程序可以从命令行运行,也可以作为 jar 的 gui 运行。除了 jar 中的两种模式之外,我还想发布一个本机包(在我的情况下,对于 mac,所以 dmg)。我想通过在 main() 中创建一个 if 语句来执行此操作,该语句需要指示是否启动 gui。这是我的课。

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("dummy.fxml"));
        primaryStage.setTitle("TODO");
        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }


    public static void main(String[] args) {
        if (args[0].equals("user_interface")) {
            //launch gui version
            launch(args);
        } else {
            //Run command line version of the app
            //TODO
        }
    }
}

我在我的 intellij 项目中创建了两个构建工件。一个用于 jar,一个用于 javafx 应用程序以生成 dmg。

罐子工作得很好。它在 cli 中运行并启动 javafx 应用程序,但我不知道在创建本机包时如何传递参数,以便我可以传入“user_interface”。有谁知道在创建原生包工件时如何传递参数?

如果有更好的方法来做到这一点?只有两个要求。

  1. 应该有两个工件。一个罐子和一个 dmg。
  2. jar 可以在 cli 或 gui 模式下运行。

【问题讨论】:

  • 也有点跑题了,但你应该在访问索引 0 之前检查 args 的长度:if (args.length >= 1 && args [0].equals....

标签: java intellij-idea javafx javafx-2 javafx-8


【解决方案1】:

您可以创建 2 个主类:

  • 控制台应用 --> 隐藏 UI
  • UI 应用 --> 显示 UI

然后您可以创建 2 个工件:控制台工件,UI 工件。然后使用你的主类。

或者您可以在 JavaFx 应用程序工件的 Java FX 选项卡中定义“应用程序参数”:

这是一个简单的属性文件,带有“key=value”或只有一个“key”。每行一个条目。 然后你可以在你的 start 方法中得到这个参数:

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parameters parameters = getParameters();

        List<String> unnamed = parameters.getUnnamed();
        for (String s : unnamed) {
            System.out.println(s + " (unnamed)");
            Alert al = new Alert(Alert.AlertType.INFORMATION);
            al.setContentText(s + " (unnamed)");
            al.show();
        }

        List<String> raw = parameters.getRaw();
        for (String s : raw) {
            System.out.println(s + " (raw)");
            Alert al = new Alert(Alert.AlertType.INFORMATION);
            al.setContentText(s + " (raw)");
            al.show();
        }
}

【讨论】:

  • 应用参数是什么?对params.properties 列表或其他内容的引用?
  • 太棒了。谢谢菲尔
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2011-06-22
  • 2023-01-25
相关资源
最近更新 更多