使用 Linux,我运行一些我用 Java 编写的程序,方法是将它们压缩到带有 list 文件的 jar 中,然后将它们放在已添加到我的 $PATH 中的个人目录中,如下所示:
program.jar 文件 2 文件 2
。它在我将控制台指向的任何目录中都运行良好,我什至可以执行 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 中一样?
已编辑:
感谢 Jean-Baptiste Yunès 的回答:
从命令行
如果您使用 Xcode Organizer 的模板之一构建新的 Java Swing 应用程序,Xcode 会自动生成一个包含默认 的应用程序包Info.plist
文件。您可以直接在 Xcode 中或使用 Property List Editor 微调 Info.plist
文件。有关使用 Xcode 进行 Java 开发的更多信息,请参阅 Xcode 帮助(可从 Xcode 的“帮助”菜单获得)。
如果您想将现有的 Java 应用程序转换为 OS X Java 应用程序,请使用 Jar Bundler /Developer/Applications/Utilities
中可用的应用程序。它允许您获取现有的 .class
或 .jar
文件并将它们包装为应用程序包。 Jar Bundler 用户指南中提供了有关 Jar Bundler 的信息(包括教程)。
要从命令行(例如,在 shell 脚本中)构建有效的应用程序包或 Ant 文件,您需要执行以下步骤:
设置正确的目录层次结构。顶级目录应以您的应用程序名称命名,后缀为 .app
。
在应用程序包的根目录下应该有一个目录。它应该包含一个 MacOS 目录和一个 Resources 目录。 Java 目录应位于资源目录内。
目录布局应如下所示:
YourApplicationName.app/
Contents/
MacOS/
Resources/
Java/
将 JavaApplicationStub
文件从 /System/Library/Frameworks/JavaVM.framework/Versions/Current/Resources/MacOS/
复制到 MacOS
应用程序包的目录。
在应用程序包的 Contents
目录中创建一个 Info.plist
文件。您可以从现有 Java 应用程序(例如 Jar Bundler)中的示例开始,然后对其进行修改或从头开始生成一个全新的示例。请注意,除非您在此属性列表中设置了正确的属性,尤其是 MainClass
键,否则应用程序包不会启动。
创建一个 PkgInfo
文件在 Contents
目录中。它应该是一个纯文本文件。如果你没有在ADC注册过创建者代码,那么内容应该是APPL????
。如果您已经注册了创建者代码,请将 ????
替换为您的创建者代码。
将应用程序的图标文件放入 Contents/Resources/
目录。使用 Developer/Applications/Utilities
中的 Icon Composer 来帮助创建图标文件。
复制您的 Java .jar
或 .class
文件放入 Contents/Resources/Java/
。
使用 SetFile
设置 bundle bit Finder 属性,在 /Developer/Tools 中找到/
。例如,/Developer/Tools/SetFile -a B YourApplicationName.app
。有关 SetFile
的更多信息,请参阅手册页。
完成这些步骤后,您应该有一个可双击的应用程序包,其中包含您的 Java 应用程序。
最佳答案
OSX 应用程序需要捆绑,所以请阅读 Oracle Java OSX Distribution和 Apple Java Bundles .之后,您将能够通过命令行启动它们(只需要求手动运行 stub )。
关于Java 可执行 jar 不能作为 ./program.jar 在 OS X 上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37343014/