Pregunta

Estoy enfrentando este extraño problema.

Estoy tratando de leer un archivo que se encuentra en otra máquina como un recurso compartido:

\\remote-machine\dir\MyFileHere.txt

Cuando ejecuto una aplicación independiente (un archivo java de 16 líneas) todo está bien. Pero cuando intento leer el mismo archivo usando la misma clase y el mismo método desde un servidor & Quot; engine & Quot; (este es un motor de aplicaciones, más o menos como un servidor de aplicaciones Java EE donde puede ejecutar programas java) " FileNotFoundException " es arrojado.

Pensé que tendría algún tipo de permisos, así que mapeo el recurso como una unidad: K: \

Vuelva a ejecutar mi archivo java, lee, bien.

Vuelva a ejecutar mi archivo java dentro de " engine " - > FileNotFoundException.

Cuando copio el archivo en la máquina local (C: \ MyFileHere.txt) no se produce ninguna excepción.

Pregunta

¿Qué puede estar causando esta FileNotFoundExcecption?

Estoy usando Java 1.5

Hasta donde yo sé, el motor usa java de forma transparente.

¿Alguien ha enfrentado algo similar?

Pregunta adicional? ¿Cuál sería un buen enfoque para solucionar esto? Estoy empezando a pensar en una instalación de tomcat que sirve esos archivos y los leo a través de http, pero creo que es demasiado, por eso el protocolo SMB es para empezar, ¿no? Y probablemente no podré abrir tomas de todos modos.

El administrador de seguridad puede ser la causa (nunca lo he usado antes, pero sé que existe)

¿No se lanzaría una excepción de seguridad si ese fuera el caso?

Muchas gracias.

EDIT

Resuelto. Gracias Steve W.

Resulta que este motor se inicia con " LaunchAnywhere " de ZeroG. Entonces, se crea un .exe que a su vez ejecutará una JVM con la aplicación especificada.

Esta aplicación en sí misma es Launcher. Cuando arranca el motor, de alguna manera (no puedo entender por qué o cómo) el usuario que posee el proceso JVM es SYSTEM. Como señaló Steve, este usuario no tiene acceso a la RED y, por lo tanto, no puede leer desde un recurso compartido o una unidad asignada.

La solución (mientras informo esto al fabricante) es crear un archivo .cmd para iniciar manualmente el motor. Dado que se lanzaría manualmente, el usuario tiene acceso a la red.

He usado " Process Explorer " de SysInternals para saber exactamente la línea de comando utilizada para ejecutar la aplicación del motor.

¡QUÉ MENSAJES!

Gracias a quienes publicaron respuestas.

¿Fue útil?

Solución

¿El recurso compartido está protegido por un nombre de usuario y contraseña? Y si es así, ¿está funcionando su motor de aplicaciones como ese usuario? Si el motor de su aplicación se ejecuta como un Servicio de Windows, el servicio de Windows no se puede ejecutar como & Quot; Cuenta del sistema local & Quot ;. Esta cuenta no puede acceder a la red. Debe configurar su servicio para que se ejecute como un usuario que tiene derechos para acceder a la unidad compartida.

Otros consejos

Verifique que el archivo REALMENTE se llame " MyFileHere.txt " y no " MyFileHere.txt.txt " Si está ocultando la extensión del archivo, este es un error fácil de omitir

¿Ha verificado los registros de eventos en el servidor para ver si se rechaza? podría ser que el programa se ejecute con una cuenta de usuario diferente de la que cree.

No estoy familiarizado con Java, pero sé que con algunos programas que he escrito he tenido que permitir que el Servicio de red acceda a los recursos.

En realidad, veo que has marcado una respuesta como la correcta. ah y fue lo mismo que mi respuesta :) ¡Genial!

Tuve un problema similar una vez. Creo que tiene que ver con la forma en que Java resuelve los archivos URI remotos. Pruebe lo siguiente y vea si funciona:

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

Utilicé el siguiente ejemplo para verificar la existencia de un archivo en carpetas compartidas en mi caja y trabajé:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top