Hi,

> > $ javac -source 8 -target 8 Test.java
> > warning: [options] bootstrap class path not set in conjunction with -source
> 1.8
> > 1 warning
> >
> So the question is how should javac behave with -source/-target when
> -bootclasspath is not specified. This has always been a problematic
> usage because it means javac compiling for the older edition of the Java
> Language but with the APIs for the runtime that javac is running on. The
> warning was added in JDK 7 to try to bring attention to the problematic
> usage. I'm not sure if anything should change now to align it with the
> policy for root modules. This may be something that Jon can comment on.
> The right thing is of course to add -bootclasspath or just replace the
> usage with `javac -release 8`.

I agree, that's already done in Lucene since yesterday:
https://issues.apache.org/jira/browse/LUCENE-7292

With that -release option, it of course does not fail, because it uses older 
ct.sym. The problem is now that you get no "warning" that the compilation may 
not work with Java 9. I would have expected to get a warning by javac where it 
says: "java.xml.bind" won't work by default in Java 9. Of course that's another 
discussion about pros and cons.

Here is one problem, I figured out about "-release":

Lot's of tools like Maven or Gradle make it really hard to pass "-release 8", 
because those tools have automatisms to automatically pass "source/target" to 
the javac compiler and you cannot do anything against that. Lucene/Solr is 
fine, because it uses Ant - but Elasticsearch has a hard time with Gradle: 
Gradle detects the Java version and passes the targeted release version as 
"1.8" automatically. If you add "-release 8", it fails because of incompatible 
command line arguments.

In addition, most tools still use "1.8" for everything before 9. So if you make 
it pass "-release" using the build systems's variables, it would pass "1.8". 
Unfortunately, it only accepts "-release 8", not "-release 1.8". I'd suggest to 
add support for old version numbers in the same way like source/target accepts 
both "1.8" and "8".

My proposal would be: If you start javac with "-source 1.8 -target 1.8" and 
don't pass a bootclasspath, it should switch to "-release 8" for convenience. 
What do you think? Alternatively allow source and target when passing release 
if it's not incompatible.

Uwe

Reply via email to