从Java Web应用程序中的库JAR覆盖类文件

Mic*_*ael 10 java jar classpath java-ee

在我的Java Web应用程序中,我有以下文件:

/WEB-INF/classes/com/example/Foo.class
/WEB-INF/lib/example.jar <-- contains the class "com.example.Foo"
Run Code Online (Sandbox Code Playgroud)

是否将classes使用目录中定义的类而不是在example.jar?中定义的类?

谢谢.

Mat*_*ell 13

答案取决于您的容器,它取决于容器.通常,/ WEB-INF/classes比WEB-INF/lib中的jar文件中的类更受欢迎.

对于Tomcat,订单如下:

因此,从Web应用程序的角度来看,类或资源加载按以下顺序查找以下存储库:

  1. JVM的Bootstrap类
  2. 系统类加载器类
  3. / WEB-INF /您的Web应用程序的类
  4. 您的Web应用程序的/WEB-INF/lib/*.jar
  5. 常用的类加载器类

但是,如果您使用的是其他容器,则需要查阅该服务器的文档.


Ami*_*far 7

所以只有一种方法可以找到答案.我写了一个测试:)

??? 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
Run Code Online (Sandbox Code Playgroud)

我的发现是TestFoo.java印刷品

Hello from example.jar
Hello from example.jar
Run Code Online (Sandbox Code Playgroud)

对于TestFooInWeb.java打印

Hello from web app
Hello from web app
Run Code Online (Sandbox Code Playgroud)

两个测试都在测试类中有这个:

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

    @Test
    public void testHelloFromBar() {
        new Bar().sayHelloForFoo();
    }
}
Run Code Online (Sandbox Code Playgroud)

所以最后,我站得更正了.您显然可以加载一个完全不同的类,所有Jar文件都将使用该新类.这是有道理的,因为ClassLoader它将首先查看classes目录.我不确定我是否同意它,因为它听起来很可疑,我可以覆盖安全类.