Hi OpenJDK Core Developers,

you may know the Apache Lucene team is testing early access releases of Java 9. 
We reported many bugs already, but most of them only applied to Hotspot and 
Lucene itsself. But this problem since build 108 is now really severe, because 
it breaks the build system already!

To allow further testing of Open Source Projects, I'd suggest to revert the 
Multi-Release-JAR runtime support patch and provide a new preview build ASAP, 
because we found out after a night of debugging a build system from which we 
don't know all internals what is causing the problems and there is no 
workaround. I am very sorry that I have to say this, but it unfortunately build 
108 breaks *ALL* versions of Apache Ant, the grandfather of all Java build 
systems :-) I know also OpenJDK is using it, too! So with Multi-Release JAR 
file patch applied (see 
http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/f9913ea0f95c), any Ant-based build 
- including the JDK build itsself - would no longer bootstrap. It is impossible 
to also build Gradle projects, because Gradle uses Ant internally for many 
tasks). Maven projects may be affected, too.

Now you might have the question: What happened?

We tried to build Lucene on our Jenkins server, but the build itsself failed 
with a stupid error message:

BUILD FAILED
/home/jenkins/workspace/Lucene-Solr-master-Linux/build.xml:21: The following 
error occurred while executing this line:
/home/jenkins/workspace/Lucene-Solr-master-Linux/lucene/common-build.xml:56: 
not doesn't support the nested "matches" element.

The first idea was: Ah, there were changes in XML parsing (JDK-8149915). So we 
debugged the build. But it was quite clear that XML parsing was not the issue. 
It got quite clear when we enabled "-debug" on the build. What happened was 
that Ant was not loading its internal conditions/tasks/type definitions 
anymore, so the build system does not know almost any type anymore. The debug 
log showed that Ant was no longer able to load the resource 
"/org/apache/tools/ant/antlib.xml" from its own JAR file anymore. Instead it 
printed some strange debugging output (which looked totally broken).

I spend the whole night digging through their code and found the issue: The 
commit of Multi-Release-Jar files (see 
http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/f9913ea0f95c) broke resource 
handling in Apache Ant. In short: If you call ClassLoader.getResources() / or 
getResource() you get back an URL from where you can load the Resource - this 
is all fine and still works. But, with the Multi-Release JAR files patch this 
now has an URL fragment appended to the URL: '#release' (see 
http://hg.openjdk.java.net/jdk9/jdk9/jdk/rev/f9913ea0f95c); this also applies 
to non-multi-release JAR files like Apache Ant's "ant.jar".

In Java 7, Java 8,... and Java 9pre-b108, 
ClassLoader.getResource()/getResources() returned stuff like: 

"jar:file:/C:/Program%20Files/Java/apache-ant-1.9.6/lib/ant.jar!/org/apache/tools/ant/antlib.xml"

Now in Java 9b108 the following is returned:

"jar:file:/C:/Program%20Files/Java/apache-ant-1.9.6/lib/ant.jar!/org/apache/tools/ant/antlib.xml#release"

And here Ant breaks (and I assume many other projects like Maven, too). Ant 
checks for the file extension of the string (because it may load definitions 
from both XML and properties files). So it does endsWith(".xml") and of course 
this now returns false. The effect is that Ant tries to load its own task 
definitions as a java properties file instead of XML. Of course this fails, 
because the data behind this URL is XML. The effect is that Ant cannot 
bootstrap as everything to build is missing.

One might say: Ant's code is broken (I agree, it is not nice because it relies 
on the string representation of the resource URL - which is a no-go anyways), 
but it is impossible to fix, because Ant is bundled on most developer computers 
and those will suddenly break with Java 9! There is also no version out there 
that works around this, so we cannot test anything anymore!

The problematic line in Ant's code is here: 
http://grepcode.com/file/repo1.maven.org/maven2/org.apache.ant/ant/1.9.6/org/apache/tools/ant/taskdefs/Definer.java?av=f#259

I'd suggest to please ASAP revert the Multi-Release JAR file patch and provide 
a new preview build as soon as possible. I think there is more work needed to 
fix this. If this does not revert to the original state, it will be impossible 
to build and test Lucene, Elasticsearch,.... (and almost every Java project out 
there!). So short: We cannot test anymore and it is likely that we cannot 
support Java 9 anymore because the build system used by most Java projects 
behind the scenes does not bootstrap itself anymore.

My suggestion would be to investigate other versions for this patch that does 
*not* modify the resource URLs by appending a fragment to them (at least not 
for the "standard" case without an actual Multi-Release Jar). For new 
multi-release JAR files I am fine with appending fragments, but please not for 
default ones. Maybe change code to handle the URLs from the non-versioned part 
differently (without fragment). Leaving the fragment inide may break many othe 
rprojects, because many programmers are very sloppy with handling URLs 
(well-known issue is calling URL#getFile() of a file:-URL that breaks on 
Windows systems and spaces in path name). Many people just call toString() on 
URL and do some test on it (startsWith, endsWith). So appending fragments is a 
no-go for backwards compatibility with JAR resources!

I posted this to the mailing list and did not open a bug report on 
http://bugs.java.com/, because this is a more general issue - feel free to open 
bug reports around this!!! I would be very happy if we could find a quick 
solution for this problem. Until there is a solution we have to stop testing 
Java 9 with Apache Lucene/Solr/..., and this is not a good sign, especially as 
Jigsaw will be merged soon.

Thanks for listening,
Uwe

P.S.: I also CCed the Apache Ant team. They should fix the broken code anyways, 
but this won't help for many projects already out there (e.g. Apache Lucene 
still has a minimum requirement of Ant 1.8.2 because MacOSX computers ship with 
that version since years).

-----
Uwe Schindler
uschind...@apache.org 
ASF Member, Apache Lucene PMC / Committer
Bremen, Germany
http://lucene.apache.org/


Reply via email to