运行 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
如果您能够捕捉到打印的错误,就足以告诉您根本原因。
这已通过虚拟框在 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
如果您能够捕捉到打印的错误,就足以告诉您根本原因。