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

时间:2015-09-01 03:29:30

标签: java xml jsp xml-parsing tomcat7

我正在使用Tomcat 7.0.52和一个使用Jasper预编译JSP的项目。为此,我使用Ant在我的输入JSP上运行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>

这使贾斯珀爆炸。我得到的错误信息是:

  

引起:java.io.FileNotFoundException:无法使用公共ID [null],系统ID [common-context-params.entity]和基URI [/ path / to / project / webapps]解析XML资源[null] /ROOT/WEB-INF/web.xml]到一个已知的本地实体。

我在JspC课程中详细查看过无济于事。我也没有运气就在网上搜索过。由于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)
    ...  ...

1 个答案:

答案 0 :(得分:2)

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

运行JspC
-no-blockExternal

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

Jasper Ant task可以使用参数blockexternal

设置此标记
<jasper blockexternal="false" ... />