2009-01-28 10 views
3

Je suis confronté à ce problème étrange.FileNotFoundException levée lorsque le fichier existe

Je suis en train de lire un fichier qui se trouve dans une autre machine comme une ressource partagée:

\\remote-machine\dir\MyFileHere.txt 

Quand je lance une application autonome (un fichier java 16 lignes) tout est très bien. Mais quand j'essaye de lire le même fichier en utilisant la même classe et la même méthode d'un "moteur" de serveur (c'est un moteur d'application, à peu près comme un Java EE Application Server où vous pouvez exécuter des programmes java) "FileNotFoundException" Est lancé.

Je croyais que je serais une sorte d'autorisations, donc je carte la ressource en tant que lecteur: K: \

Réexécutez mon fichier java, lit, très bien.

Redémarrez mon fichier java dans le "moteur" -> FileNotFoundException.

Lorsque je copie le fichier dans la machine locale (C: \ MyFileHere.txt) aucune exception n'est levée.

Question

Ce qui peut être la cause FileNotFoundExcecption?

J'utilise Java 1.5

Pour autant que je sais le moteur à peu près usages Java transparente.

Quelqu'un at-il fait face à quelque chose de similaire?

Question supplémentaire? Quelle serait une bonne approche pour contourner ce problème? Je commence à penser à une installation de Tomcat servant ces fichiers et à les lire via http, mais je pense que c'est trop, c'est pourquoi le protocole SMB est pour en premier lieu n'est-ce pas? Et probablement je ne serai pas capable d'ouvrir les sockets de toute façon.

Est responsable de la sécurité peut être la cause (je ne l'ai jamais utilisé ça avant, mais je sais qu'il existe)

Wound't un SecurityException être jeté à la place si ce serait le cas?

Merci beaucoup.

EDIT

résolu. Merci Steve W.

Il s'avère que ce moteur est lancé avec "LaunchAnywhere" de ZeroG. Ainsi, un .exe est créé qui à son tour exécutera une JVM avec l'application spécifiée.

Cette application elle-même est Launcher. Quand il démarre le moteur, en quelque sorte (je ne peux pas comprendre pourquoi ou comment) l'utilisateur qui possède le processus JVM est SYSTEM. Comme l'a souligné Steve, cet utilisateur n'a pas d'accès au réseau et ne peut donc pas lire à partir d'une ressource partagée ou d'un lecteur mappé.

La solution de contournement (alors que je signale cela au fabricant) consiste à créer un fichier .cmd pour lancer manuellement le moteur. Comme il serait lancé manuellement, l'utilisateur a accès au réseau.

J'ai utilisé "Process Explorer" de SysInternals pour connaître exactement la ligne de commande utilisée pour exécuter l'application du moteur.

QUOI UN MESS!

Merci à ceux qui ont répondu.

Répondre

5

La ressource partagée est-elle protégée par un nom d'utilisateur et un mot de passe? Et si c'est le cas, votre moteur d'application fonctionne-t-il en tant qu'utilisateur? Si votre moteur d'application s'exécute en tant que service Windows, le service Windows ne peut pas s'exécuter en tant que «compte système local». Ce compte ne peut pas accéder au réseau. Vous devez configurer votre service pour qu'il s'exécute en tant qu'utilisateur disposant des droits d'accès au lecteur partagé.

+0

1ère: Cela s'applique. 2ndq: n'est pas. 3ème n'est pas un service, mais en regardant attentivement, le lanceur s'exécute en tant qu'utilisateur local, mais ce lanceur (bien) lance l'application moteur dont l'utilisateur est SYSTEM (donc pas autorisé à utiliser le réseau): -/Dois-je voir comment ce lanceur peut démarrer l'application pas comme système? – OscarRyz

+0

Je regarde le "moteur" a été lancé en utilisant LaunchAnywhere (à partir de zerog) Je ne sais pas comment il démarre la nouvelle machine virtuelle en utilisant le système: -/ – OscarRyz

+0

Cette réponse a donné l'indice pour résoudre le problème. Merci beaucoup. – OscarRyz

0

Vérifier que le fichier est vraiment appelé « MyFileHere.txt » et non « MyFileHere.txt.txt » Si vous cachez l'extention du fichier est ce une erreur facile à manquer

+0

Mais là encore, je n'ai pas vraiment lu toute votre question. Je me souviens juste que le problème mentionné ci-dessus est arrivé et que je me grattais la tête en déboguant le problème pour quelqu'un –

+0

Double et hyper triple vérifié. Aussi les espaces blancs etc. Je code même dur le chemin dans le fichier java et il fonctionne bien avec java TestRead. Mais quand la classe TestRead est chargée dans le moteur, elle lance FNFE. – OscarRyz

0

Avez-vous vérifié l'événement se connecte sur le serveur pour voir s'il est rejeté? Il se peut que le programme s'exécute sous un compte d'utilisateur différent de ce que vous pensez. Je ne suis pas familier avec Java, mais je sais qu'avec certains programmes que j'ai écrits j'ai dû permettre au service de réseau d'accéder aux ressources.

En fait, je vois que vous avez maintenant coché une réponse comme la bonne. oh et c'était la même chose que ma réponse :) Cool!

+0

jejej Yeap .. merci beaucoup. En fait, vos déductions étaient assez proches. Je ne suis pas très au courant des services Windows moi-même, et cela m'a pris par surprise. Mais j'ai finalement eu un bon indice avec la suggestion de Steve. ufff Merci quand même. – OscarRyz

0

J'ai eu un problème similaire une fois. Je pense que cela a à voir avec la façon dont java résout les URI de fichiers distants. Essayez ce qui suit et voir si cela fonctionne:

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

J'ai utilisé l'exemple folowing pour vérifier l'existence d'un fichier dans des dossiers partagés dans ma boîte et travaillé:

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())); 
} 
+0

Merci Igor. Ce n'est pas le cas, car le même «chemin» a été utilisé à l'intérieur et à l'extérieur du moteur. Le problème était que la machine virtuelle était créée en utilisant comme utilisateur SYSTEM dont l'accès aux ressources réseau n'est pas disponible. Merci pour la réponse si. – OscarRyz