1.问题描述
在IDEA中用gradle插件执行javadocJar任务,抛异常
对应的build.gradle配置如下
javadoc {
if (JavaVersion.current().isJava9Compatible()) {
options.addBooleanOption('html5', true)
}
if (JavaVersion.current().isJava8Compatible()) {
options.addStringOption('Xdoclint:none', '-quiet')
}
options {
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
}
}
异常堆栈如下
java.lang.IllegalArgumentException
at sun.net.www.ParseUtil.decode(ParseUtil.java:202)
at sun.misc.URLClassPath$JarLoader.<init>(URLClassPath.java:586)
at sun.misc.URLClassPath$3.run(URLClassPath.java:352)
at java.security.AccessController.doPrivileged(Native Method)
at sun.misc.URLClassPath.getLoader(URLClassPath.java:341)
at sun.misc.URLClassPath.getLoader(URLClassPath.java:318)
at sun.misc.URLClassPath.access$000(URLClassPath.java:76)
at sun.misc.URLClassPath$1.next(URLClassPath.java:215)
at sun.misc.URLClassPath$1.hasMoreElements(URLClassPath.java:226)
at java.net.URLClassLoader$3$1.run(URLClassLoader.java:410)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader$3.next(URLClassLoader.java:407)
at java.net.URLClassLoader$3.hasMoreElements(URLClassLoader.java:432)
at sun.misc.CompoundEnumeration.next(CompoundEnumeration.java:45)
at sun.misc.CompoundEnumeration.hasMoreElements(CompoundEnumeration.java:54)
at clojure.lang.EnumerationSeq.create(EnumerationSeq.java:29)
at clojure.core$enumeration_seq.invoke(core.clj:5170)
at leiningen.core.project$load_plugins.invoke(project.clj:586)
at leiningen.core.project$load_plugins.invoke(project.clj:596)
at leiningen.core.project$init_project.invoke(project.clj:731)
at leiningen.core.main$_main$fn__1421.invoke(main.clj:309)
at leiningen.core.main$_main.doInvoke(main.clj:304)
at clojure.lang.RestFn.invoke(RestFn.java:408)
at clojure.lang.Var.invoke(Var.java:415)
at clojure.lang.AFn.applyToHelper(AFn.java:161)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.core$apply.invoke(core.clj:617)
at clojure.main$main_opt.invoke(main.clj:335)
at clojure.main$main.doInvoke(main.clj:440)
at clojure.lang.RestFn.invoke(RestFn.java:436)
at clojure.lang.Var.invoke(Var.java:423)
at clojure.lang.AFn.applyToHelper(AFn.java:167)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)
2.先说结论
在网上查到异常原因可能是:gradle在执行javadocJar任务的时候,会从系统的环境变量中读取ClassPath这个环境变量,ClassPath中使用%JAVA_HOME%相对路径,导致解码器得到一个包含未转义百分比符号的字符串,无法解码,从而抛出异常。
相关回答如下:
stackoverflow.com/questions/3…
stackoverflow.com/questions/1…
stackoverflow.com/questions/2…
解决方式就是删除ClassPath环境变量,重启电脑,此操作对我的情况有效。
其他解决方式有修改build.gradle配置中javadoc任务的编码属性的,我试过,对我不起效,而且这种方式说服力不够,我就是想指定编码格式为UTF-8,而不是被限制为Windows系统的GBK编码,因为这份文件肯定回在LInux系统中运行,我希望的是这份文件不会被环境所限制,不同因为环境而替换编码。
3.异常追踪
用IDEA的debug模式启动gradle的javadocJar,在异常输出日志中确实看到了ClassPath这个环境变量key和对应的值,如下
向上看触发这个日志输出的任务,能看出来是org.gradle.process.internal.DefaultExecHandle函数调用了jdk中的javadoc.exe程序,并且读取了系统的环境变量,并且其中包括CLASSPATH这个环境变量。
暂时还无法debug到具体的发生异常的上下文