2016-09-08 4 views
0

Ich baue eine Web-Anwendung basierend auf Maven Multi-Module. So ist mein Projektstruktur wie folgt aus:Java WebApp kann keine .properties von jar laden

/module1 
    /src/main/java 
     package/Module1.java 
    /src/main/resources 
     conf/i18n_en.properties 
/webapp 
    /src/main/java 
     package/Web.java 
    /src/main/resources 
     conf/i18n_en.properties 
    /src/main/webapp 

Ich habe verschiedene Eigenschaften („i18n_en.properties“) für L18N in jedem Modul, lade ich die Eigenschaften in Code-Datei und die Informationen zu erhalten. Es scheint gut zu laufen im Single-Modul-Test.

private ResourceBundle rb; 
String filename = BASE_NAME + "_" + LANG + ".properties"; 
InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(filename); 
     if(in == null) { 
      in = c.getResourceAsStream(filename); 
     } 
     if (in == null) { 
      in = c.getClassLoader().getResourceAsStream(filename); 
     } 

     if (in != null) { 
       rb = new PropertyResourceBundle(in); 
     } 

Wenn ich aber Tomcat mit IDEA gestartet habe, lädt das Programm nur die Eigenschaften in webapp! Einfach die Eigenschaften von "Module1" nicht finden!

Ich denke, es ist das Problem des Ladens von Eigenschaften von innner Glas. Für das bereitgestellte Verzeichnis ist wie folgt:

/WEB-INF 
    /classes 
    /conf/i18n_en.properties (from webapp) 
    /lib 
    /Module1.jar (has it's own properties in it) 

Ich war wirklich verwirrt. Ich habe lange nach allen Dingen gesucht, die mir verwandt sind, und ich habe eine ähnliche Sache gefunden, aber ich kann das Problem nicht lösen. Ich denke, ich habe getan, was sie gesagt haben. Java WebApp: Loading resource from .jar located in WEB-INF

Ich weiß nicht, wo das Problem ist, es muss einige Möglichkeiten geben, um die Eigenschaften innere Glas laden. Jeder weiß etwas, bitte helfen Sie mir, vielen Dank ~

+0

Was Wert Ihrer base_name Variable ist? –

+0

müssen Sie '/' vor BASE_NAME hinzufügen –

+0

ja, ich habe versucht, was Sie gesagt haben. wie "/ conf/i18n_properties", "conf/i18n_properties". Es kann nur nicht die Datei finden, wenn es in das Glas verpackt ist. @ JekinKalariya – Alvin

Antwort

0

In JAR-Datei können Sie nicht ClassLoader() -Methode verwenden, um ein Element zu finden.
können Sie verwenden:

try { 
     URL url2 = new URL(this.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().toString()+your path to file in structre); 
     InputStream in = url2.openStream(); 
} catch (URISyntaxException ex) { 
     Logger.getLogger(PrepareGUI.class.getName()).log(Level.SEVERE, null, ex); 
} 
+0

Vielen Dank für Ihre Hilfe. Sie möchten eine URL erstellen, die die Datei in jar finden kann. Ich versuche es und es ist wirklich Arbeit! Aber es gibt einen kleinen Unterschied, dass ich den folgenden Code verwende: 'neue URL (" jar: "+ c.getProtectionDomain(). GetCodeSource(). GetLocation(). ToString() +"! "+ Dateiname);' I habe das spezifische URL-Format für jar vom 'Spring' bemerkt. – Alvin

+0

Ich möchte wirklich wissen, warum die 'ClassLoader.getResourceAsStream (...)' Datei in jar nicht finden kann. Ich sah so viele Antworten im Internet gab den Rat. Weißt du warum? Oder nehme ich etwas falsch? – Alvin

+0

Ich lese über JAR-Datei vor. Dieser Artikel besagt, dass wenn es sich um eine JAR-Datei handelt, es keine Datei mehr ist. Eine Datei ist nur eine physische Datei im Dateisystem. Daher können Sie ClassLoader.getResourceAsStream (...) nicht verwenden, um eine Datei in jar zu finden. – Numb

Verwandte Themen