Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java runtime: add module-info.java and multi-release build to support… #4137

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

alexberdnik
Copy link

This PR fixes #2946 by adding module-info.java to antlr-runtime module of the project. This is done as "multi-release jar" which allows to specify multiple versions of classes for different java versions. In this case the module is compiled for java 8 with java 9 classes stored in META-INF/versions/9.

Module-info.java exports module named org.antlr.antlr.runtime. This differs from the original automatic-module-name (org.antlr.antlr4.runtime) because JPMS doesn't like trailing digits in names.

Module exports all packages except org.antlr.v4.runtime.tree.pattern and org.antlr.v4.runtime.tree.xpath. Please let me know if these are used outside the module and should be included as well.

@parrt
Copy link
Member

parrt commented Mar 5, 2023

i think we're stuck at jdk 8 for now...

@alexberdnik
Copy link
Author

alexberdnik commented Mar 5, 2023

That's ok, the runtime will continue to work under java 8. module-info.java will only be visible on java 9+ - see https://openjdk.org/jeps/238

@alexberdnik alexberdnik force-pushed the enhancement/add_module_info_for_java_runtime branch from 5c55eef to fc83811 Compare March 6, 2023 19:44
Signed-off-by: Alexander Berdnik <[email protected]>
@alexberdnik
Copy link
Author

i think we're stuck at jdk 8 for now...

I just noticed that antlr4-maven-plugin requires java 11+, otherwise I'm getting wrong class version error...

I tested locally with these code (sample json parser):

        final JSONLexer lexer = new JSONLexer(CharStreams.fromString(json));
        final JSONParser parser = new JSONParser(new CommonTokenStream(lexer));
        final JSONParser.JsonContext ctx = parser.json();
        System.out.println(ctx.toStringTree());

... and the snapshot version of the runtime (one with module-info.java)
The code works perfectly in modular environment (with module path) and also on java 8 jvm. For java 8 build, release option of the compiler is important, otherwise we could face phantom issues like this one.

So to sum-up:

  • runtime works both on java 8 and java 9 +
  • the project itself should be built by java 9+
  • (found during testing) latest antlr4-maven-plugin requires java 11 (tested 4.12.0 and 4.11.1, both are not working on java 8).

@bowbahdoe
Copy link

I think I might have duplicated this one #4383

But in that PR, small difference is that I don't think Java 9 is required to build, so the JDK wouldn't need to be changed anywhere.

@alexberdnik
Copy link
Author

I'm not sure moditect works without java 9 - you need to compile module-info.java somehow and java 8 compiler just can't do it.
Anyway, you won't be able to compile the project with java < 11, as I mentioned before.
Moditect-based approach looks a bit hacky for me - if the module-info.java can be written directly in the project, why don't just do that? I do understand that this may be the only way if you use a third-party library and don't have access to the source code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ANTLR as a named Java module
3 participants