Jasper 编译器可以 XML 外部实体 web.xml 吗?

Can Jasper compiler XML external entities in web.xml?

我正在使用 Tomcat 7.0.52 和一个使用 Jasper 预编译 JSP 的项目。为此,我在输入的 JSP 上使用 Ant 运行 org.apache.jasper.JspC

Jasper 的一部分是它需要处理我的 web.xml。问题是我的 web.xml 设置为包括一堆使用 XML 实体的共享样板。所以它看起来有点像这样:

<?xml version="1.0" standalone="no" encoding="utf-8"?>
<!DOCTYPE WebAppCommon [
    <!ENTITY CommonContextParams SYSTEM "common-context-params.entity">
]>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="3.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    ...
    &CommonContextParams;
    ...
</web-app>

这让 Jasper 爆炸了。我收到的错误消息是:

Caused by: java.io.FileNotFoundException: Could not resolve XML resource [null] with public ID [null], system ID [common-context-params.entity] and base URI [/path/to/project/webapps/ROOT/WEB-INF/web.xml] to a known, local entity.

我详细查看了 JspC class 无济于事。我也没有任何运气地搜索了互联网。大多数遇到此问题的人似乎都是因为 Tomcat 的上下文中称为 allowExternalEntities=false 的限制。但我还在构建阶段,所以这不是我的问题!

任何人都可以告诉我可以更改的配置项以使 Jasper 接受我的外部实体吗?

这是经过大量编辑的堆栈跟踪:


/path/to/project/build.xml:88: org.apache.jasper.JasperException: XML parsing error on file file:/path/to/project/webapps/ROOT/WEB-INF/web.xml
    at org.apache.jasper.compiler.JspConfig.processWebDotXml(JspConfig.java:230)
    at org.apache.jasper.compiler.JspConfig.init(JspConfig.java:243)
    at org.apache.jasper.compiler.JspConfig.isJspPage(JspConfig.java:465)
    at org.apache.jasper.JspC.scanFiles(JspC.java:1285)
    at org.apache.jasper.JspC.execute(JspC.java:1340)
    ...  ...    
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    ...  ...    
Caused by: org.apache.jasper.JasperException: XML parsing error on file file:/path/to/project/webapps/ROOT/WEB-INF/web.xml
    at org.apache.jasper.xmlparser.ParserUtils.parseXMLDocument(ParserUtils.java:152)
    at org.apache.jasper.compiler.JspConfig.processWebDotXml(JspConfig.java:95)
    ... 20 more
Caused by: java.io.FileNotFoundException: Could not resolve XML resource [null] with public ID [null], system ID [common-context-params.entity] and base URI [file:/path/to/project/webapps/ROOT/WEB-INF/web.xml] to a known, local entity.
    at org.apache.tomcat.util.descriptor.LocalResolver.resolveEntity(LocalResolver.java:154)
    at com.sun.org.apache.xerces.internal.util.EntityResolver2Wrapper.resolveEntity(EntityResolver2Wrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.resolveEntityAsPerStax(XMLEntityManager.java:994)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1209)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1908)
    ...  ...

您可以尝试使用(未记录的)命令行参数运行 JspC

-no-blockExternal

在上下文中应该与 allowExternalEntities=true 具有相同的效果。


Jasper Ant task可以使用参数blockexternal设置这个标志:

<jasper blockexternal="false" ... />