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

feat: add jpms definition for annotations #4313

Closed
wants to merge 0 commits into from

Conversation

copybara-service[bot]
Copy link
Contributor

feat: add jpms definition for annotations

Summary

Minimal set of changes to ship a module-info.java, and support JVM 1.8 for the annotations module only.

Reasoning

It costs almost nothing to support only the annotations on JVM 1.8, for projects which transitively include error-prone-annotations, which can happen via a simple dependency on something like Guava. But, it would be ideal to ship a module-info.java, so annotations is now a Multi-Release JAR, with a module-info.class in META-INF/versions/9.

I am working downstream to support JPMS in Guava, and this PR will be necessary for that to eventually land (without hackery). Checker Framework recently merged their support which means Error Prone is one of the last things on the classpath for Guava without a module-info.java definition.

Automatic Modules also aren't the answer because they cannot be used with jlink. Such dependencies must be processed by tools like Moditect before they can be used in fully modular Java builds. Because Error Prone Annotations is a dependency in Guava, and is itself very popular, many projects need Error Prone to adopt JPMS so they can ship their own code with modular Java support.

There may be libraries out there that depend on the annotations and not the compiler, who wish to ship a MRJAR and retain JVM 1.8 support (Guava).

Non-release version number change

One wrinkle here is that the Maven project version is used unconditionally as the --module-version; however, HEAD-SNAPSHOT is not a valid module identifier. This leaves only a few choices to support JPMS through recent (3.8.x+) Maven Compiler plugin versions:

  • HEAD-SNAPSHOT needs to become 1.0-HEAD-SNAPSHOT, and then it is a valid --module-version
  • Or, Maven Compiler Plugin needs to ship a bugfix and Error Prone will need to wait for a release (if a bugfix ships at all)

I understand this can be a breaking change somewhere within Google, but I don't see a way around this without resorting to severe build hacks. I've gotten it to build anyway by building the module-info.java only in a separate Maven project, and then copying it into the JAR at the last moment, but there are serious issues with that route so I suggest it be abandoned in favor of a version string change during dev, if possible.

Changelog

  • feat: add module-info to annotations module
  • feat: ship annotations as a Multi-Release JAR
  • feat: support 1.8 through latest JDK for annotations module
  • fix: remove automatic module definition from annotations module
  • fix: HEAD-SNAPSHOT1.0-HEAD-SNAPSHOT, because of a Maven Compiler Plugin issue precluding use as a module version

Fixes and closes #2649

Fixes #4311

FUTURE_COPYBARA_INTEGRATE_REVIEW=#4311 from sgammon:feat/jpms d209b0c

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.

Add module-info.java
0 participants