2015-03-26 2 views
0

J'ai deux dérivées de la même application, disons les versions (A) et (B). Ils contiennent chacun des projets: (1) test-data-war, qui a target/test-classes/log4j.properties, et (2) test-kernel, qui a target/test-classes/log4j.properties et target/test-classes/test.properties.getResourceAsStream renvoie null dans un cas mais pas un autre, avec les mêmes chemins de classe

Quand je lance un test JUnit spécifique (1), il appelle un procédé (2) qui appelle Thread.currentThread().getContextClassLoader().getResourceAsStream(resourceName); In (A), avec resourceName comme "log4j.properties", le résultat est non nul avec un trajet dans (1), mais avec resourceName comme "test.properties", il est nul. Dans (B), avec resourceName comme "log4j.properties", il n'est pas null avec un chemin dans (1) et avec resourceName comme "test.properties" il n'est pas nul avec un chemin dans (2).

Pourquoi Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties"); est-il nul en (A)? Au début, je pensais que les classpaths pouvaient être différents, mais ils sont les mêmes pour (1) et (2).

EDIT: Voici ce que le fichier .classpath ressemble pour (1):

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" output="target/classes" path="src/main/java"> 
     <attributes> 
      <attribute name="optional" value="true"/> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="src" output="target/test-classes" path="src/test/java"> 
     <attributes> 
      <attribute name="optional" value="true"/> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="con" pat h="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
      <attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="output" path="target/classes"/> 
</classpath> 

Voici ce que le fichier .classpath ressemble pour (2):

<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" output="target/classes" path="src/main/java"> 
     <attributes> 
      <attribute name="optional" value="true"/> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="src" output="target/test-classes" path="src/test/java"> 
     <attributes> 
      <attribute name="optional" value="true"/> 
      <attribute name="maven.pomderived" value="true"/> 
      </attributes> 
    </classpathentry> 
    <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"> 
     <attributes> 
      <attribute name="maven.pomderived" value="true"/> 
      <attribute name="org.eclipse.jst.component.nondependency" value=""/> 
     </attributes> 
    </classpathentry> 
    <classpathentry kind="output" path="target/classes"/> 
</classpath> 
+0

Vous devez vérifier toutes vos affirmations, y compris la présence de ces fichiers dans les fichiers JAR et les chemins de classe. – EJP

+0

Je ne vois pas les fichiers dans les fichiers JAR cible de (A) ou (B), mais les fichiers ".classpath" sont les mêmes pour différentes versions. – spooky655

Répondre

0

Dans (B), il y avait eu une dépendance supplémentaire dans eclipse sur (2) qui causait Thread.currentThread().getContextClassLoader().getResourceAsStream("test.properties") de ne pas retourner de null. Il était en fait censé renvoyer une valeur nulle (c'est-à-dire ne pas trouver test.properties dans (2)).

0

Les ressources du chemin de classe de test du module test-kernel ne sont pas visibles pour le module test-data-war. Les modules exporte uniquement les ressources sous src/main/resources lorsque vous les ajoutez en tant que dépendance à un autre module. Le problème est que Eclipse et Maven ne sont pas d'accord ici. Dans Eclipse, tout le chemin de classe d'un module est visible (également les ressources de test). Mais lorsque vous exécutez le même test dans Maven, les ressources de test disparaissent soudainement. C'est parce qu'Eclipse n'a pas de concept de "test classpath". Si mvn dependency:tree montre une différence, vous devez vérifier les fichiers pom.xml pour les modules.

+0

Je pense que vous l'avez mélangé. (A) et (B) sont des branches indépendantes d'une application. (1) et (2) sont les projets qu'ils ont chacun. Pour (B), je vois que (2) est une dépendance de (1), mais cela ne semble pas être le cas pour (A). Je ne peux pas comprendre pourquoi puisque toutes les configurations semblent être les mêmes pour (A) et (B). – spooky655

+0

Voyez-vous une différence lorsque vous exécutez 'mvn dependency: tree' avec les deux? –

+0

(B) dit qu'il télécharge en plus le POM de (2), mais (A) ne le fait pas! Comment puis-je changer cela? – spooky655