2

我的 Ant 1.8.2 构建开始失败,来自 W3C 网站的 HTTP 303 响应以响应对 SVG DTD 的请求。所以我试图引入一个 XML 目录来在本地解决它们。

如果我不更改类路径,我会得到:

警告:未找到 XML 解析器;外部目录将被忽略

如果我将 Apache XML Commons 1.2 中的 resolver.jar 添加到类路径中(例如,通过在 ant 调用上使用 -lib),我会得到

/Users/mike/../build.xml:123: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.apache.tools.ant.types.XMLCatalog$ExternalResolver.processExternalCatalogs(XMLCatalog .java:1115) 在 org.apache.tools.ant.types.XMLCatalog$ExternalResolver.resolveEntity(XMLCatalog.java:960) 在 org.apache.tools.ant.types.XMLCatalog.resolveEntity(XMLCatalog.java:391)

这向我表明我正在使用的 resolver.jar 已经找到,但没有 Ant 所期望的接口。

我应该从哪里获得与 Ant 一起使用的正确 resolver.jar?

4

2 回答 2

2

我找到了解决方案(嗯,一种解决方法......)

InvocationTargetException 原来是一个红鲱鱼 - 一个次要错误。主要错误如下:我的目录文件catalog.xml 包含对DTD catalog.dtd 的相对引用,而Ant(或解析器)未能解析对catalog.dtd 的引用。它正在查找包含我的构建文件的目录,而不是包含目录的目录。这显然是某个地方的错误;如果我进一步调查,我的怀疑是 Ant 将目录文件传递给目录解析器而没有基本 URI,或者使用不正确的基本 URI,因此 XML 解析器必须猜测在哪里可以找到 DTD,并且猜测错误.

我的解决方案是删除对 DTD 的引用。在此之后,目录中列出的 URI 被正确解析为本地副本。有趣的是,对本地副本的引用也是相对于目录的,所以目录解析器似乎知道目录在哪里,但在解析它时没有人告诉 Xerces。

于 2013-02-19T08:21:09.287 回答
0

我有同样的问题,但对我来说,从 Ant 1.8.1 升级到 1.9.4 解决了这个问题。

我的猜测是根本原因是错误 52754

编辑:使用JDK 1.6.0_18,同样的问题以稍微不同的形式重新出现,堆栈跟踪如下:

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.types.XMLCatalog$ExternalResolver.processExternalCatalogs(XMLCatalog.java:1116)
    at org.apache.tools.ant.types.XMLCatalog$ExternalResolver.resolve(XMLCatalog.java:1007)
    at org.apache.tools.ant.types.XMLCatalog.resolve(XMLCatalog.java:420)
    at net.sf.saxon.style.XSLGeneralIncorporate.getIncludedStylesheet(XSLGeneralIncorporate.java:104)
    at net.sf.saxon.style.XSLStylesheet.spliceIncludes(XSLStylesheet.java:754)
    at net.sf.saxon.style.XSLStylesheet.preprocess(XSLStylesheet.java:676)
    at net.sf.saxon.PreparedStylesheet.setStylesheetDocument(PreparedStylesheet.java:331)
    at net.sf.saxon.PreparedStylesheet.prepare(PreparedStylesheet.java:163)
    at net.sf.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:139)
    at org.apache.tools.ant.taskdefs.optional.TraXLiaison.readTemplates(TraXLiaison.java:300)
    at org.apache.tools.ant.taskdefs.optional.TraXLiaison.createTransformer(TraXLiaison.java:317)
    at org.apache.tools.ant.taskdefs.optional.TraXLiaison.transform(TraXLiaison.java:178)
    at org.apache.tools.ant.taskdefs.XSLTProcess.process(XSLTProcess.java:842)
    at org.apache.tools.ant.taskdefs.XSLTProcess.execute(XSLTProcess.java:432)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.Target.performTasks(Target.java:456)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
    at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441)
    at org.apache.tools.ant.taskdefs.CallTarget.execute(CallTarget.java:105)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.Target.performTasks(Target.java:456)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
    at org.apache.tools.ant.Main.runBuild(Main.java:851)
    at org.apache.tools.ant.Main.startAnt(Main.java:235)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1937)
    at java.lang.String.substring(String.java:1904)
    at org.apache.xml.resolver.helpers.PublicId.normalize(Unknown Source)
    at org.apache.xml.resolver.Catalog.addEntry(Unknown Source)
    at org.apache.tools.ant.types.resolver.ApacheCatalog.addEntry(ApacheCatalog.java:118)
    at org.apache.xml.resolver.readers.OASISXMLCatalogReader.startElement(Unknown Source)
    at org.apache.xml.resolver.readers.SAXCatalogReader.startElement(Unknown Source)
    at org.apache.xml.resolver.readers.SAXParserHandler.startElement(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
    at org.apache.xml.resolver.readers.SAXCatalogReader.readCatalog(Unknown Source)
    at org.apache.xml.resolver.Catalog.parseCatalogFile(Unknown Source)
    at org.apache.xml.resolver.Catalog.parsePendingCatalogs(Unknown Source)
    at org.apache.xml.resolver.Catalog.parseCatalog(Unknown Source)
    at org.apache.tools.ant.types.resolver.ApacheCatalogResolver.parseCatalog(ApacheCatalogResolver.java:118)
 ... 47 more

有趣的是,该错误只发生在 Windows 上,而且只是偶尔发生,可能七次左右出现一次。

该错误源于Apache Resolver 库中类的normalize函数。PublicId

normal.indexOf(" ")有时会返回错误的值。例如,如果输入字符串是-//OASIS//ELEMENTS DITA 1.x Programming Domain//EN,则pos变量将50作为其值,即使公共 ID 字符串没有任何额外的空格。

这使我认为根本原因可能与JDK 错误 #6967156 有关,但我完全不能确定,因为在我们的案例中,错误是间歇性的,但错误报告中没有任何迹象表明这一点。

于 2015-03-31T08:52:39.520 回答