【问题标题】:Running Java from an OSX ".app" bundle causes "Error -10810"从 OSX“.app”包运行 Java 会导致“错误 -10810”
【发布时间】:2015-04-16 08:32:41
【问题描述】:

这是通过虚拟盒子在 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 步 - 创建基本的 App Bundle - 工作

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 上。

有谁知道是什么导致了这个问题以及如何解决它?

【问题讨论】:

  • 我不认为你可以创建一个足够完整的包,只做你在这里展示的。使用 appbundle 怎么样? docs.oracle.com/javase/7/docs/technotes/guides/jweb/…
  • "Case 1" 向我表明捆绑包是完整的。我在 Windows 机器上与 appbundler 搏斗了几天,但始终无法从中获得工作包。
  • 您是否通过在要复制到应用程序中的 bash 脚本中使用 Java 的完整路径来验证这不是 PATH 问题?

标签: java macos bash packaging


【解决方案1】:

我目前没有方便测试的 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

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

【讨论】:

  • 谢谢。我今晚会测试一下,然后告诉你结果。
  • 控制台出现同样的错误。 java-error.txt 说“错误:无法访问 jarfile HelloWorld.jar”
  • 我会调查一下并回复你。
  • 在脚本中添加了“密码”。当我正常运行它时,它会报告当前目录。但是,当它在 .app 中时,它会报告“/”是工作目录。我认为这可能是问题所在,尚不知道如何解决。
  • 使用 jar 的绝对路径。
猜你喜欢
  • 2012-06-12
  • 2013-07-08
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多