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

use*_*155 3 web.xml servlets modularity java-ee

我有不同的webapps共享web.xml配置的很大一部分.例如,某些servlet的映射方式对于所有应用程序都是相同的,但有些webapps具有自定义servlet,或者其他过滤器或共享托管bean.

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

Bal*_*usC 7

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

在此输入图像描述

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

在此输入图像描述

您可以根据需要(重新)在主Web项目的"部署程序集"属性中配置它(或以任何其他方式配置构建,使其最终最终成为/WEB-INF/lib主Web项目中的JAR ).

在此输入图像描述

它基本上是一个具有以下文件夹结构的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
 :
Run Code Online (Sandbox Code Playgroud)

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

请注意,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>
Run Code Online (Sandbox Code Playgroud)

也可以看看: