Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.5.7
-
None
-
None
Description
Repro Steps:
- unpack attached zip
- ensure CompileAntScript.xml references the version of groovy you have locally
- ensure JAVA_HOME is referencing JDK 11
- execute CompileAntScript.xml via Ant (ensure it is executed by JDK 11)
Actual Result:
[compile] C:\dev\workspace\search0625_11\groovycIssue\src\org
[compile] \groovy\issue\TestCompile.java:3: error: package org.apache.commons.lang3 does not exist
[compile] import static org.apache.commons.lang3
[compile] .StringUtils.isEmpty;
Try running same ant script via JDK 8 and it will compile successfully.
Investigation Details:
Looking into groovy codebase it seems there is a bug/issue in how org.codehaus.groovy.tools.javac.JavacJavaCompiler.java accumulates classpath entries which should be passed to javac:
// append classpath if not already defined if (!hadClasspath) { // add all classpaths that compilation unit sees List<String> paths = new ArrayList<String>(config.getClasspath()); ClassLoader cl = parentClassLoader; while (cl != null) { if (cl instanceof URLClassLoader) { for (URL u : ((URLClassLoader) cl).getURLs()) { try { paths.add(new File(u.toURI()).getPath()); } catch (URISyntaxException e) { // ignore it } } } cl = cl.getParent(); }
It iterates over hierarchy of classloaders and assumes AppClassLoader is an instance of URLClassLoader. This assumption was correct in Java 8 but is not correct in Java 11 (https://blog.codefx.org/java/java-11-migration-guide/ - ‘Casting to URLClassLoader’ chapter). Thus most of jars are not passed to javac as classpath and compilation fails.
Attachments
Attachments
Issue Links
- links to