正如我在对我的问题的第一条评论中所写的那样,javapackager 没有这样做的选项。
这是我制定的解决方案:
在与文件夹相同的级别创建一个新文件夹package
(这不是指 Java package
,而是指Custom Resources)。命名新文件夹package-base
。
将macosx
和windows
文件夹从package
移至package-base
。(我没有为 Linux 生成可执行文件,因为我的用户都不使用 Linux。)现在,该package
文件夹是空的。
在我的构建脚本中,我添加了一个步骤,对于生成“自包含应用程序包”(Oracle 的术语)的每个构建,清理package
文件夹,然后将内容复制package-base
到package
.
这些文件在复制时被重命名以包含所需的措辞——在我的例子中,这意味着年份被附加到文件名中。例如,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 配置文件中的版本号、版权以及应用程序的名称(包括年份)。
看起来可能需要做很多额外的工作,但是一旦编写了脚本,它就可以工作了。