Hi,
On 20.07.22 13:04, Romain Manni-Bucau wrote:
> There is no need to use toolchain to run your build with JDK17 and
> create code for Java 8... you can use --release 8
> (<maven.compiler.release>8</maven.compiler.release>)...
>
> No toolchain needed.
So you run tests with java 17? This is not what you want if your prod is
in java 8, you can still get surprises so you need toolchain in your
build (same happen for compilation since bytecode is not 1-1, only
signatures).
First what kind of surprises?
Second can you show an example of different bytes codes?
Kind regards
Karl Heinz Marbaise
Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> | Blog
<https://rmannibucau.metawerx.net/> | Old Blog
<http://rmannibucau.wordpress.com> | Github
<https://github.com/rmannibucau> | LinkedIn
<https://www.linkedin.com/in/rmannibucau> | Book
<https://www.packtpub.com/application-development/java-ee-8-high-performance>
Le mer. 20 juil. 2022 à 11:58, Jorge Solórzano <jor...@gmail.com
<mailto:jor...@gmail.com>> a écrit :
> >
> > Fair enough, they can remain just for backward compatibility,
but even
> > if javac does not remove it, it doesn't mean that are useful having
> > --release, and there are probably more for backward
compatibility than
> > anything else, again, this is just to drop legacy baggage.
>
> That's not legacy baggage because it's officially supported. So
no legacy.
>
> To be honest I don't understand that. The JDK (javac) supports
that so
> why should be remove such support for that in Maven?
The fact that JDK (javac) supports that, doesn't mean it's not legacy,
there are many
features, APIs, and so on that are still there just for backward
compatibility.
I still haven't seen any single project that sets the source and the
target with different
versions and the source should always be lower than the target,
meaning that you still
need to compile up to the current JDK version. Just to give you an
example, you can compile a
class using javac --source 14 --target 17 (you need JDK 17), but you
can't use
javac --source 17 --target 14 (you can't use new features that target
older versions),
if you are using --target 17, why would you don't use --source 17 in
the first place?
The JEP 247 (--release) was designed to link against the
implementation of the given
platform version as it was demonstrated that the --source and --target
were not enough
to avoid accidentally using APIs only available in the current version
of the platform.
If you compile with --source 8 and --target 8 using JDK 17, you could
potentially end up
using APIs that should not be supposed to be used for that version.
There are many examples out there like
https://issues.apache.org/jira/browse/LUCENE-7292
<https://issues.apache.org/jira/browse/LUCENE-7292>
that shows this issue.
Just quoting Brian Goetz:
"The --release flag was added later, and in most cases, should replace
uses of --source and --target."
* https://stackoverflow.com/a/61715683/1990790
<https://stackoverflow.com/a/61715683/1990790>
My point is that if Maven starts requiring JDK 17 (or even JDK 11),
that would mean that
if you want to compile to older platforms you will need to use:
a) Toolchains (which is not the most user-friendly feature)
b) or --release
The use of --source and --target is just error-prone to get
cross-compile issues and should be avoided.
The only single place that might make sense to keep them is when using
Toolchains *and* that the JDK
is version 8 or lower where --release is not included.
So, enough bikeshedding from me, I tried to explain it the best
possible way and I don't really
have any issue if the feature is there as I simply ignore it and use
only --release.
>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@maven.apache.org
For additional commands, e-mail: dev-h...@maven.apache.org