3

我正面临这个奇怪的问题。

我正在尝试将位于另一台机器中的文件作为共享资源读取:

\\remote-machine\dir\MyFileHere.txt

当我运行一个独立的应用程序(一个 16 行的 java 文件)时,一切都很好。但是,当我尝试从服务器“引擎”(这是一个应用程序引擎,非常类似于可以运行 Java 程序的 Java EE 应用程序服务器)使用相同的类和相同的方法读取相同的文件时,“FileNotFoundException”被抛出。

我虽然我会获得某种权限,所以我将资源映射为驱动器:K:\

重新运行我的java文件,读取,很好。

在“引擎”-> FileNotFoundException 中重新运行我的 java 文件。

当我将文件复制到本地机器( C:\MyFileHere.txt )时,不会引发异常。

问题

什么可能导致此 FileNotFoundExcecption?

我正在使用 Java 1.5

据我所知,引擎几乎透明地使用了 java。

有人遇到过类似的事情吗?

附加问题?解决此问题的好方法是什么?我开始考虑为这些文件提供服务并通过http读取它们的tomcat安装,但我认为这太过分了,这就是为什么首先使用SMB协议不是吗?而且可能我无论如何都无法打开套接字。

安全管理器是否可能是原因(我以前从未使用过,但我知道它存在)

如果是这种情况,是否会抛出 SecurityException ?

非常感谢。

编辑

解决了。谢谢史蒂夫·W。

事实证明,这个引擎是用 ZeroG 的“LaunchAnywhere”启动的。因此,将创建一个 .exe,然后将运行具有指定应用程序的 JVM。

这个应用程序本身就是 Launcher。当它启动引擎时,以某种方式(我不知道为什么或如何)拥有 JVM 进程的用户是 SYSTEM。正如史蒂夫指出的那样,该用户没有网络访问权限,因此无法从共享资源或映射驱动器中读取。

解决方法(当我向制造商报告时)是创建一个 .cmd 文件来手动启动引擎。由于它将手动启动,因此用户确实可以访问网络。

我使用 SysInternals 的“Process Explorer”来准确了解用于运行引擎应用程序的命令行。

真是一团糟!

感谢那些发布答案的人。

4

4 回答 4

6

共享资源是否受用户名和密码保护?如果是这样,您的应用程序引擎是否以该用户身份运行?如果您的应用程序引擎作为 Windows 服务运行,则 Windows 服务不能作为“本地系统帐户”运行。此帐户无法访问网络。您必须将服务配置为以有权访问共享驱动器的用户身份运行。

于 2009-01-28T04:43:52.653 回答
0

仔细检查文件是否真的被称为“MyFileHere.txt”而不是“MyFileHere.txt.txt”如果您隐藏文件的扩展名,这是一个容易错过的错误

于 2009-01-28T05:03:09.587 回答
0

您是否检查了服务器上的事件日志以查看它是否被拒绝?可能是程序在与您想象的不同的用户帐户下运行。

我不熟悉Java,但我知道我编写的一些程序必须允许网络服务访问资源。

实际上,我看到您现在已将答案标记为正确答案。哦,这和我的回答一样 :) 酷!

于 2009-01-28T06:28:06.577 回答
0

我曾经遇到过类似的问题。我认为这与java解析远程文件URI的方式有关。尝试以下方法,看看它是否有效:

File:////remote-machine/dir/MyFileHere.txt

我使用以下示例来验证我的盒子中共享文件夹中是否存在文件并工作:

public static void main(String[] args) throws URISyntaxException{
    URI uri = new URI(args[0]); //args[0] = File:////remote-machine/dir/MyFileHere.txt
    File f = new File(uri);
    System.out.print(String.format("File %1$s Exists? %2$s", args[0],f.exists()));
}
于 2009-01-28T06:38:44.730 回答