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:
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é.