【问题标题】:How to add shortcut to Windows app from jpackage+wix?如何从 jpackage+wix 添加到 Windows 应用程序的快捷方式?
【发布时间】:2020-02-25 18:33:40
【问题描述】:

我有一个脚本(为简洁起见只是一个简化的摘录)来构建和打包我的应用程序,但它归结为生成 WiX 安装程序:

jpackage \
    --type msi \
    --dest "$(cygpath -w "${base[build:dist]}")" \
    --name "${appDisplayName}" \
    --app-version "${version}" \
    --app-image "$(cygpath -w "${base[build:app]}")" \
    --license-file "$(cygpath -w resources/app/legal/LICENSE)" \
    --vendor "${vendor}" \
    --verbose \
    --temp 'W:\_tmp_' \
    --win-shortcut;

它因神秘而失败:Command [light.exe, (...)] in (...) exited with 94 code。我发现这是关于未解决的引用,尤其是对快捷图标的引用:...\config\bundle.wxf(10) : error LGHT0094 : Unresolved reference to symbol 'Icon:icon1798580986' in section 'Fragment:'

当我检查生成的 WiX XML 时,我发现:

<?xml version="1.0" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Fragment>
  ...
  <DirectoryRef Id="DesktopFolder">
    <Component Win64="yes" Id="cshortcut9906e12cdacb303ebb5e48c888cf6949" Guid="{9906e12c-dacb-303e-bb5e-48c888cf6949}">
      ...
      <Shortcut Id="shortcut9906e12cdacb303ebb5e48c888cf6949" Name="..." WorkingDirectory="INSTALLDIR" Advertise="no" IconIndex="0" Target="[#filed2065cdc42e13
55f8bdbbefc93d540f3]" Icon="icon1798580986"></Shortcut>
    </Component>
  </DirectoryRef>
  ...
</Wix>

确实有这个“icon1798580986”值,它没有告诉我任何东西,甚至 WiX 也在这里丢失了(在阅读了这个 https://stackoverflow.com/a/21019152/2024692 之后,我检查并确认我确实在 WiX bin 文件夹中有 WixUIExtension.dll )。

当我删除 --win-shortcut 选项时,会生成 MSI 安装程序,但不幸的是桌面上没有快捷方式图标(该应用程序具有正确的图标,因为我使用 --icon 开关和 @ 生成了应用程序图像987654330@ 指向 a.o. 应用程序图标)。

您可能已经猜到,这是从 Cygwin 调用的,所以有时它需要修改路径,尤其是当调用 Windows 可执行文件时(因此有这些 cygpath 东西)。

好吧,我无法找到任何建设性的方法来简单地让我的 Java 应用程序包含 jpackage(来自 JDK-14/15 EA 都没有成功)在安装后具有漂亮的快捷方式图标。有谁知道如何解决这个问题?提前致谢。

【问题讨论】:

  • 您找到合并图标的解决方案了吗?我刚刚放弃了创建桌面快捷方式。
  • @DavidCian 不幸的是还没有。我希望运行 postinstall 脚本(可以通过批处理脚本创建快捷方式),但似乎 postinstall 可以在 macOS 和 Linux 上运行,但不能在 Windows 上运行(至少我无法在 Windows 上运行它)。另一方面,如果您设法在 Windows 上运行安装后脚本,那么我会很乐意分享代码(但我想,您会通过自己的方式立即弄清楚)。

标签: java windows wix cygwin


【解决方案1】:

使用 gradle 插件更容易实现

您需要设置正确的图标文件路径并拥有一个有效的 .ico 文件。我就是这样做的:

jlink {
    options = ['--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages']
    launcher {
        name = 'PDF Decorator'
        jvmArgs = ['-Djdk.gtk.version=2'] // required due to a bug in Java: https://github.com/javafxports/openjdk-jfx/issues/175
    }
    jpackage {
        installerOptions = [
            '--description', project.description,
            '--copyright', 'Copyrigth 2015-2019 WALCZAK.IT'
        ]
        installerType = project.findProperty('installerType') // we will pass this from the command line (example: -PinstallerType=msi)
        if (installerType == 'msi') {
            imageOptions += ['--icon', 'src/main/resources/pdfdecorator/gui/icon.ico']
            installerOptions += [
                '--win-per-user-install', '--win-dir-chooser',
                '--win-menu', '--win-shortcut'
            ]
        }
        if (installerType == 'pkg') {
            imageOptions += ['--icon', 'src/main/resources/pdfdecorator/gui/icon.icns']
        }
        if (installerType in ['deb', 'rpm']) {
            imageOptions += ['--icon', 'src/main/resources/pdfdecorator/gui/icon_256x256.png']
            installerOptions += [
                '--linux-menu-group', 'Office',
                '--linux-shortcut'
            ]
        }
        if (installerType == 'deb') {
            installerOptions += [
                '--linux-deb-maintainer', 'office@walczak.it'
            ]
        }
        if (installerType == 'rpm') {
            installerOptions += [
                '--linux-rpm-license-type', 'GPLv3'
            ]
        }
    }
}

这里有一篇文章如何使用 OpenJDK 11 构建应用程序映像以及使用带有 jpackage 的 OpenJDK 14 仅用于构建安装程序/包:https://walczak.it/blog/distributing-javafx-desktop-applications-without-requiring-jvm-using-jlink-and-jpackage

【讨论】:

  • 这只是添加了我所指的相同选项。
  • 我已经编辑了anwser,看看这段代码对你有没有帮助
  • 您的意思是,除了--win-shortcut(如我的摘录)之外,它还添加了--icon 参数?嗯,我应该试一试,但是我在构建应用映像时在上一步(此处未列出)中输入了--icon。但也许这就是问题所在?我会检查并提供反馈。
  • 不幸的是,--icon 不适用于 --type msijpackage(它适用于 --type app-image,你,但它并未反映在生成的 MSI 安装程序中,该安装程序使用在这样的方式)。
【解决方案2】:

您刚刚获得了约定优于配置的乐趣

当使用 jpackage --app-image--win-shorcut 参数时,jpackage 期望在 app-image 目录的根目录中找到可执行文件和图标来创建快捷方式。可执行文件和图标必须与使用--name 参数提供的名称相同。

在你的情况下 jpackage 期望:

$(cygpath -w "${base[build:app]}")\${appDisplayName}.exe
$(cygpath -w "${base[build:app]}")\${appDisplayName}.ico

为了能够创建快捷方式而存在。

【讨论】:

  • 还没有测试过——来自 JDK 14.0.1 的 jpackage 按预期在以前的配置上工作,你。
【解决方案3】:

如果在没有--win-shortcut 的情况下发生错误 94

这实际上可能是与 jpackage 的 --app-image 参数有关的问题!一个指示符是 应用程序图像不是由 jpackage 创建的警告。

如果您在创建应用映像时的目标参数看起来像--dest target/app-image,那么您必须在创建安装程序时使用--app-image target/app-image/myapp。使用 --app-image target/app-image 会导致此错误。一个小小的疏忽可能会因为这个神秘的信息而引起很多人的头疼。

这似乎是因为@Mumrah81 给出的原因:

[...] jpackage 期望在 app-image 目录的根目录中找到可执行文件和图标来创建快捷方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-28
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多