Настройка каталога Resources пакета .app с помощью Javapackager

В macOS я использую Javapackager для создания пакета Application.app (называемого образом диска) из моего Application.jar архива Java:

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 после его создания, так как это нарушит его подпись.)


person Maggyero    schedule 01.06.2017    source источник


Ответы (2)


В качестве обходного пути:

  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

    И в обновленном файле CodeResources должны быть записи для en.lproj и fr.lprojlike:

    <key>Resources/en.lproj/InfoPlist.strings</key>
    <dict>
        <key>hash</key>
        <data>
        CUsP4OMChUrxMRr6uFtSA7pFejs=
        </data>
        <key>optional</key>
        <true/>
    </dict>
    
  6. Убедитесь, что ваше приложение соответствует политикам Gatekeeper при распространении с идентификатором разработчика, чтобы имитировать то, что делает Gatekeeper.

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

  7. Автоматизируйте описанные выше шаги в скрипте!
person jbilander    schedule 02.08.2017

Если вы используете (или можете использовать) maven, вы можете сделать это с помощью плагин сборки.

Прежде всего, вы можете использовать плагин 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>
person madduci    schedule 29.08.2017