2017-06-01 34 views
1

在MacOS,我使用Javapackager作出Application.app包(称为磁盘映像):从我<code>Application.jar</code> Java归档定制的捆绑。应用程序的资源目录中Javapackager

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文件的某些字符串,请参阅参考资料)。苹果公司需要在Resources目录Application.app布局的被复制,这样我的文件系统上的开发者website):

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包创建后,它会打破其签名。)

回答

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. 然后替换下面的命令现有签名。这种再生Contents/_CodeSignature/

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

    下一个新的更新CodeResources文件应该输出:

    ./Application.app: replacing existing signature

    和更新的CodeResources文件应该有en.lproj条目和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. 在脚本中自动完成上述步骤!
0

如果你使用(或可以使用)行家,您可以用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> 
相关问题