在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
目录它的创造,因为它会打破它的签名。)
答案 0 :(得分:1)
作为解决方法:
将您的自定义Info.plist
文件放入package/macosx/
(如果不存在则创建),以便javapackager在执行期间选择它,然后像往常一样运行javapackager。
手动将*.lproj/InfoPlist.strings
结构复制到Application.app/Contents/Resources
文件夹。
对两个文件进行签名,替换为您的值。提示:您可以从javapackager控制台输出中找到您的值。类似的东西:
codesign -s "Developer ID Application: Your Company Inc (A1234ABCDE)" --prefix com.domain. ./Application.app/Contents/Resources/en.lproj/InfoPlist.strings
对fr.lproj
要验证它看起来没问题:
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
然后使用下面的命令替换现有签名。这会在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.lproj
的条目,如:
<key>Resources/en.lproj/InfoPlist.strings</key>
<dict>
<key>hash</key>
<data>
CUsP4OMChUrxMRr6uFtSA7pFejs=
</data>
<key>optional</key>
<true/>
</dict>
使用开发者ID分发时,验证您的应用是否符合关守政策,以模仿关守的作用。
codesign --verify --deep --strict --verbose=2 ./Application.app
答案 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>