平台: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识别失败。这就是构建代码失败的地方。

有两种解决方案:

  1. 使您的帐户名称或路径仅包含 US-ASCII 字符。
  2. 修补 URI 类(例如,通过重写函数 isURICharacter)


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!