1

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

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

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

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

4

2 回答 2

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

这是你要找的吗?

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

希望有用

于 2016-07-28T20:15:21.797 回答
0

正如我在对我的问题的第一条评论中所写的那样,javapackager 没有这样做的选项。

这是我制定的解决方案:

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

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

  3. 在我的构建脚本中,我添加了一个步骤,对于生成“自包含应用程序包”(Oracle 的术语)的每个构建,清理package文件夹,然后将内容复制package-basepackage.

  4. 这些文件在复制时被重命名以包含所需的措辞——在我的例子中,这意味着年份被附加到文件名中。例如,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 配置文件中的版本号、版权以及应用程序的名称(包括年份)。

看起来可能需要做很多额外的工作,但是一旦编写了脚本,它就可以工作了。

于 2018-06-18T03:56:04.323 回答