2010-11-26 5 views
4

J'ai un fichier WAR webapp Java qui dépend de plusieurs fichiers jars dans son répertoire WEB-INF \ lib. L'un de ces JARS doit charger des fichiers de configuration en faisant class.getClassLoader().getResourceAsStream(...). Cependant, InputStream restaure null. Y a-t-il un problème avec cette approche lorsque le fichier JAR se trouve dans un fichier WAR? L'application est déployée sur Tomcat6.Java getResourceAsStream JAR à l'intérieur de WAR

PLUS D'INFO EDIT:

Je Tring à charger dans des requêtes SQL à partir des fichiers afin que je puisse les exécuter. Ceux-ci sont situés dans un pot séparé DAO dans le WAR de l'application Web, sous WEB-INF/lib

mywebapp.war 
     -- WEB-INF 
      -- lib 
      -- mydao.jar 
       ---- com/companyname/queries 
        -- query1.sql 
        -- query2.sql 
        -- query3.sql 
        ... 

CODE UTILISATION DE CHARGE CLASSES

public class QueryLoader { 

private static final Logger LOGGER = Logger.getLogger(QueryLoader.class.getName()); 

public String loadQuery(String fileName) { 
    final String newline = "\n"; 

    BufferedReader reader = new BufferedReader(new InputStreamReader(   
     QueryLoader.class.getClassLoader().getResourceAsStream(
       "/com/companyname/queries/" + fileName))); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    try { 
    while ((line = reader.readLine()) != null) { 
     sb.append(line); 
     sb.append(newline); 
    } 
    } catch (IOException e) { 
    LOGGER.error(e); 
    } 

J'ai aussi essayé de changer la ligne de getResourceAsStream à

Thread.currentThread().getContextClassLoader().getResourceAsStream(

sans succès.

Mon environnement de développement est MS Windows Vista et je rencontre la même erreur lors de son exécution sur cet environnement et sur Ubuntu.

Répondre

3

a réussi à le faire fonctionner à l'aide des ressources de printemps du chargeur à la place

public String loadQuery(String fileName) { 
    final String newline = "\n"; 

    ApplicationContext ctx = new ClassPathXmlApplicationContext(); 
    Resource res = ctx.getResource("classpath:/com/msi/queries/" + fileName); 
    BufferedReader reader; 
    StringBuilder sb = new StringBuilder(); 
    try { 
    reader = new BufferedReader(new InputStreamReader(res.getInputStream())); 
    String line; 

    while ((line = reader.readLine()) != null) { 
     sb.append(line); 
     sb.append(newline); 
    } 
    } catch (IOException e) { 
    LOGGER.error(e); 
    } 

    return sb.toString(); 

}

2

Cela devrait fonctionner, mais vous devez veiller à utiliser le bon chargeur de classe.

+1

comment puis-je assurer que je l'utilise le bon chargeur de classe? – Tarski

+0

J'ai eu des problèmes avec le chargeur de classe dans un ancien projet, car cela utilisait un ClassX.class.getClassLoader() - (où ClassX est le plus, mais pas nessaire, dans le jar spécifique) puisque je n'ai pas eu le problème plus - Mais c'est seulement comment cela a fonctionné pour moi. – Ralph

+0

Vous pouvez garantir un classloader correct en récupérant le classloader d'une classe que vous connaissez dans le même fichier JAR que la ressource que vous souhaitez charger. –

2

En supposant que vous ne faites pas l'erreur de recrue de mettre QueryLoader dans un autre JAR, le seul problème que je vois est que vous utilisez File.separator apparaissent encore (de votre utilisation \) pour utiliser Windows. Lorsque vous utilisez getResourceAsStream, le séparateur est toujours une barre oblique (/) comme si vous utilisiez une URL.

Si je change que je reçois ceci:

QueryLoader.class.getClassLoader().getResourceAsStream(
      "/com/companyname/queries/" + fileName) 

Bien sûr, si QueryLoader est dans le paquet com.companyname.queries (ainsi que les requêtes elles-mêmes), alors vous devez simplement faire ceci:

QueryLoader.class.getResourceAsStream(fileName) 

Aussi simple que cela. (Il est documenté que Class.getResourceAsStream qualifie les noms de fichiers relatifs au nom du paquet contenant.)

+0

Merci pour votre réponse. Je souhaite qu'il ait résolu mon problème mais il n'a pas – Tarski

+1

Des sons comme vous devez activer la journalisation du chargeur de classe JVM. Produit beaucoup de sortie, mais peut être utile dans des cas obscurs comme celui-ci. –

Questions connexes