从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()失败,文件错误为-10810 /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在app bundle中工作.

具体来说,在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

如果您能够捕获打印错误,则可能足以向您显示根本原因.

上一篇:c – 如何从非Qt函数访问Qt资源数据


下一篇:JS之DOM篇-查询计算样式