运行 Java 来自 OSX “.app” 包导致 "Error -10810"

Running Java from an OSX ".app" bundle causes "Error -10810"

这已通过虚拟框在 OSX Mavericks 上进行测试,在 macbook 上 Yosemite 上进行了测试。

我有一个名为“HelloWorld.jar”的简单可执行 jar。

我正在尝试为此 java 应用程序创建一个 .app 包。 (显然,我的实际程序更复杂,但我已将其缩减为最基本的问题)。


案例 1 - 没有 JAVA 的简单捆绑 - 完全有效

第 1 步 - 在控制台测试 - 有效

我在控制台输入

echo "Hello World (no java)" > /Users/josh/Desktop/test-output.txt

我查看了 test-output.txt 并看到了预期的输出。

第 2 步 - 使用脚本进行测试 - 有效

我制作了一个简单的 bash 脚本,名为 test:

 #!/bin/bash
 echo "Hello World (no java)" > /Users/josh/Desktop/test-output.txt

I chmod +x test 然后键入 ./test,我查看 test-output.txt 并看到预期的输出。

第 3 步 - 创建基本应用程序包 - 有效

mkdir -p test.app/Contents/MacOS
cp test test.app/Contents/MacOS
open test.app

我查看了 test-output.txt 并看到了预期的输出。


案例 2 - JAVA 的简单捆绑包 - 不起作用

设置

文件HelloWorld.java:

public class HelloWorld {
    public static void main ( String[] args ) {
        System.out.println ( "Hello World" );
    }
}

文件myManifest

Main-Class: HelloWorld

在控制台做了以下操作:

javac HelloWorld.java
jar -cfm HelloWorld.jar myManifest HelloWorld.class
 

第 1 步 - 在控制台测试 - 有效

我在控制台输入:

java -jar HelloWorld.jar > /Users/josh/Desktop/java-output.txt

我得到了预期的输出:Hello World

第 2 步 - 使用脚本进行测试 - 有效

我制作了一个名为“helloworld”的简单 bash 脚本

 #!/bin/bash
 java -jar HelloWorld.jar > /Users/josh/Desktop/java-output.txt 

I chmod +x helloworld 然后键入 ./helloworld,我得到预期的输出:Hello World

第 3 步(使用 Java)- 不起作用

mkdir -p helloworld.app/Contents/MacOS
cp helloworld helloworld.app/Contents/MacOS
cp HelloWorld.jar helloworld.app/Contents/MacOS
open helloworld.app

我收到以下错误:

LSOpenURLsWithRole() failed with error -10810 for the file /Users/josh/Desktop/helloworld/helloworld.app

/user/Josh/desktop/java-output.txt 出现,但里面没有文字。


如您所见,.app 包中的 运行 java 似乎发生了一些事情,给我带来了 -10810 错误。

注意:我还尝试了第一个示例的变体,其中我让 bash 脚本启动 /Applications/TextEdit.app,并且成功运行。这让我怀疑问题出在 java 上。

有谁知道是什么导致了这个问题,我该如何解决?

我目前没有方便的 OS X 机器来测试它,但是来自 another question 的网络提示似乎暗示您需要设置 JAVA_HOME 并且可能 PATH 以便 java 在应用程序包中工作。

具体来说,在您的 shell 脚本的顶部,在尝试 运行 您的程序之前,放置以下行,并针对您的系统进行适当的更改。

export JAVA_HOME=/path/to/my/java/install
export PATH=$PATH:/path/to/directory/containing/java

更一般地说,要诊断问题的根本原因,请更改脚本中的现有行以捕获 stderr 并查看这是否为您提供任何有用的输出,否则这些输出可能会被应用程序的环境吞没.

 java -jar HelloWorld.jar > /Users/josh/Desktop/java-output.txt  2>  /Users/josh/Desktop/java-error.txt

如果您能够捕捉到打印的错误,就足以告诉您根本原因。