RFR: 8297455: Use the official ToolProvider API to call javac

Magnus Ihse Bursie ihse at openjdk.org
Thu Dec 1 23:24:00 UTC 2022


On Tue, 22 Nov 2022 20:50:04 GMT, Magnus Ihse Bursie <ihse at openjdk.org> wrote:

> In JDK-8297041, the javacserver was moved out of the JDK itself, and lifted out as a separate buildtool. Due to this, internal classes in jdk.compiler were no longer available. Therefore, the closest way to calling javac as before were to use `com.sun.tools.javac.Main.compile()`. This method is however deprecated for removal, and relying on that was only needed as a temporary measure during the transition.
> 
> After the major refactoring of the javacserver tool in JDK-8297444, it will be easy to replace the Main.compile API with the official ToolProvider API instead.

I have now verified that the interim compiler is indeed used (made it say bad words and fail at startup, so there is no doubt about it :)). As to the reason why this is so, here is the magic incantation from `$(INTERIM_LANGTOOLS_ARGS)`:


    --limit-modules java.base,jdk.zipfs,$(INTERIM_LANGTOOLS_MODULES_COMMA) \
    --add-modules $(INTERIM_LANGTOOLS_MODULES_COMMA) \
    --module-path $(BUILDTOOLS_OUTPUTDIR)/interim_langtools_modules \
    --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/gensrc/java.base.interim \
    --add-exports java.base/sun.reflect.annotation=jdk.compiler.interim \
    --add-exports java.base/jdk.internal.jmod=jdk.compiler.interim \
    --add-exports java.base/jdk.internal.misc=jdk.compiler.interim \
    --add-exports java.base/sun.invoke.util=jdk.compiler.interim \
    --add-exports java.base/jdk.internal.javac=java.compiler.interim \
    --add-exports java.base/jdk.internal.javac=jdk.compiler.interim \


I hope you are not asking me to explain in detail how or why this works. :-)

-------------

PR: https://git.openjdk.org/jdk/pull/11299



More information about the build-dev mailing list