2009-04-17 4 views
7

Questo è da capogiro ... Posso rendere getResource() e getResourceAsStream() funzionano correttamente quando eseguo Java sul mio file JAR compresso che include un file di testo. (per riferimento vedere i documenti Sun su accessing resources) Non riesco a far funzionare lo stesso programma correttamente quando lo eseguo all'interno di Eclipse, anche se ho inserito il mio file di testo nello stesso albero dei miei file .class compilaticome si esegue getResourceAsStream mentre si esegue il debug di Java in Eclipse?

È possibile che uno di voi punti a qualche sottigliezza per garantire che le funzioni getResource() e getResourceAsStream() funzionino correttamente?

Ho l'impressione che abbia a che fare con CLASSPATH e/o dove Eclipse mette i file .class in modo automatico. (Ho notato che quando eseguo Ant, compila tutti i file Java che sono cambiati dalla mia ultima build Ant, anche se Eclipse ha già compilato quei file Java.)

+0

fare riferimento alla risposta di eugener http://stackoverflow.com/questions/5490547/problem-loading-resources-while-running-in-eclipse –

risposta

10

Se metti il ​​tuo file di testo insieme alla tua fonte file, Eclipse lo copierà ovunque stia posizionando i suoi file .class compilati, e così vedrai il tuo file di testo quando eseguirai la tua app da Eclipse (e potrai anche modificare il file da Eclipse).

+1

Assicurarsi inoltre che Eclipse sia a conoscenza dei file: "Aggiorna" l'albero di origine se sono stati aggiunti al di fuori di Eclipse. (Come notato da Jason S in un'altra risposta.) –

1

Ho l'impressione che abbia a che fare con CLASSPATH e/o dove Eclipse mette i file .class in modo automatico.

Nella configurazione di esecuzione, tuttavia, per avviare l'applicazione, passare alla scheda Percorso di classe e aggiungere la cartella radice del percorso che si sta utilizzando per accedere al file.

Ad esempio, se si sta tentando di caricare "blah/file.txt" e il file si trova in "cartella/blah/file.txt", aggiungere "cartella" al classpath. Se stai cercando di caricare la risorsa con "file.txt", aggiungi "folder/blah".

0

Che cosa intendi esattamente per "funzionare correttamente"? Qual è l'errore/comportamento?

io suggerisco di usare getResource per trovare l'URL di uno dei tuoi file .class (o approssimativamente equivalente getClass().getProtectionDomain().getCodeSource() Potreste scoprire che si sta puntando da qualche parte inaspettato

16

Alcune note:

First - come.. Chocos dice, mettilo nelle dirs di eclipse, non nelle directory binarie.Eclipse cancellerà le directory binarie quando "pulisci" e ripulirà i file non corrispondenti. Copierà i file di origine non java nella directory binario.

Ciò significa che anche se si rilascia il file nel file b ir, può essere cancellato da eclissi ...

Tenere presente che getResourceAsStream e getResource operano in relazione al pacchetto del codice che li chiama. Per esempio:

package a.b.c; 
public class Foo { 
    ... 
    getClass().getClassLoader().getResourceAsStream("fee.txt"); 
    ... 
} 

Questo cercherà in realtà a/b/c/fee.txt; il pacchetto è pre-sospeso. Questo funziona bene se si ha il fee.txt nella stessa dir sorgente del file Foo.java, o se si ha un insieme separato di dir delle risorse sul classpath con la stessa struttura di directory.

Se si utilizza

...getResourceAsStream("/fee.txt"); 

cercherà fee.txt direttamente sul classpath.

Quando si esegue dalla riga di comando, dove nel JAR è il file di risorse? - Scott

2

Trovato il problema!

I ha fatto avere i miei file di immagine nell'albero dei sorgenti. (nella mia build Ant, li copio nella directory di costruzione)

Il problema era che non avevo fatto un recente aggiornamento dell'albero sorgente in Eclipse. Quindi i file erano lì ma Eclipse non prestava loro alcuna attenzione.

Grazie per avermi informato sul fatto che Eclipse dovrebbe averli nel mio albero dei sorgenti.

+1

Se vai a Finestra-> Preferenze-> Generale-> Area di lavoro, seleziona la casella "Aggiorna automaticamente" per prevenire questo problema in futuro. Altrimenti, assicurati di aggiungere elementi al progetto tramite eclipse (puoi File-> Importa e su alcune piattaforme trascinare gli elementi nel progetto) –

1

Ho avuto lo stesso problema con IntelliJ, la soluzione per questo era, Nelle impostazioni del progetto, aggiungere la cartella con i file di risorse, nel mio caso i file audio, come sorgente. Aggiungi? *. Wav (o il tuo tipo di prefetto) in Impostazioni-> Modelli di risorsa del compilatore.