You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Paul King (Jira)" <ji...@apache.org> on 2019/12/09 21:37:02 UTC

[jira] [Closed] (GROOVY-9197) Groovyc fails to correctly propagate classpath entries to javac when run under JDK 11

     [ https://issues.apache.org/jira/browse/GROOVY-9197?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Paul King closed GROOVY-9197.
-----------------------------

> Groovyc fails to correctly propagate classpath entries to javac when run under JDK 11
> -------------------------------------------------------------------------------------
>
>                 Key: GROOVY-9197
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9197
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.5.7
>            Reporter: Artsiom Matronkin
>            Assignee: Eric Milles
>            Priority: Major
>             Fix For: 2.5.9, 3.0.0-rc-2
>
>         Attachments: groovycCpIssue.zip
>
>          Time Spent: 40m
>  Remaining Estimate: 0h
>
> *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:
>   
> {code:java}
> // 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();
>     }
> {code}
>  
> 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.
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)