【发布时间】:2016-09-17 12:02:59
【问题描述】:
使用 Linux,我运行一些我用 Java 编写的程序,方法是将它们压缩到一个带有清单文件的 jar 中,然后将它们放在已添加到我的 $PATH 的个人目录中,如下所示:
program.jar file2 file2。它可以在我将控制台指向的任何目录中运行良好,我什至可以执行 program.jar file1 | less 或 program.jar file1 > output.txt。它们就像 bin 控制台程序一样工作。
但是在 OS X 上我无法复制相同的行为,我不得不使用 java -jar program.jar 运行它们,否则会显示 -bash program.jar: cannot execute binary file
有没有办法让 jar 的行为与在 OS X 上的 Linux 中一样?
已编辑:
从命令行
如果您使用 Xcode Organizer 的模板构建一个新的 Java Swing 应用程序,Xcode 会自动生成一个包含默认 Info.plist 文件的应用程序包。您可以直接在 Xcode 中或使用属性列表编辑器微调 Info.plist 文件。有关使用 Xcode 进行 Java 开发的更多信息,请参阅 Xcode 帮助(可从 Xcode 的帮助菜单中获得)。
如果您想将现有的 Java 应用程序转换为 OS X Java 应用程序,请使用 /Developer/Applications/Utilities 中提供的 Jar Bundler 应用程序。它允许您获取现有的.class 或.jar 文件并将它们包装为应用程序包。 Jar Bundler 用户指南中提供了有关 Jar Bundler 的信息,包括教程。
要从命令行构建有效的应用程序包,例如,在 shell 脚本或 Ant 文件中,您需要执行以下步骤:
设置正确的目录层次结构。顶级目录应以您的应用程序名称命名,后缀为.app。
应用程序包的根目录下应该有一个 Contents 目录。它应该包含一个 MacOS 目录和一个 Resources 目录。 Java 目录应该在 Resources 目录中。
目录布局应如下所示:
YourApplicationName.app/
目录/
MacOS/
资源/
Java/
将JavaApplicationStub 文件从/System/Library/Frameworks/JavaVM.framework/Versions/Current/Resources/MacOS/ 复制到应用程序包的MacOS 目录中。
在应用程序包的Contents 目录中创建一个Info.plist 文件。您可以从现有 Java 应用程序(例如 Jar Bundler)中的示例开始,然后对其进行修改或从头开始生成一个全新的应用程序。请注意,除非您在此属性列表中设置了正确的属性,尤其是 MainClass 键,否则应用程序包不会启动。
在Contents 目录中创建一个PkgInfo 文件。它应该是一个纯文本文件。如果您还没有向 ADC 注册创建者代码,则内容应为APPL????。如果您已注册创建者代码,请将 ???? 替换为您的创建者代码。
将应用程序的图标文件放入Contents/Resources/ 目录。使用 Developer/Applications/Utilities 中的 Icon Composer 来帮助创建您的图标文件。
将您的 Java .jar 或 .class 文件复制到 Contents/Resources/Java/。
使用SetFile 设置捆绑位Finder 属性,在/Developer/Tools/ 中找到。例如,/Developer/Tools/SetFile -a B YourApplicationName.app。有关SetFile 的更多信息,请参见手册页。
完成这些步骤后,您应该有一个包含您的 Java 应用程序的可双击应用程序包。
【问题讨论】:
-
请注意,Unix 系统能够将 jar 文件作为标准程序执行是不是标准行为。
-
谢谢,我也是这么想的,我想知道是什么让它起作用,这就是我想要弄清楚的。我还开始将我的代码移植到 C++。
-
这很可能是您使用的特定 Linux 发行版中的特定设置。制作可执行的 java 档案是一门艺术。我建议您在离开 java 之前查看各种解决方案。