146 votes

Différence de préfixe de classpath de Spring

Documenté aquí on y lit

Ce préfixe spécial spécifie que toutes les ressources du classpath qui correspondent au nom donné doivent être obtenues (en interne, cela se fait essentiellement via un appel à ClassLoader.getResources(...) ), et ensuite fusionnées pour former la définition finale du contexte d'application.

Quelqu'un peut-il expliquer cela ?

Quelle est la différence entre utiliser classpath*:conf/appContext.xml à l'opposé de classpath:conf/appContext.xml sans l'astérisque.

0 votes

Les futurs lecteurs, voient aussi ce bug, avec un "status=declined". github.com/spring-projects/spring-framework/issues/16017 Juste au cas où l'URL échouerait un jour, le titre de l'article sur le bogue est " Importation d'un fichier XML à partir de la racine d'un fichier JAR avec classpath et chemin d'accès génériques ne fonctionne pas [SPR-11390] ".

214voto

eugener Points 10531

SIMPLE DÉFINITION

Le site classpath*:conf/appContext.xml signifie simplement que tous les fichiers appContext.xml sous conf de tous vos bocaux sur le classpath seront récupérés et réunis en un seul contexte d'application.

En revanche, classpath:conf/appContext.xml chargera un seul fichier de ce type ... le premier trouvé dans votre classpath.

7 votes

Il existe une autre différence intéressante entre eux. Voir aussi ma question : stackoverflow.com/questions/16985770/

31 votes

Une chose très importante - si vous utilisez le * et que Spring ne trouve aucune correspondance, il ne se plaindra pas. Si vous n'utilisez pas le * et qu'il n'y a pas de correspondance, le contexte ne démarrera pas ( !).

40voto

skaffman Points 197885

Le site classpath*:... est principalement utile lorsque vous souhaitez construire un contexte d'application à partir de plusieurs fichiers de définition de haricots, en utilisant une syntaxe joker.

Par exemple, si vous construisez votre contexte en utilisant classpath*:appContext.xml le classpath sera scanné pour chaque ressource appelée appContext.xml dans le classpath, et les définitions de bean de tous ces éléments fusionnés en un seul contexte.

En revanche, classpath:conf/appContext.xml obtiendra un et un seul fichier appelé appContext.xml du classpath. S'il y en a plus d'un, les autres seront ignorés.

2 votes

Est-ce que classpath* regarde aussi dans les sous-répertoires ? En d'autres termes, si j'ai appContext.xml dans le Root classpath et un autre dans /dir/appContext.xml, est-ce que les deux seront chargés lorsque j'utiliserai classpath*:appContext.xml ?

22voto

Bacteria Points 7810

classpath* : Il s'agit d'un liste de ressources y charge tout de tels fichiers présents dans le classpath et la liste peut être vide et si aucun fichier de ce type n'est présent dans le classpath puis l'application ne lève pas d'exception (ignore simplement l'erreur).

classpath : Il s'agit d'un certaines ressources y ne charge que le premier trouvé dans le classpath et si un tel fichier n'est pas présent dans le classpath, une exception sera levée.

java.io.FileNotFoundException: class path resource [conf/appContext.xml] cannot be opened because it does not exist

0 votes

Doc officiel "Il n'est pas possible d'utiliser le préfixe classpath* : pour construire un chemin d'accès réel. Resource et j'ai eu cette erreur bizarre, c'est comme ça que j'ai fini ici. Si vous allez importer une ressource, il n'y a aucun sens à utiliser un préfixe de chemin d'accès sauvage.

1voto

zzz Points 1

Le code source de Spring :

public Resource[] getResources(String locationPattern) throws IOException {
   Assert.notNull(locationPattern, "Location pattern must not be null");
   //CLASSPATH_ALL_URL_PREFIX="classpath*:"
   if (locationPattern.startsWith(CLASSPATH_ALL_URL_PREFIX)) {
      // a class path resource (multiple resources for same name possible)
      if (getPathMatcher().isPattern(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()))) {
         // a class path resource pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // all class path resources with the given name
         return findAllClassPathResources(locationPattern.substring(CLASSPATH_ALL_URL_PREFIX.length()));
      }
   }
   else {
      // Only look for a pattern after a prefix here
      // (to not get fooled by a pattern symbol in a strange prefix).
      int prefixEnd = locationPattern.indexOf(":") + 1;
      if (getPathMatcher().isPattern(locationPattern.substring(prefixEnd))) {
         // a file pattern
         return findPathMatchingResources(locationPattern);
      }
      else {
         // a single resource with the given name
         return new Resource[] {getResourceLoader().getResource(locationPattern)};
      }
   }
}

0 votes

Pouvez-vous nous expliquer ?

0voto

ajeetkg Points 21

Ainsi, la syntaxe classpath* rechercherait appContext.xml, a-appContext.xml, b-appContext.xml et les ajouterait pour former un seul fichier classpath. En ce qui concerne le classpath, il recherche l'unique appContext.xml avec le nom spécifique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X