1

在 macOS 上,我使用Javapackager从我的Java 存档中制作一个Application.app包(称为磁盘映像):Application.jar

javapackager \
  -deploy \
  -native image \
  -srcfiles Application.jar \
  -outdir dist \
  -outfile Application \
  -appclass Application

生成的Application.app包是具有以下布局的目录:

Application.app
|--Contents
   |--Info.plist
   |--PkgInfo
   |--Java
   |  |--Application.jar
   |--MacOS
   |  |--Application
   |--Resources

但是,我的文件系统上有一些<language>.lproj目录(其中包含InfoPlist.strings用于本地化文件的某些字符串的Info.plist文件,参见 Apple 的开发者网站)需要复制到布局的Resources目录中,如下所示:Application.app

Application.app
|--Contents
   |--Info.plist
   |--PkgInfo
   |--Java
   |  |--Application.jar
   |--MacOS
   |  |--Application
   |--Resources
      |--en.lproj
         |--InfoPlist.strings
      |--fr.lproj
         |--InfoPlist.strings

我怎样才能告诉Javapackager这样做呢?(我不想在创建后<language>.lproj自己在Application.app包中复制目录,因为它会破坏它的签名。)

4

2 回答 2

1

作为一种解决方法:

  1. 将您的自定义Info.plist文件放入package/macosx/(如果不存在则创建)以供 javapackager 在执行期间获取它,然后像往常一样运行您的 javapackager。

  2. 手动将*.lproj/InfoPlist.strings结构复制到Application.app/Contents/Resources文件夹中。

  3. 签署两个文件,替换为您的值。提示:您可以从 javapackager 控制台输出中找到您的值。就像是:

    codesign -s "Developer ID Application: Your Company Inc (A1234ABCDE)" --prefix com.domain. ./Application.app/Contents/Resources/en.lproj/InfoPlist.strings

    做同样的事情fr.lproj

  4. 要验证它看起来没问题:

    codesign --verify --strict --verbose=2 ./Application.app/Contents/Resources/en.lproj/InfoPlist.strings

    应该输出:

    ./Application.app/Contents/Resources/en.lproj/InfoPlist.strings: valid on disk ./Application.app/Contents/Resources/en.lproj/InfoPlist.strings: satisfies its Designated Requirement

    做同样的事情fr.lproj

  5. 然后用下面的命令替换现有的签名。这会在下重新生成一个新的更新CodeResources文件Contents/_CodeSignature/

    codesign -s "Developer ID Application: Your Company Inc (A1234ABCDE)" --prefix com.domain. --force --deep ./Application.app

    应该输出:

    ./Application.app: replacing existing signature

    en.lproj并且更新后的 CodeResources 文件应该包含以下条目fr.lproj

    <key>Resources/en.lproj/InfoPlist.strings</key>
    <dict>
        <key>hash</key>
        <data>
        CUsP4OMChUrxMRr6uFtSA7pFejs=
        </data>
        <key>optional</key>
        <true/>
    </dict>
    
  6. 当您使用 Developer ID 分发时,验证您的应用程序是否符合 Gatekeeper 政策,以模仿 Gatekeeper 所做的事情。

    codesign --verify --deep --strict --verbose=2 ./Application.app

  7. 在脚本中自动执行上述步骤!
于 2017-08-02T15:40:42.837 回答
0

如果您使用(或可以使用)maven,则可以使用assembly plugin来完成。

首先,您可以使用exec 插件来执行jlink/javapackage步骤,并在完成后(在package阶段),将缺少的信息复制到目标文件夹。

Maven 会为您自动执行这些步骤,您不必手动执行这些步骤。

例如:

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.6.0</version>
        <executions>
          <execution>
          <goals>
            <goal>exec</goal>
          </goals>
         </execution>
       </executions>
       <configuration>
         <executable>jlink</executable>
         <!-- optional -->
         <workingDirectory>/tmp</workingDirectory>
         <arguments>
           <argument>--compress=2</argument>
           <argument>--strip-debug</argument>
           ...
         </arguments>
        [...]

      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
          <descriptors>
            <descriptor>src/assembly/copy-resources.xml</descriptor>
          </descriptors>
        </configuration>
      </plugin>
</project>
于 2017-08-29T12:09:05.813 回答