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 没有执行此操作的选项。
这是我得出的解决方案:
在文件夹 package
的同一级别创建一个新文件夹(这不是指 Java package
而是指 Custom Resources ).将新文件夹命名为 package-base
.
将 macosx
和 windows
文件夹从 package
移动到 package-base
。 (我没有为 Linux 生成可执行文件,因为 none 我的用户使用 Linux。)现在,package
文件夹是空的。
在我的构建脚本中,我添加了一个步骤,对于每个生成 "self-contained application 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 配置文件中的应用程序名称(包括年份)。
这看起来似乎有很多额外的工作,但是一旦编写了脚本,它就可以正常工作了。
几年来,我每年都会发布一个适度应用程序的更新——就在夏季游泳联赛开始之前。
过去,我通过将它们放在 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 没有执行此操作的选项。
这是我得出的解决方案:
在文件夹
package
的同一级别创建一个新文件夹(这不是指 Javapackage
而是指 Custom Resources ).将新文件夹命名为package-base
.将
macosx
和windows
文件夹从package
移动到package-base
。 (我没有为 Linux 生成可执行文件,因为 none 我的用户使用 Linux。)现在,package
文件夹是空的。在我的构建脚本中,我添加了一个步骤,对于每个生成 "self-contained application 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 配置文件中的应用程序名称(包括年份)。
这看起来似乎有很多额外的工作,但是一旦编写了脚本,它就可以正常工作了。