Java 可执行 jar 不能作为 ./program.jar 在 OS X 上执行

标签 java linux macos jar

使用 Linux,我运行一些我用 Java 编写的程序,方法是将它们压缩到带有 list 文件的 jar 中,然后将它们放在已添加到我的 $PATH 中的个人目录中,如下所示: program.jar 文件 2 文件 2。它在我将控制台指向的任何目录中都运行良好,我什至可以执行 program.jar file1 | lessprogram.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 DistributionApple Java Bundles .之后,您将能够通过命令行启动它们(只需要求手动运行 stub )。

关于Java 可执行 jar 不能作为 ./program.jar 在 OS X 上执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37343014/

相关文章:

java - 从 JTextArea 清除附加文本

java - 如何将 JTable 中第一行的颜色设置为黄色(或任何颜色)?

java - 如何在java中对整数的数字求和?

linux - gawk 和 shell 脚本的单引号问题

linux - 将空格和\字符附加到每一行,最后一行除外

swift - mac app打开后如何执行命令

java - 为什么在 JNI 中调用纤程会在 JVM 中引发 StackOverflow?

linux - 如何配置我的 apache2 网络服务器以允许从 192.168 内的任何内容进行访问?

python - 如何使 `cv2.imshow()`窗口适合屏幕显示?

macos - Sublime Text 2 Mac Markdown 预览键绑定(bind)