如何在 MacOS 14 上使用 JavaFX 将应用程序名称和图标从默认的“Java”更改为其他名称?

问题描述 投票:0回答:1

我想将 Dock 上显示的应用程序名称更改为其他名称,而不是默认的“Java”。

我尝试更改为使用

stage.setTitle("SomeRandomTitle")
,但它仅更改窗口上显示的名称。

我正在使用 Intellij Idea,并且使用的是 MacOS 14.2。

扩展坞上的应用程序名称:

macos intellij-idea javafx desktop-application
1个回答
2
投票

使用
jpackage
自定义 OS X 上的应用程序名称和图标

您显示的图像是在 OS X 上运行的 Java 应用程序的默认图标和名称。其显示正常。

要为您的应用程序自定义 OS X Dock 中显示的图标,需要创建应用程序安装程序。

jpackage
可用于创建为应用程序定义自定义图标的安装程序。对于某些发行版,例如通过 Apple 应用程序商店,您可能需要付费开发者证书来签署 OS X 应用程序。

jpackage 文档描述了部分过程:

Apple 提供了获取开发者证书的信息:

需要从Apple获取各类证书。所需的证书类型因应用程序的目标而异(例如,它是否可部署到 Apple App Store)。有关所需证书类型的信息位于链接的

jpackage
文档中。

使用自定义图标打包应用程序的示例

使用软件:

  • OpenJDK 21.0.1
  • JavaFX 21.0.1 SDK
  • JavaFX 21.0.1 JMODS

使用的所有版本均适用于 x64 Mac(M 系列处理器需要适用于 Mac 的 aarch64 JDK/SDK/JMODS 和 M 系列 Mac 来创建适当的包)。

使用了

HelloWorld.java源。

package helloworld;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class HelloWorld extends Application {     
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(e ->
                System.out.println("Hello World!");                
        );
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }
}

还有这个

module-info.java

module hello {
    requires javafx.controls;
    exports helloworld;
}

JAVA_HOME
是:

export JAVA_HOME=`/usr/libexec/java_home -v 21.0.1`

jar 文件是使用以下命令创建的:

javac -p javafx-sdk-21.0.1/lib -d out module-info.java helloworld/HelloWorld.java
jar --verbose --create -p javafx-jmods-21.0.1 --file hello.jar --module-version 1.0 -C out module-info.class -C out helloworld/HelloWorld.class -C out helloworld/HelloWorld\$1.class

使用的

jpackage
命令是:

jpackage --icon Tatice-Cristal-Intense-Apple-multicolor.icns --name HelloApp -p javafx-jmods-21.0.1:hello.jar --module hello/helloworld.HelloWorld --type dmg

.icns
文件是从icon archive获取的(不幸的是,链接中存在烦人的广告)。

您可以在此处看到结果,应用程序的自定义图标图像(多色苹果图标)和由

jpackage
命令定义的自定义名称“HelloApp”,而不是默认文件夹图标和“java”正在运行的应用程序的名称:

树:

$ tree
.
├── HelloApp-1.0.dmg
├── HelloApp-1.0.pkg
├── Tatice-Cristal-Intense-Apple-multicolor.icns
├── hello.jar
├── helloworld
│   └── HelloWorld.java
├── javafx-jmods-21.0.1
│   ├── javafx.base.jmod
│   ├── javafx.controls.jmod
│   ├── javafx.fxml.jmod
│   ├── javafx.graphics.jmod
│   ├── javafx.media.jmod
│   ├── javafx.swing.jmod
│   └── javafx.web.jmod
├── javafx-sdk-21.0.1
│   ├── legal
│   │   ├── javafx.base
│   │   │   ├── ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION
│   │   │   └── LICENSE
│   │   ├── javafx.controls
│   │   │   ├── ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION
│   │   │   └── LICENSE
│   │   ├── javafx.fxml
│   │   │   ├── ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION
│   │   │   └── LICENSE
│   │   ├── javafx.graphics
│   │   │   ├── ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION
│   │   │   ├── LICENSE
│   │   │   ├── jpeg_fx.md
│   │   │   └── mesa3d.md
│   │   ├── javafx.media
│   │   │   ├── ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION
│   │   │   ├── LICENSE
│   │   │   ├── directshow.md
│   │   │   ├── glib.md
│   │   │   ├── gstreamer.md
│   │   │   └── libffi.md
│   │   ├── javafx.swing
│   │   │   ├── ADDITIONAL_LICENSE_INFO
│   │   │   ├── ASSEMBLY_EXCEPTION
│   │   │   └── LICENSE
│   │   └── javafx.web
│   │       ├── ADDITIONAL_LICENSE_INFO
│   │       ├── ASSEMBLY_EXCEPTION
│   │       ├── LICENSE
│   │       ├── icu_web.md
│   │       ├── libxml2.md
│   │       ├── libxslt.md
│   │       └── webkit.md
│   ├── lib
│   │   ├── javafx-swt.jar
│   │   ├── javafx.base.jar
│   │   ├── javafx.controls.jar
│   │   ├── javafx.fxml.jar
│   │   ├── javafx.graphics.jar
│   │   ├── javafx.media.jar
│   │   ├── javafx.properties
│   │   ├── javafx.swing.jar
│   │   ├── javafx.web.jar
│   │   ├── libdecora_sse.dylib
│   │   ├── libfxplugins.dylib
│   │   ├── libglass.dylib
│   │   ├── libglib-lite.dylib
│   │   ├── libgstreamer-lite.dylib
│   │   ├── libjavafx_font.dylib
│   │   ├── libjavafx_iio.dylib
│   │   ├── libjfxmedia.dylib
│   │   ├── libjfxmedia_avf.dylib
│   │   ├── libjfxwebkit.dylib
│   │   ├── libprism_common.dylib
│   │   ├── libprism_es2.dylib
│   │   └── libprism_sw.dylib
│   └── src.zip
├── module-info.java
└── out
    ├── helloworld
    │   ├── HelloWorld$1.class
    │   └── HelloWorld.class
    └── module-info.class

有关最新 JDK/JavaFX/OS X 版本的 Apple 签名证书的信息

我在 OS X Sonoma 14.1.1 上使用

jpackage
以及 JavaFX 21.0.1 和 OpenJDK 21.0.1 创建了 OS X 包。

与我之前尝试使用

jpackage
在 OS X 上创建软件包的经验不同,生成的软件包(
pkg
dmg
类型)可安装且可用 无需使用开发者证书签署应用程序

我不确定这是否有效,因为:

  • 我的 Mac 操作系统上的不同安全设置或
  • 最新 OS X 版本中的更改或
  • JDK 21 或其他一些最新 JDK 版本的 JDK 打包工具的更改或者
  • 我使用
    jpackage
    创建包的方式略有不同。

虽然这可行,但您可能最好进行专业安装,获取并使用 Apple 的付费证书。但至少,对于最近的软件版本,可以在 OS X 上创建一个可运行的已安装应用程序,而无需使用付费证书。

注释

在关于为什么可以执行未签名的应用程序的相关评论中,Trashgod 指出:

您可能在首次启动未签名的应用程序时免除了网守审查,如此处建议

trashgod 还提供了有关如何分配应用程序名称的附加信息:

应在 Info.plist 中指定所需的捆绑包名称,像这样

我认为

jpackage
Info.plist
中设置捆绑包名称,以便为应用程序分配使用
jpackage
构建应用程序安装程序时配置的名称,从而不需要手动配置该值。

© www.soinside.com 2019 - 2024. All rights reserved.