Java: Laquelle de multiples ressources sur classpath JVM prend?
Si j'ai plusieurs fichiers de même nom dans le classpath (par exemple, j'ai plusieurs .jar
avec log4j.properties
), quelles sont les règles de la JVM suit d'en choisir un?
Vous devez vous connecter pour publier un commentaire.
Il est spécifié par l'ordre dans lequel les ressources (c'est à dire généralement les fichiers jar) sont spécifiées à l'aide de
-classpath
option. Ressources "précédent" sur le chemin de la classe de prendre la priorité sur les ressources qui sont spécifiés après eux. Cela peut être également définie dans le fichier manifest de votre application, puis vous n'avez pas besoin de fournir-classpath
option. Vous voudrez peut-être vérifier ces articles sur la façon de travailler avec des fichiers de manifeste.La description exhaustive de "la façon dont les classes sont trouvés" peut être trouvé ici, où la section sur JAR-class-path Classes décrit la logique de JAR-les fichiers de la recherche.
Resources 'earlier' on the classpath take precedence over resources that are specified after them.
?ClassLoader.getResources(String name)
. Elle retourne tous les classpath ressources avec le nom donné, dans le même ordre que décrit dans le lien fourni dans la réponse. Utile si vous avez besoin de charger l'ensemble d'entre eux.Le chargeur de classe détermine où une ressource sera situé (prises à partir du chargeur de classe JavaDoc):
Donc, peu importe où dans votre code Class#getResource ou de la Catégorie#getResourceAsStream est appelée, ce qui se passe (prises à partir de Class.java)
ClassLoader.java:
où ClassLoader#findResource est fait pour être remplacé par le chargeur de classe de mise en œuvre. Cela implique que le comportement est différent sur un serveur d'application, un TomCat ou si vous l'exécutez à partir d'un fichier jar, il dépend du chargeur de classe implémentations de l'environnement, vous êtes actuellement dans.
Ici est un exemple que vous pouvez utiliser pour tracer ce qui se passe sous le capot, dans votre cas particulier.
Je contribue un cas prouvé que si classpath est, disons, tous les pots dans un dossier, et vous voulez donner la priorité à une (ou plusieurs) d'entre eux, cela ne fonctionne pas:
Windows:
Linux:
Il semble que le premier chemin bin/prioritized.jar est ignoré tout simplement parce que le deuxième avec un générique inclut dans son propre champ. C'est ce que effectivelly rompt l'ordre indiqué des chemins de classe.
Par conséquent, afin d'avoir de multiples ressources prioritaires (testé sur Java 10.0.1), vous devez les placer dans le non-chevauchement des champs d'application et puis ils vont travailler.