【问题标题】:/WEB-INF/classes vs /WEB-INF/lib/WEB-INF/classes 与 /WEB-INF/lib
【发布时间】:2011-06-11 23:27:28
【问题描述】:

我想将我的 Java EE6 web 类(bean、过滤器、servlet)打包到 jar 中,并将其与其他实用程序 jar 一起放入 /WEB-INF/lib/ 目录,并完全放弃 /WEB-INF/classes/ 目录。

两者在类加载、访问应用程序上下文等方面是否存在实质性差异?

谢谢。

PS:每当谷歌搜索任何 java 规范时,我总是被重定向到距原始 url 十几次点击的 Oracle 文档索引。有谁知道那里发生了什么?

【问题讨论】:

标签: java web-applications jakarta-ee


【解决方案1】:

在 Tomcat Servlet 容器的定义中:WEB-INF\classesWEB-INF\lib 之前搜索。您可以选择将您的类加载委托给您的自定义类加载器——即使如此,上述顺序仍然保持不变。

如果您选择与其他提供商合作,例如JBOss、Glassfish、Jetty 可能有不同的顺序,但我不确定。

【讨论】:

    【解决方案2】:

    好吧,很快:假设你有一个类 org.example.Test.class,如果你把它放到 jar 和 WEB-INF/lib/ 目录中,然后将同一个类复制到 WEB-INF/classes/ 中,那么该应用程序的类加载器将使用最后一个(来自 @987654324 @)。

    有时您可以将其用作优势-我有一个库,但它有一个错误...我寻找该类的来源(错误在哪里;我错过了我如何知道该错误在该类中的部分,那是另一个故事),我将该类添加到具有固定代码的项目中,并且它被编译为WEB-INF/classes/,而库仍然存在于WEB-INF/lib/中。固定类将一直使用,直到库被修复。

    【讨论】:

    • 谢谢,这个功能可能会有所帮助。
    【解决方案3】:

    我会选择/WEB-INF/classes。它允许您在调试模式下运行应用程序并在更改时热交换类。如果将所有内容打包为 jar,则每次更改类时都必须重新打包和重新部署应用程序。

    【讨论】:

    • 谢谢。但是,除了调试之外,它在功能上会是相同的应用程序吗?