Java Package结构中的澄清

时间:2013-07-15 15:26:53

标签: java java-ee

我必须在我的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包中的“compute”类。我已经扩展了jar文件并确认了这个结构是否存在。

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

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

请澄清。

2 个答案:

答案 0 :(得分:1)

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

您可以将类路径中所有类的包树看作一个巨型树,其中包含类路径中列出的所有jar和目录的所有包树的合并。

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

答案 1 :(得分:0)

虽然它们看起来是分层的,但Java中的包不是。包

com.student.compute

不是“在下面”

com.student

它只是另一个不同的包。

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

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