从OSX“.app”包运行Java导致“错误-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步 – 使用脚本测试 – 工作
我创建了一个名为test
的简单bash脚本:
#!/bin/bash echo "Hello World (no java)" > /Users/josh/Desktop/test-output.txt
我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
我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机器可以方便地测试这个,但是从另一个问题上网上的提示似乎暗示你需要设置JAVA_HOME
和可能的PATH
才能让java
在app包内工作。
具体来说,在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
如果您能够捕获打印的错误,则可能足以向您显示根本原因。