-3

我必须在我的 web 应用程序的 web.xml 中添加一个过滤器,它使用一个 jar 文件中的目录结构,我将把它添加到我的 web 应用程序的 lib 目录中。

<filter>
                <filter-name>monitor</filter-name>
                <filter-class>com.student.compute</filter-class>
        </filter>
        <filter-mapping>
                <filter-name>monitor</filter-name>
                <url-pattern>/*</url-pattern>
        </filter-mapping> 

这里过滤器使用 jar 文件中 com.student 包中的“计算”类。我已经扩展了jar文件并确认了这个结构是否存在。

现在在我的 classes 目录中,我也有一个 com 目录,其中包含许多特定于我的应用程序的类。

现在,当我尝试访问 Web 应用程序中的内容时,jar 文件中的 com 和 classes 目录中的 com 不会发生冲突。

请说清楚。

4

2 回答 2

1

不,他们不会发生冲突。如果这是一个问题,你不能同时使用来自 Apache 的多个库,因为它们都将它们的类放在 org.apache 的某个子包下。

您可以将类路径中所有类的包树视为一棵巨大的树,其中包含类路径中列出的所有 jar 和目录的所有包树的合并。

如果您在类路径中的两个不同 jars/目录中有两个具有完全相同的包和名称的类,那么这将是一个问题,因为只有第一个可用,并且您不能(AFAIK)有任何保证类路径中 WEB-INF/lib 下的 WEB-INF/classes 和 jar 的顺序。

于 2013-07-15T15:34:13.317 回答
0

尽管它们看起来是分层的,但 Java 中的包却不是。一袋

com.student.compute

不是“下面”

com.student

它只是另一个不同的包。

在您的 Web 应用程序中,如果您有两个包含完全相同的包的 jar 文件(例如,在您的情况下,两者都可能包含com.student.compute),则类加载器将搜索所有 jar 以找到您的类,如果找到,将“返回”第一个。这可能是很多问题的根源,最好避免。

类加载器的具体工作方式取决于环境。例如,Web servlet 引擎为每个 Web 应用程序使用不同的类加载器,这样您的 jar 就不会发生冲突,并且您看不到其他 Web 应用程序加载的 jar。

于 2013-07-15T15:37:00.817 回答