将共享代码和 web.xml 从 WAR 项目拆分为公共 JAR 项目

Splitting up shared code and web.xml from WAR project to common JAR project

我有不同的 Web 应用程序共享大部分 web.xml 配置。例如,某些 servlet 的映射方式对于所有应用程序都是相同的,但某些 web 应用程序具有自定义 servlets、附加过滤器或共享托管 bean。

每个 webapp 都是我 IDE 中的一个不同项目。我想将 web.xml 的公共部分重构为 "common" 项目,并让所有特定于应用程序的 web.xml 扩展 "common" web.xml .有没有可能做到这一点?

如果您在 glassfish 上部署应用程序,则可以将常用配置放在 domain-dir\config\ 位置下的 default-web.xml 文件中。

是的,你可以。假设 Eclipse(您的问题历史记录确认您正在使用它),只需创建一个 "Web Fragment Project":

并将其与向导中的主项目相关联:

如有必要,您可以在主 Web 项目的 "Deployment Assembly" 属性 中(或以任何其他方式配置构建,最终以 JAR 形式结束)对其进行(重新)配置/WEB-INF/lib 主 Web 项目)。

它基本上是一个具有以下文件夹结构的 Java 项目:

CommonWebProject
 |-- com.example... (you can put e.g. @WebServlet classes here)
 |
 |-- META-INF
 |    |-- resources (you can put shared web resources here)
 |    |    |-- common.css
 |    |    |-- common.js
 |    |    |-- template.jsp
 |    |    :
 |    |
 |    |-- beans.xml
 |    |-- web-fragment.xml
 |    `-- MANIFEST.MF
 :

/META-INF/resources 文件夹中的任何内容的解析方式与 WAR 的 Web 内容相同(我的 Eclipse Luna SR1 没有预先创建 /resources 文件夹,因此您需要手动创建它)。而且,重要的是,WAR 中已经具有相同名称的任何资源(包括 类!)都将优先于 JAR 中的资源加载,因此如果需要,您可以 "override" 公共 JAR 资源从 WAR 开始。

请注意,web-fragment.xml 文件的名称必须完全相同,而不是 web.xml。 IDE 应该为您自动生成一个,但为了完整起见,一个 Servlet 3.0 兼容的看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<web-fragment
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd"
    version="3.0"
>

    <!-- Put shared web.xml config here. -->

</web-fragment>

另请参阅:

  • Structure for multiple JSF projects with shared code(如果您使用的是 JSF)

通常 web 服务器具有定义默认值的功能 web.xml 以满足您的要求。我建议探索您正在使用的网络服务器的选项。