无法在Windows 7 x64上使用gradle构建spring框架

时间:2013-11-14 17:01:20

标签: java spring gradle windows-7-x64

平台: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 Framework版本:3.2.4或3.2.5

UAC:已启用或已停用

gradlew build(在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

我的问题是:为什么我的构建失败了?

1 个答案:

答案 0 :(得分:0)

问题发生在:referenceHtmlMulti任务正在执行。 如果我们查看groovy类,我们将看到XSLT转换用于创建docbook-reference。尽管使用了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 comparision也会返回true,那么函数将返回true。但这意味着相当接近的字符限制(来自代码0 - 126(〜))。但是非US-ASCII字符集呢?

让我们阅读关于非us-ascii字符的RFC 2396(可以存在于您的Windows路径中,代表您的本地语言,或者可以在帐户名称中找到,其中gradle解包并运行):其他类别 - Unicode字符不是US-ASCII字符集,不是控制字符(根据Character.isISOControl方法),并且不是空格字符(根据Character.isSpaceChar方法)(与RFC 2396的偏差,仅限于US- ASCII)。所有合法URI字符集由未保留,保留,转义和其他字符组成。

因此。 URI标识失败。这就是构建代码失败的地方。

有两种解决方案:

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