Domanda

Sto affrontando questo strano problema.

Sto cercando di leggere un file che si trova in un'altra macchina come risorsa condivisa:

\\remote-machine\dir\MyFileHere.txt

Quando eseguo un'applicazione standalone (un file java a 16 righe) tutto va bene. Ma quando provo a leggere lo stesso file usando la stessa classe e lo stesso metodo da un server & Quot; engine & Quot; (questo è un motore di applicazione, più o meno come un Java EE Application Server in cui è possibile eseguire programmi Java) il " FileNotFoundException " viene lanciato.

Pensavo di avere una sorta di autorizzazione, quindi mappa la risorsa come unità: K: \

Riesegui il mio file java, legge, va bene.

Riesegui il mio file java all'interno del " engine " - gt &; FileNotFoundException.

Quando copio il file sul computer locale (C: \ MyFileHere.txt) non viene generata alcuna eccezione.

Domanda

Cosa può causare questo FileNotFoundExcecption?

Sto usando Java 1.5

Per quanto ne so, il motore usa praticamente java in modo trasparente.

Qualcuno ha affrontato qualcosa di simile?

Domanda aggiuntiva? Quale sarebbe un buon approccio per risolvere questo problema? Sto iniziando a pensare a un'installazione Tomcat che serve quei file e li leggo tramite http, ma penso che sia troppo, ecco perché il protocollo SMB è in primo luogo non è vero? E probabilmente non sarò comunque in grado di aprire socket.

Il responsabile della sicurezza potrebbe essere la causa (non l'ho mai usato prima, ma so che esiste)

Se non fosse il caso, verrebbe lanciata una SecurityException?

Grazie mille.

Modifica

risolto. Grazie Steve W.

Si scopre che questo motore è lanciato con " LaunchAnywhere " da ZeroG. Quindi, viene creato un file .exe che a sua volta eseguirà una JVM con l'app specificata.

Questa applicazione è di per sé Launcher. Quando avvia il motore, in qualche modo (non riesco a capire perché o come) l'utente che possiede il processo JVM è SYSTEM. Come ha sottolineato Steve, questo utente non ha accesso alla RETE e quindi non può leggere da una risorsa condivisa o un'unità mappata.

La soluzione alternativa (mentre lo riferisco al produttore) è creare un file .cmd per lanciare manualmente il motore. Dal momento che verrebbe lanciato manualmente, l'utente ha accesso alla rete.

Ho usato " Process Explorer " da SysInternals per conoscere esattamente la riga di comando utilizzata per eseguire l'app del motore.

CHE COSA UN MESS!

Grazie a coloro che hanno pubblicato le risposte.

È stato utile?

Soluzione

La risorsa condivisa è protetta da un nome utente e una password? E se è così, il tuo motore dell'applicazione funziona come quell'utente? Se il motore dell'applicazione è in esecuzione come servizio Windows, il servizio Windows non può essere eseguito come & Quot; Account di sistema locale & Quot ;. Questo account non può accedere alla rete. È necessario configurare il servizio per l'esecuzione come utente con diritti di accesso all'unità condivisa.

Altri suggerimenti

Ricontrolla che il file è VERAMENTE chiamato " MyFileHere.txt " e non " MyFileHere.txt.txt " Se stai nascondendo l'estensione del file, questo è un errore facile da perdere

Hai controllato i log degli eventi sul server per vedere se è stato rifiutato? è possibile che il programma sia eseguito con un account utente diverso da quello che pensi.

Non conosco Java, ma conosco alcuni programmi che ho scritto e che ho dovuto consentire al servizio di rete di accedere alle risorse.

In realtà vedo che ora hai spuntato una risposta come quella corretta. oh ed è stata la stessa della mia risposta :) Cool!

Ho avuto un problema simile una volta. Penso che abbia a che fare con il modo in cui java risolve gli URI dei file remoti. Prova quanto segue e vedi se funziona:

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

Ho usato l'esempio seguente per verificare l'esistenza di un file nelle cartelle condivise nella mia scatola e ho funzionato:

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()));
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top