JavaFX packager - 可以指定包图标的名称吗?

JavaFX packager - can the name of the package icon be specified?

几年来,我每年都会发布一个适度应用程序的更新——就在夏季游泳联赛开始之前。

过去,我通过将它们放在 package/macosx/ 文件夹中来指定各种图标(音量、应用程序等)。文件名 MyApp-volume.icns 等与 <fx:application name="MyApp" .../> 匹配,一切正常。

但从今年的构建和部署开始,应用的名称将包含年份,即 MyApp 2016。但是,我不想每年都更改图标文件名;我想保持原样 (MyApp-volume.icns, MyApp.icns).

有没有办法告诉 Java 打包程序使用特定的图标文件名,一个不同于应用程序名称或标题的文件名? (我查看了 Oracle 文档,但什么也没看到。)

-Bicon=<path to icon relative to project resourses>

这是您要找的吗?

或者您可以将它添加到您的主应用程序 Stage

希望有用

正如我在对我的问题的第一条评论中所写,javapackager 没有执行此操作的选项。

这是我得出的解决方案:

  1. 在文件夹 package 的同一级别创建一个新文件夹(这不是指 Java package 而是指 Custom Resources ).将新文件夹命名为 package-base.

  2. macosxwindows 文件夹从 package 移动到 package-base。 (我没有为 Linux 生成可执行文件,因为 none 我的用户使用 Linux。)现在,package 文件夹是空的。

  3. 在我的构建脚本中,我添加了一个步骤,对于每个生成 "self-contained application package"(Oracle 的术语)的构建,清理 package 文件夹,然后复制package-basepackage.

  4. 的内容
  5. 文件被重命名,因为它们被复制以包含所需的措辞——在我的例子中,这意味着年份附加到文件名。例如,MyApp-volume.icns复制时重命名为MyApp-2018-volume.icns.

以下是相关的 Gradle 片段:

import org.gradle.internal.os.OperatingSystem
...
def getYear() {
    new Date().format('yyyy')
}
...
ext {
    ...
    year = getYear()
    appNameBase = "MyApp"
    appName = appNameBase + " " + year
    ...
}
...
task macCleanPackage {
    doLast {
        if (OperatingSystem.current().isMacOsX()) {
            delete fileTree(dir: "./package/macosx", include: "*.*")
        }
    }
}

task macCopyAndRenamePackageResources {
    dependsOn macCleanPackage

    doLast {
        if (OperatingSystem.current().isMacOsX()) {
            def toDir = "./package/macosx"
            copy {
                from './package-base/macosx'
                into "${toDir}"
                include "*${appNameBase}*.*"
                rename { String fileName -> fileName.replace("$appNameBase", "${appName}") }
            }
            ant.replaceregexp(file: "${toDir}/${appName}-dmg-setup.scpt", match:"${appNameBase}", replace:"${appName}", flags:'g')
        }
    }
}

task windowsCleanPackage {
    doLast {
        if (OperatingSystem.current().isWindows()) {
            delete fileTree(dir: "package/windows", includes: ["*.bmp", "*.ico", "*.iss"])
        }
    }
}

task windowsCopyAndRenamePackageResources {
    dependsOn windowsCleanPackage

    doLast {
        if (OperatingSystem.current().isWindows()) {
            def toDir = "./package/windows"
            copy {
                from './package-base/windows'
                into "${toDir}"
                include "*${appNameBase}*.*"
                rename { String fileName -> fileName.replace("$appNameBase", "${appName}") }
            }
            // Replace app name in iss setup script to include year.
            def issFilename = "./package/windows/${appName}.iss"
            ant.replaceregexp(file: "${issFilename}", match: "${appNameBase}", replace: "${appName}", flags: "g")
            ant.replaceregexp(file: "${issFilename}", match: "AppCopyright=Copyright (C)", replace: "AppCopyright=Copyright (C) ${year}", byline: "on")
            ant.replaceregexp(file: "${issFilename}", match: "AppVersion=", replace: "AppVersion=${year} build ${buildNumber}", byline: "on")
            ant.replaceregexp(file: "${issFilename}", match: "OutputBaseFilename=.*", replace: "OutputBaseFilename=${appName}-(build ${buildNumber})", byline: "on")
        }
    }
}

我不只是更改文件名。

对于 OS X 版本,ant.replaceregexp 用于修改自定义 AppleScript 文件中的应用程序名称。

对于 Windows 版本,ant.replaceregexp 广泛用于替换版本号、版权以及 InnoSetup 配置文件中的应用程序名称(包括年份)。

这看起来似乎有很多额外的工作,但是一旦编写了脚本,它就可以正常工作了。