JavaFX打包程序 - 是否可以指定包图标的名称?

时间:2016-06-17 16:36:13

标签: javafx javapackager

几年来,我一直在每年发布适度应用程序的更新 - 就在夏季游泳联盟开始之前。

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

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

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

2 个答案:

答案 0 :(得分:0)

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

这就是你要找的东西吗?

或者您可以将其添加到主应用Stage

希望它有用

答案 1 :(得分:0)

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

以下是我制定的解决方案:

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

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

  3. 在我的构建脚本中,我添加了一个步骤,对于每个构建一个自包含的应用程序包&#34; (Oracle的术语),清除package文件夹,然后将package-base的内容复制到package

  4. 文件在复制时被重命名,以包含所需的措辞 - 在我的情况下,这意味着年份附加到文件名。例如,复制时MyApp-volume.icns重命名为MyApp-2018-volume.icns

  5. 以下是相关的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配置文件中的版本号,版权以及应用程序的名称(包括年份)。

    这可能看起来像是一项额外的工作,但是一旦编写了脚本,它就会起作用。