2017-06-01 1 views
1

Sur Mac OS, j'utilise Javapackager pour faire un faisceau Application.app (appelé une image disque ) de mon Application.jar archive Java:Personnalisation du répertoire des ressources d'un faisceau .app avec Javapackager

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

Le résultant bundle Application.app est un répertoire avec la mise en page suivante:

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

Cependant j'ai quelques répertoires <language>.lproj (qui contiennent InfoPlist.strings fichiers pour localiser certaines chaînes du fichier Info.plist, cf. Développeur d'Apple website) sur mon système de fichiers qui doivent être copiés dans le répertoire Resources de la mise en page Application.app, comme ceci:

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

Comment puis-je dire Javapackager de le faire? (Je ne veux pas copier moi-même les répertoires <language>.lproj dans le faisceau Application.app après sa création, comme il briserait sa signature.)

Répondre

1

Pour contourner ce problème:

  1. mettre votre dans package/macosx/ fichier personnalisé Info.plist (créer si inexistant) pour que javapackager le récupère pendant l'exécution, puis lancez votre javapackager normalement.

  2. Copiez manuellement la structure *.lproj/InfoPlist.strings dans le dossier Application.app/Contents/Resources.

  3. signer les deux fichiers, remplacez par vos valeurs. Astuce: Vous pouvez trouver vos valeurs à partir de la sortie de la console javapackager. Quelque chose comme:

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

    faire la même chose pour fr.lproj

  4. Pour vérifier, il semble bien:

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

    sortie doit:

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

    faire la même chose pour fr.lproj

  5. Remplacez ensuite la signature existante avec la commande ci-dessous.Cette regénère une nouvelle mise à jour le fichier CodeResources sous Contents/_CodeSignature/

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

    Si la sortie:

    ./Application.app: replacing existing signature

    Et le fichier CodeResources mis à jour devrait avoir des entrées pour en.lproj et fr.lproj comme:

    <key>Resources/en.lproj/InfoPlist.strings</key> 
    <dict> 
        <key>hash</key> 
        <data> 
        CUsP4OMChUrxMRr6uFtSA7pFejs= 
        </data> 
        <key>optional</key> 
        <true/> 
    </dict> 
    
  6. Vérifiez que votre application est conforme aux stratégies de Gatekeeper lorsque vous distribuez avec Developer ID, pour imiter ce que Gatekeeper fait.

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

  7. Automatiser les étapes ci-dessus dans un script!
0

Si vous utilisez (ou pouvez utiliser) maven, vous pouvez le faire avec le assembly plugin.

Tout d'abord, vous pouvez utiliser le exec plugin pour effectuer les jlink/javapackage étapes et à la fin (dans la phase package), copiez vos informations manquantes dans le dossier de destination. Maven l'automatise pour vous et vous n'avez pas à effectuer manuellement ces étapes.

Par exemple:

<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>