我已经配置了 jetty 以使用 jetty maven 运行我的 Web 应用程序。Jetty 应该是开发的轻量级替代品,因此它不需要 web.xml 中的所有内容。更具体地说,我想删除 web.xml 中的过滤器。
我尝试使用 overrideDescriptor 配置属性,但这仅允许我覆盖 web.xml,而不是替换它。因此,过滤器仍然存在。
有什么想法可以在不修改原始 web.xml 文件的情况下删除过滤器吗?
由于没有答案,我将发布我的解决方案,这并不完美。
<!-- Jetty configuration -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.5.v20120716</version>
<configuration>
<webApp>
<descriptor>src/main/webapp/mock-web.xml</descriptor>
[...]
</webApp>
[...]
</configuration>
</plugin>
这种方法的缺点是您必须维护两个几乎相同的 web.xml 文件。我还没有找到允许我覆盖原始 web.xml 文件并删除侦听器的解决方案。
您可以在 override-web.xml 中将过滤器类替换为 PassThroughFilter:
public class PassThroughFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
<filter>
<filter-name>OriginalFilter</filter-name>
<filter-class>mypackage.PassThroughFilter</filter-class>
</filter>
一个强大的解决方案是在您的 2 个 XML 实体中使用web.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document [
<!ENTITY webEntity1 SYSTEM 'webEntity1.xml'>
<!ENTITY webEntity2 SYSTEM 'webEntity2.xml'>
]>
<web-app>
&webEntity1;
&webEntity2;
</web-app>
custom-web.xml
一个文件中只有一个:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE document [
<!ENTITY webEntity1 SYSTEM 'webEntity1.xml'>
]>
<web-app>
&webEntity1;
</web-app>
这样,webEntity1.xml
您将声明您的共享 servlet、过滤器、映射,并且webEntity2.xml
仅在您不想在 Jetty 中使用的过滤器中声明。
然后你会像这样配置码头插件:
<configuration>
...
<webApp>
...
<descriptor>${project.basedir}/src/main/webapp/WEB-INF/custom-web.xml</descriptor>
</webApp>
...
</configuration>
我刚刚在我的码头插件 wiki 页面中添加了一个部分。