使用Javapackager自定义.app包的Res​​ources目录

时间:2017-06-01 21:34:18

标签: java macos deployment dmg javapackager

在macOS上,我使用 Javapackager 从我的Application.app Java存档中创建一个Application.jar包(称为磁盘映像):< / p>

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的开发人员website)需要复制到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目录它的创造,因为它会打破它的签名。)

2 个答案:

答案 0 :(得分: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. 执行相同的操作
  5. 要验证它看起来没问题:

    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

  6. 执行相同的操作
  7. 然后使用下面的命令替换现有签名。这会在CodeResources

    下重新生成新的更新Contents/_CodeSignature/文件

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

    应输出:

    ./Application.app: replacing existing signature

    更新的CodeResources文件应包含en.lprojfr.lproj的条目,如:

    <key>Resources/en.lproj/InfoPlist.strings</key>
    <dict>
        <key>hash</key>
        <data>
        CUsP4OMChUrxMRr6uFtSA7pFejs=
        </data>
        <key>optional</key>
        <true/>
    </dict>
    
  8. 使用开发者ID分发时,验证您的应用是否符合关守政策,以模仿关守的作用。

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

  9. 在脚本中自动执行上述步骤!

答案 1 :(得分:0)

如果您使用(或可以使用) maven ,则可以使用assembly plugin进行此操作。

首先,您可以使用exec plugin执行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>