<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>Hello,<br>
<br>
This note is is to raise awareness of a forthcoming proposal to
change the default annotation processing policy in javac <span class="moz-txt-star"><span class="moz-txt-tag">in JDK 23</span></span><b class="moz-txt-star"><span class="moz-txt-tag"> *</span>without<span class="moz-txt-tag">*</span></b> removing any annotation
processing capabilities from javac.<br>
<br>
PR: <a class="moz-txt-link-freetext" href="https://github.com/openjdk/jdk/pull/19331">https://github.com/openjdk/jdk/pull/19331</a><br>
CSR: <a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8321319">https://bugs.openjdk.org/browse/JDK-8321319</a><br>
<br>
In summary, with the proposed change, annotation processing will
only be run with some explicit configuration of annotation
processing or with an explicit request to run annotation
processing on the javac command line. This would be a change in
behavior from the existing default of looking to run annotation
processing by searching the class path for processors _without_
any explicit annotation processing related options needing to be
present.<br>
</p>
<p>Invocations of javac that rely on annotation processing without
any explicit annotation processing configuration will need to be
updated to keep running annotation processors. In JDK 21 and 22,
javac prints a note identifying such invocations. To preserve the
old behavior, "-proc:full" can be passed to javac. Support for "-proc:full"
has been backported to several update release trains and is also
supported as of a recent version of the Maven Compiler plugin.
Additional details below.</p>
<p>----------------<br>
</p>
<p> Some background information, annotation processing is a
compile-time facility added to the Java platform as a standard
feature by JSR 269 in Java SE 6. In the JDK, standardized
annotation processing is supported by javac; javac has three
policies for combining compilation and annotation processing: <br>
<br>
1) annotation processing followed by compilation <br>
2) annotation processing alone <b class="moz-txt-star"><span class="moz-txt-tag">*</span>without<span class="moz-txt-tag">*</span></b>
compilation <br>
3) compilation <b class="moz-txt-star"><span class="moz-txt-tag">*</span>without<span class="moz-txt-tag">*</span></b> annotation processing <br>
<br>
The second policy is requested using javac's "-proc:only" command
line option and the third policy is requested using javac's
"-proc:none" option. Starting in JDK 6, the first option was the
default behavior in javac and the policy did not have an explicit
name. JDK 21 added a "-proc:full" option to give a name to the
historical default. Also, starting in JDK 21, javac prints a note
if implicit usage of annotation processing under the default
policy is detected; the note details various configuration options
to avoid generation of the message. [1]<br>
<br>
If this note is generated with JDK 21 or 22, the javac
configuration will need to be updated to keep running annotation
processors under the revised default policy.<br>
<br>
As of the April 2024 JDK security updates, support for the
"-proc:full" option has been backported to 17u (17.0.11) and 11u
(11.0.23) for both Oracle JDK and OpenJDK distributions. [2]
Additionally, Oracle's 8u release (8u411) also supports
"-proc:full".<br>
<br>
The old default behavior implicitly scans the class path looking
for annotation processors that match annotations present in the
set of source files being processed. Such processors are
instantiated and code in those processors run in the context of
the compiler. This policy of implicitly running annotation
processors by default may have been reasonable when the feature
was introduced in JDK 6 circa 2006, but from a current
perspective, in the interest of making build output more robust
against annotation processors unintentionally being placed on the
class path, the policy should not be the default anymore.<br>
<br>
The proposal is in JDK 23 to modify javac's default behavior to no
longer implicitly look for annotation processors on the class
path. To reiterate, the old class path searching behavior can be
requested by including "-proc:full" when invoking javac or
otherwise explicitly configuring the compilation for annotation
processing. There are currently no plans to remove the
"-proc:full" functionality.<br>
<br>
This policy change was original made in an early-access JDK 22
build, but was later backed out due to larger than expected
behavioral compatibility impacts. Since that time, "-proc:full"
has been backported to earlier release trains and as of
maven-compiler-plugin 3.13.0, the Maven Compiler plugin allows
"-proc:full" as a compiler argument. [3] Thanks to the Maven
maintainers for making this update.<br>
<br>
With "-proc:full" backported, it is possible to configure a build
that will work the same before and after the change in javac's
default policy and run annotation processors out of the class path
without any other options.<br>
<br>
To summarize different scenarios and how they would be impacted by
the policy change: <br>
<br>
* compilation based on the class path, but <b class="moz-txt-star"><span class="moz-txt-tag">*</span>without<span class="moz-txt-tag">*</span></b> relying on implicit
annotation processing: no effect from the policy change <br>
* compilation explicitly configured for annotation processing
(--processor-path, -processor, -proc:full etc.): no effect from
the policy change <br>
* compilation based on the class path that does rely on implicit
annotation processing: annotation processors would not run under
the new policy. Use "-proc:full" or otherwise configure annotation
processing to keep running. <br>
<br>
I'm aiming to have this change, JDK-8321314, implemented in JDK 23
before ramp down 1. <br>
<br>
Cheers, <br>
<br>
-Joe <br>
</p>
<p>[1] The full text of the note is: <br>
</p>
<blockquote type="cite" style="color: #007cff;">Annotation
processing is enabled because one or more processors were found <br>
on the class path. A future release of javac may disable
annotation processing <br>
unless at least one processor is specified by name (-processor),
or a search <br>
path is specified (--processor-path, --processor-module-path), or
annotation <br>
processing is enabled explicitly (-proc:only, -proc:full). <br>
Use -Xlint:-options to suppress this message. <br>
Use -proc:none to disable annotation processing. <br>
</blockquote>
<br>
[2] See backport information in JDK-8308245: "Add -proc:full to
describe current default annotation processing policy":<br>
<a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-8308245">https://bugs.openjdk.org/browse/JDK-8308245</a>
<br>
<br>
[3] With the change, in Maven the property will appear as: "User
Property: maven.compiler.proc" and therefore users may configure it
via `-Dmaven.compiler.proc=full` on the command-line. For more
information see: <br>
<br>
<a class="moz-txt-link-freetext" href="https://issues.apache.org/jira/browse/MCOMPILER-548">https://issues.apache.org/jira/browse/MCOMPILER-548</a><br>
<a class="moz-txt-link-freetext" href="https://www.mail-archive.com/dev@maven.apache.org/msg132181.html">https://www.mail-archive.com/dev@maven.apache.org/msg132181.html<br>
</a><a class="moz-txt-link-freetext" href="https://maven.apache.org/plugins/maven-compiler-plugin/download.cgi">https://maven.apache.org/plugins/maven-compiler-plugin/download.cgi</a>
<p><br>
</p>
</body>
</html>