【问题标题】:Can Jasper compiler XML external entities in web.xml?Jasper 可以在 web.xml 中编译 XML 外部实体吗?
【发布时间】:2015-11-26 04:29:06
【问题描述】:

我正在使用 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) ... ...

【问题讨论】:

  • common-context-params.entity 保存在哪里?
  • @wero,与 web.xml 相同的目录。

标签: java xml jsp xml-parsing tomcat7


【解决方案1】:

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

-no-blockExternal

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


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

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

【讨论】:

  • 如果我将它作为 Ant 任务运行会怎样?是否可以模拟该参数?
  • 你使用这里描述的jasper任务tomcat.apache.org/tomcat-7.0-doc/…吗?
  • 或多或少。从技术上讲,我们已经将 JspC 类包装在我们自己的 Ant 任务定义中......
  • 成功了!!!!太感谢了。我真的非常感谢你——太令人沮丧了,你刚刚解决了所有的问题!
猜你喜欢
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多