我有一个用于MAC OSX的Java应用程序,我编写了它并制作了一个.pkg。在创建.pkg时,我也给了它一个版本号。现在我需要在我的java代码中获取此应用程序的版本号,以便我可以在应用程序运行时检查更新。当我右键单击我的应用程序文件时,它不会显示我在创建包时输入的版本。
我是否需要设置我使用jar bundler创建的app文件的版本来构建pkg ???
请建议我如何才能做到这一点。
答案 0 :(得分:1)
您在创建程序包时设置的版本号(在PackageMaker项目中)是安装程序的版本,而不是.app-File的版本。这是必需的,以便其他安装人员可以查看他是否降级了当前安装。安装程序永远不会查看它正在安装到系统的内容。
要设置.app-Bundle的版本,请右键单击.app文件,然后从显示的菜单中选择“显示包内容”。打开文件夹“Contents”,在那里你会找到一个名为“Info.plist”的文件。您必须编辑此文件,并且必须在那里为您的应用程序设置版本信息。您可以使用属性列表编辑器(包含在Apple Developer Tools)或其他工具(例如BBEdit)来执行此操作。
要从应用程序中的.plist中读取,您需要一个特殊的库。我推荐Daniel Dreibrodt的Java property list library(有关您在this post on my blog中找到的.plist格式的更多信息)。
Generelly,您应该设置应用程序包的版本信息,无论如何您将其用于更新目的。如果未设置,则用户无法在不启动软件的情况下获取有关其安装版本的信息。
您需要的不是.pkg文件的版本,您需要.app-Bundle的版本。无论如何 - .pkg文件的版本与.app-file的处理方式相同。还有Info.plist,您可以在其中找到信息。它也可以使用相同的库进行解析。
答案 1 :(得分:0)
pkg是一个包含a.o的zip文件。一个名为PackageInfo的文件。 PackageInfo是一个XML文件,如下所示:
<pkg-info format-version="2" identifier="com.mycompany.pkg.MyApp" version="1.2.0" overwrite-permissions="false" install-location="/" auth="root">
<payload installKBytes="4717" numberOfFiles="146"/>
<scripts>
<preinstall file="./preinstall"/>
<postinstall file="./postinstall"/>
</scripts>
<bundle-version>
<bundle path="./Applications/MyApp.app" CFBundleShortVersionString="1.2.0" CFBundleVersion="166" id="com.mycompany.MyApp" CFBundleIdentifier="com.mycompany.MyApp">
<bundle path="./Contents/Library/LoginItems/HelperApp.app" CFBundleShortVersionString="1.0" CFBundleVersion="1" id="com.mycompany.HelperApp" CFBundleIdentifier="com.mycompany.HelperApp"/>
</bundle>
</bundle-version>
</pkg-info>
要获取软件包版本,您可以使用以下XPath:
pkg-info/@version
获取应用程序版本:
pkg-info/bundle-version/bundle/@CFBundleShortVersionString
内部版本号在这里:
pkg-info/bundle-version/bundle/@CFBundleVersion
答案 2 :(得分:0)
我知道这是一个很老的问题,但答案并不令人满意。这是我的解决方案: MacOS .pkg 文件是 XAR format 中的存档。因此,任何 XAR 档案阅读器都可以读取其内容。我从 Sprylab here 找到了一个用于 Java 的 XAR 阅读器。这个库有 Apache 2.0 许可证,所以它也可以免费用于商业产品。它很旧,但它有效。存档中的文件“分发”采用 XML 格式,并提供有关安装程序包的详细信息,例如版本;)
我使用的是 JSON,所以我不想添加一个 XML 阅读器来仅读取一个值。因此,以下代码使用 XAR 库和自定义 XML 阅读器来提取 .pkg 安装程序中的包版本。
public static void main(String [ ] args) throws XarException {
XarSource xar = new FileXarSource(new File("PathToPkgFile/PkgFilename.pkg"));
XarEntry entry = xar.getEntry("Distribution");
String distributionStr = new String(entry.getBytes());
String bundleVersionXml = getSubstringByStr(distributionStr, "<bundle-version>", "</bundle-version>");
String bundleAttrStr = getSubstringByStr(bundleVersionXml, "<bundle", "/>");
String version = getAttributeValue(bundleAttrStr, "CFBundleVersion");
System.out.println(bundleVersionXml);
System.out.println(bundleAttrStr);
System.out.println(version);
}
private static String getSubstringByStr(String xmlString, String start, String end) {
int startIdx = xmlString.indexOf(start);
int endIdx = xmlString.indexOf(end);
return xmlString.substring(startIdx + start.length(), endIdx);
}
private static String getAttributeValue(String tagContentString, String attribute) {
int startIdx = tagContentString.indexOf(attribute) + attribute.length() + "=\"".length();
int endIdx = startIdx + tagContentString.substring(startIdx).indexOf("\"");
return tagContentString.substring(startIdx, endIdx);
}