2010-07-20 20 views
8

Ho già cercato StackOverflow per "proprietà all'interno della guerra", ma nessuno dei risultati ha funzionato per il mio caso.Java: accesso al file delle proprietà all'interno di una guerra

Sto utilizzando Eclipse Galileo e GlassFish v3 per sviluppare una serie di servizi Web. Sto usando un "progetto web dinamico" con la seguente struttura

Src 
-java_code_pkg_1 
-java_code_pkg_2 
-com.company.config 
--configfile.properties WebContent 
-META-INF 
-WEB-INF 
--log4jProperties 
--web.xml 
--applicationContext.xml 
--app-servlet.xml 

voglio accedere i "configfile.properties" all'interno di uno dei file di origine in "java_code_pkg1". Sto usando Spring Framework e questo file verrà istanziato una volta che l'applicazione si avvia sul server.

ho provato quanto segue senza fortuna

getResourceAsStream("/com.company.config/configfile.properties"); 
getResourceAsStream("/com/company/config/configfile.properties"); 
getResourceAsStream("com/company/config/configfile.properties"); 
getResourceAsStream("/configfile.properties"); 
getResourceAsStream("configfile.properties"); 

getResourceBundle(..) didn't work either. 

E 'possibile accedere a un file quando non è sotto la traiettoria di WEB-INF/classes? se è così allora come?

Grazie

risposta

7
Properties props = new Properties(); 
props.load(this.getClass().getResourceAsStream("/com/company/config/file.properties")); 

opere quando sono in modalità di debug. Riesco a vedere i valori nel debugger, ma ottengo una NullPointerException subito dopo aver eseguito la riga "props.load" e prima di entrare nella luce sotto di essa.

Questo è un altro problema. Almeno ora so che questo è il modo di accedere al file di configurazione.

Grazie per il vostro aiuto.

1

Sei sicuro che il file sia incluso nel file di guerra? Un sacco di volte, il processo di costruzione della guerra filtrerà i file non di classe.

+0

Sì il file è lì. Posso vederlo se sfoglio la struttura della directory Glassfish. –

6

Se si è in guerra, la "directory corrente" del classpath è "WEB-INF/classes". Basta salire di due livelli.

getResourceAsStream("../../com/company/config/configfile.properties"); 

E 'orribile, ma funziona. Almeno, funziona sotto tomcat, jboss e geronimo e funziona oggi.

P.S. La struttura della directory non è molto chiara. Forse è:

getResourceAsStream("../../com.company.config/configfile.properties"); 
+0

Grazie per l'hack. Ha funzionato bene per avere un file di guerra caricare un file di proprietà situato nell'orecchio contenente. Qualche suggerimento per caricare file di proprietà situati in un file war di pari livello con un nome completo indeterminato? – Snekse

+0

Mormora, suppongo che tu non possa. Il server delle applicazioni dovrebbe isolare le guerre l'una dall'altra e non dovrebbe permettere di accedere a un file in una guerra tra fratelli. Ovviamente esistono modi per eludere o attenuare le politiche di sicurezza AS ma sono AS dipendenti. – andcoz

0

Qual è il percorso una volta distribuito sul server? È possibile utilizzare Scanner per leggere manualmente la risorsa. Da un file java all'interno di un pacchetto, la creazione di un nuovo file ("../ applicazioni /") ti porterà un file puntato su {glassfish install} \ domains \ {domain name} \ applications. Forse potresti modificare il percorso del file per indirizzarti dove devi andare?

2

Controllare la posizione del file delle proprietà nel file WAR. Se è in WEB INF-directory/classes nella directory com/società/config getResourceAsStream("com/company/config/configfile.properties") dovrebbe funzionare o getResourceAsStream (" Questo dovrebbe funzionare se il file di configurazione non è sotto WEB-INF/classes Directoy

anche provare a utilizzare getClass(). getClassLoader(). getResourceAsStream.

0

Dal momento che si sta utilizzando primavera, quindi utilizzare il supporto di risorse in primavera per iniettare le proprietà file direttamente.

vedere http://static.springsource.org/spring/docs/3.0.x/reference/resources.html

Anche se la classe che richiede il file delle proprietà non è primavera gestito, è ancora possibile ottenere l'accesso al ApplicationContext e utilizzarlo per caricare la risorsa

risorsa sarebbe qualcosa di simile, classpath : settings.properties, presumendo che il file delle proprietà sia stato raccolto dalla build e lasciato cadere nel file war.

È anche possibile iniettare direttamente, dalla documentazione:

<property name="template" value="classpath:some/resource/path/myTemplate.txt"> 
Problemi correlati