Remplacement d’un fichier de classe à partir d’un fichier JAR de bibliothèque dans une application Web Java

Dans mon application Web Java, j’ai les fichiers suivants:

/WEB-INF/classes/com/example/Foo.class /WEB-INF/lib/example.jar <-- contains the class "com.example.Foo" 

La classe définie dans le répertoire classes sera-t-elle utilisée à la place de la classe définie dans example.jar ?

Merci.

La réponse dépend de votre conteneur, cela dépend du conteneur. En général, / WEB-INF / classes est préférable aux classes d’un fichier jar dans WEB-INF / lib.

Pour Tomcat , la commande est la suivante:

Par conséquent, du sharepoint vue d’une application Web, le chargement d’une classe ou d’une ressource est examiné dans les référentiels suivants, dans cet ordre:

  1. Classes d’amorçage de votre machine virtuelle Java
  2. Classes de chargeur de classe système
  3. / WEB-INF / classes de votre application Web
  4. /WEB-INF/lib/*.jar de votre application Web
  5. Classes de chargeur de classe communes

Mais si vous utilisez un conteneur différent, vous devez consulter la documentation de ce serveur.

Donc, il n’y a qu’un seul moyen de le savoir. J’ai écrit un test 🙂

 ├── example │  ├── example.iml │  ├── pom.xml │  └── src │  ├── main │  │  └── java │  │  └── test │  │  ├── Bar.java │  │  └── Foo.java │  └── test │  └── java │  └── testexample │  └── TestFoo.java ├── pom.xml ├── test.iml └── web ├── pom.xml ├── src │  ├── main │  │  └── java │  │  └── test │  │  └── Foo.java │  └── test │  └── java │  └── junittest │  └── TestFooInWeb.java └── web.iml 16 directories, 11 files 

Ma conclusion était que dans TestFoo.java imprime

 Hello from example.jar Hello from example.jar 

Et pour les impressions TestFooInWeb.java

 Hello from web app Hello from web app 

Les deux tests ont ceci dans la classe de test:

 public class TestFooInWeb/TestFoo { @Test public void testHello() { System.out.println(new Foo().sayHello()); } @Test public void testHelloFromBar() { new Bar().sayHelloForFoo(); } } 

Donc, tout à la fin, je suis corrigé. Vous pouvez charger une classe complètement différente et tous les fichiers Jar utiliseront cette nouvelle classe. Cela a du sens parce que le ClassLoader examinera d’abord le répertoire des classes. Je ne suis pas sûr d’être d’accord avec cela car cela semble suspect et je peux écraser les classes de sécurité.