平台:Windows 7 x64
JDK版本:7.0.25 x64或7.0.45 x64
JDK安装路径:
C:\Java\jdk725 or default c:\Program Files\Java\jdk1.7.0_25\
Spring 框架版本:3.2.4 或 3.2.5
UAC:启用或禁用
gradlew
构建(在 gradlew
之后):
:referenceHtmlMulti FAILED
FAILURE: Build failed with an exception.
What went wrong:
Execution failed for task ':referenceHtmlMulti'.
Failed to compile stylesheet. 59 errors detected.
Try:
Run with --info or --debug option to get more log output.
Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':referen
ceHtmlMulti'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecuteActions(ExecuteActionsTaskExecuter.java:69)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecute(ExecuteActionsTaskExecuter.java:46)
..
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: javax.xml.transform.TransformerConfigurationException: Failed to comp
ile stylesheet. 59 errors detected.
at com.icl.saxon.PreparedStyleSheet.prepare(PreparedStyleSheet.java:136)
at com.icl.saxon.TransformerFactoryImpl.newTemplates(TransformerFactoryI
mpl.java:127)
at com.icl.saxon.TransformerFactoryImpl.newTransformer(TransformerFactor
yImpl.java:79)
..
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecuteAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.ex
ecuteActions(ExecuteActionsTaskExecuter.java:61)
... 70 more
BUILD FAILED
我的问题是:为什么我的构建失败了?
请您参考如下方法:
当 :referenceHtmlMulti 任务执行时会出现此问题。 如果我们查看 groovy 类,我们将看到 XSLT 转换用于创建文档引用。尽管事实上,使用了 Saxon(选择了 TransformerFactoryImpl),但选择的 SAXParserFactory 是 org.apache.xerces.jaxp.SAXParserFactoryImpl (我想知道为什么不使用 com.icl.saxon.aelfred.SAXParserFactoryImpl)。 如果我们查看 gradle 使用的 xerces 实现,我们将看到 xercesImpl-2.9.1.jar,它已经足够旧了。 现在让我们在 xerces 源中查找类 URI。它代表统一资源标识符(URI)。在第1134行我们可以找到
else if (!isURICharacter(testChar)) {
throw new MalformedURIException(
"Opaque part contains invalid character: " + testChar);
}
现在让我们看看这个函数是如何工作的:
private static boolean isURICharacter (char p_char) {
return (p_char <= '~' && (fgLookupTable[p_char] & MASK_URI_CHARACTER) != 0);
}
我们可以看到,如果 char 比较也返回 true,则函数将返回 true。但这意味着字符的限制相当严格(从代码 0 - 126 (~))。但是非 US-ASCII 字符集又如何呢?
让我们阅读关于非 us-ascii 字符的 RFC 2396(可以存在于您的 Windows 路径中,代表您的本地语言,或者可以在帐户名中找到,gradle 在该帐户名下解压自身并运行):其他类别 - Unicode 字符不在 US-ASCII 字符集中,不是控制字符(根据Character.isISOControl 方法),也不是空格字符(根据Character.isSpaceChar 方法)(与 RFC 2396 的偏差,RFC 2396 仅限于 US-ASCII) ASCII)。所有合法 URI 字符的集合由非保留字符、保留字符、转义字符和其他字符组成。
所以。 URI识别失败。这就是构建代码失败的地方。
有两种解决方案:
- 使您的帐户名称或路径仅包含 US-ASCII 字符。
- 修补 URI 类(例如,通过重写函数 isURICharacter)