Pergunta

Eu estou enfrentando esse problema estranho.

Eu estou tentando ler um arquivo que está localizado na outra máquina como um recurso compartilhado:

\\remote-machine\dir\MyFileHere.txt

Ao executar um aplicativo independente (um arquivo java 16 linhas) está tudo bem. Mas quando tento ler o mesmo arquivo com o uso da mesma classe e o mesmo método de um servidor "motor" (este é um motor de aplicação, muito bonito como um Java EE Application Server onde você pode executar programas Java) a "FileNotFoundException" é lançada.

Eu pensei que seria algum tipo de permissões, então eu mapear o recurso como uma unidade: K: \

Volte a executar meu arquivo java, lê, tudo bem.

Volte a executar meu arquivo java dentro do "motor" -.> FileNotFoundException

Quando eu copiar o arquivo na máquina local. (C: \ MyFileHere.txt) nenhuma exceção é acionada

Pergunta

O que pode estar causando isso FileNotFoundExcecption?

Eu estou usando Java 1.5

Tanto quanto eu sei o motor praticamente usa Java de forma transparente.

Qualquer um tem enfrentado algo semelhante?

Pergunta adicional? O que seria uma boa abordagem para solução alternativa esse? Eu estou começando a pensar em uma instalação tomcat servir esses arquivos e lê-los através de http, mas eu acho que é muito, é por isso que o protocolo SMB é para em primeiro lugar, não é? E, provavelmente, não será capaz de soquetes abertos de qualquer maneira.

gerente de segurança não pode ser a causa (Eu nunca usei isso antes, mas eu sei que ela existe)

Wound't um SecurityException ser jogado em vez se que seria o caso?

Muito obrigado.

Editar

resolvido. Obrigado Steve W.

Acontece que este motor é iniciado com "LaunchAnywhere" de ZeroG. Assim, um .exe é criado que por sua vez irá executar uma JVM com o aplicativo especificado.

Esta aplicação auto-é o Launcher. Quando se ligar o motor, de alguma forma (eu não posso descobrir por que ou como) o usuário que possui o processo JVM é SYSTEM. AS Steve apontou, este usuário não tem acesso à rede, e, portanto, não pode ler a partir de um recurso compartilhado ou uma unidade mapeada.

A solução (enquanto eu relatar isso para o fabricante) é criar um arquivo .cmd para lauch manualmente o mecanismo. Desde que seria lançado manualmente o usuário tem acesso à rede.

Eu usei "Process Explorer" da SysInternals saber exatamente a linha de comando usado para executar o aplicativo do motor.

Que confusão!

Obrigado a todos aqueles que postou respostas.

Foi útil?

Solução

É o recurso compartilhado protegido por um nome de usuário e senha? E se assim for, é o seu motor de aplicativo executado como esse usuário? Se o seu motor aplicativo está sendo executado como um serviço do Windows, o serviço do Windows não pode ser executado como a "Conta do Sistema Local". Esta conta não pode acessar a rede. É necessário configurar o serviço para ser executado como um usuário que tem os direitos para acessar a unidade compartilhada.

Outras dicas

Verifique se o arquivo é realmente chamado "MyFileHere.txt" e não "MyFileHere.txt.txt" Se você está escondendo a extensão do arquivo é um erro fácil de perder

Você verificou os logs de eventos no servidor para ver se ele está sendo rejeitado? pode ser que o programa é executado sob uma conta de utilizador diferente do que você pensa.

Eu não estou familiarizado com Java, mas eu sei que com alguns programas que eu escrevi eu tive para permitir serviço de rede para acessar os recursos.

Na verdade eu ver que você já tenha marcado uma resposta como a correta. oh e foi a mesma que a minha resposta :) Cool!

Eu tive um problema semelhante uma vez. Eu acho que tem a ver com as resoluções java forma como os arquivos remoto URI. Tente o seguinte e ver se ele funciona:

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

Eu usei o exemplo folowing para verificar a existência de um arquivo em pastas compartilhadas na minha caixa de e trabalhou:

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()));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top