FileNotFoundException lançada quando o arquivo existe
Estou enfrentando esse problema estranho.
Estou tentando ler um arquivo localizado em outra máquina como um recurso compartilhado:
\\remote-machine\dir\MyFileHere.txt
Quando executo um aplicativo independente (um arquivo java de 16 linhas), tudo fica bem. Mas quando tento ler o mesmo arquivo usando a mesma classe e o mesmo método em um "mecanismo" de servidor (este é um mecanismo de aplicativo, praticamente como um Java EE Application Server onde você pode executar programas java), o "FileNotFoundException" é jogado.
Embora eu tenha algum tipo de permissão, mapeio o recurso como uma unidade: K: \ Re-execute o meu arquivo java, lê, tudo bem.
Execute novamente o meu arquivo java dentro do "engine" -> FileNotFoundException.
Quando copio o arquivo na máquina local (C: \ MyFileHere.txt), nenhuma exceção é lançada.
Pergunta, questão
O que pode estar causando essa FileNotFoundExcecption?
Estou usando Java 1.5
Até onde eu sei, o mecanismo praticamente usa java de forma transparente.
Alguém já enfrentou algo semelhante?
Pergunta adicional? Qual seria uma boa abordagem para solucionar isso? Estou começando a pensar em uma instalação do tomcat que serve esses arquivos e os lê através de http, mas acho que isso é demais, é por isso que o protocolo SMB é válido em primeiro lugar, não é? E provavelmente não poderei abrir soquetes de qualquer maneira.
O gerenciador de segurança pode ser a causa (nunca usei isso antes, mas sei que ele existe)
Não será lançada uma SecurityException, se esse for o caso?
Muito obrigado.
EDITAR
Resolvido. Obrigado Steve W.
Acontece que esse mecanismo é lançado com o "LaunchAnywhere" da ZeroG. Portanto, é criado um .exe que, por sua vez, executará uma JVM com o aplicativo especificado.
Esta aplicação é auto Launcher. Quando ele inicia o mecanismo, de alguma forma (não consigo descobrir por que ou como) o usuário que possui o processo da JVM é SYSTEM. Como Steve apontou, esse usuário não tem acesso à REDE e, portanto, não pode ler de um recurso compartilhado ou de uma unidade mapeada.
A solução alternativa (enquanto eu relato isso ao fabricante) é criar um arquivo .cmd para iniciar manualmente o mecanismo. Desde que seria iniciado manualmente, o usuário tem acesso à rede.
Eu usei o "Process Explorer" da SysInternals para saber exatamente a linha de comando usada para executar o aplicativo de mecanismo.
QUE BAGUNÇA!
Obrigado a quem postou respostas.
O recurso compartilhado está protegido por um nome de usuário e senha? E se sim, seu mecanismo de aplicativo está sendo executado como esse usuário? Se o seu mecanismo de aplicativo estiver sendo executado como um serviço do Windows, o serviço do Windows não poderá ser executado como a "Conta do sistema local". Esta conta não pode acessar a rede. Você deve configurar seu serviço para ser executado como um usuário com direitos para acessar a unidade compartilhada.