2017-06-01 29 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> 
相關問題