Skip to content

Support RunfilesGroupInfo - #368

Open
malt3 wants to merge 1 commit into
bazelbuild:masterfrom
malt3:support_runfiles_groups
Open

Support RunfilesGroupInfo#368
malt3 wants to merge 1 commit into
bazelbuild:masterfrom
malt3:support_runfiles_groups

Conversation

@malt3

@malt3 malt3 commented Jul 24, 2026

Copy link
Copy Markdown

Teach the Java rules to describe their runfiles as named, ordered groups so that downstream packaging rules can build more efficient artifacts.

java_binary, java_test, java_library, and java_import now return RunfilesGroupInfo (and RunfilesGroupMetadataInfo) from the rules_runfiles_group ruleset alongside DefaultInfo. Instead of seeing a single flat runfiles tree, a packaging rule (e.g. a container-image or archive rule) can split a binary's runfiles into layers and order them so that the content that changes least often lands in the most cacheable layers:

  • the JDK / java_runtime at the foundation tier (never merged),
  • java_import targets (typically third-party jars) at the shared-deps tier,
  • first-party java_library code, the binary's own jars, and the executable at the executable tier.

Libraries propagate fine-grained per-target groups up through their dependents; the binary collects them, adds its own groups, and tags every group it produces with the rules_java merge affinity so that JVM-shaped groups stay together when a packager has to merge groups to fit a layer limit. java_import gains a runfiles_weight attribute so dependency-management rulesets can hint at relative sizes to guide those merge decisions.

Consumers that don't understand RunfilesGroupInfo are unaffected and keep using DefaultInfo.default_runfiles.

Adds a dependency on rules_runfiles_group for both Bzlmod and WORKSPACE setups.

Validation

I took the liberty to host a BCR mirror that has support enabled for rules_java and rules_img. I also created a demo repo to show the effect.

This shows two java_binary targets with overlapping dependencies. Both are packaged as container images.
Without RunfilesGroupInfo, the whole java_binary is stored as a single layer and there is no sharing (only the base image layer is shared):

With RunfilesGroupInfo, individual runfiles from java_library targets get their own layers and most of the content is shared across the container images:

@malt3
malt3 requested review from a team and hvadehra as code owners July 24, 2026 16:38
@malt3
malt3 force-pushed the support_runfiles_groups branch 2 times, most recently from eb1d207 to a0618f8 Compare July 24, 2026 16:48
Comment thread java/bazel/rules/bazel_java_binary.bzl Outdated
Comment thread java/bazel/rules/bazel_java_binary.bzl Outdated
@malt3

malt3 commented Jul 24, 2026

Copy link
Copy Markdown
Author

I discussed with @fmeum that it's possible to make this provider a lot more memory efficient. I'll also add a global flag to enable/disable the emition of this provider for memory conscious users.
I'll update this PR accordingly.

Comment thread java/bazel/rules/bazel_java_binary.bzl Outdated
@malt3
malt3 force-pushed the support_runfiles_groups branch 2 times, most recently from f989530 to 705d909 Compare July 27, 2026 12:56

@fmeum fmeum left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can mark this rfr.

@malt3

malt3 commented Jul 27, 2026

Copy link
Copy Markdown
Author

You can mark this rfr.

I will, but it's referencing a prerelease version of rules_runfiles_group.
I'll kick off a new release of that module now. Just FYI for any reviewer.

EDIT: done. Now pointing at rules_runfiles_group@0.1.0

@malt3
malt3 marked this pull request as ready for review July 27, 2026 14:57
Teach the Java rules to describe their runfiles as named, ordered groups
so that downstream packaging rules can build more efficient artifacts.

`java_binary`, `java_test`, `java_library`, and `java_import` now return
`RunfilesGroupInfo` from the `rules_runfiles_group` ruleset alongside
`DefaultInfo`. Instead of seeing a single flat runfiles tree, a packaging rule
(e.g. a container-image or archive rule) can split a binary's runfiles into
layers and order them so that the content that changes least often lands in the
most cacheable layers:

  * the JDK / java_runtime at the foundation tier (never merged),
  * `java_import` targets (typically third-party jars) at the shared-deps tier,
  * `java_library` code, the binary's own jars, and the executable at the
    executable tier, marked `first_party` only for targets in the main
    repository -- plenty of Java code Bazel builds from source belongs to
    somebody else.

Libraries propagate fine-grained per-target groups up through their dependents
as a depset of group entries, each carrying its own metadata, so what a target
retains does not grow with the size of its closure. The binary collects them,
adds its own groups, and tags every group it produces with the `rules_java`
merge affinity so that JVM-shaped groups stay together when a packager has to
merge groups to fit a layer limit. A dependency that returns `JavaInfo` but no
`RunfilesGroupInfo` -- a custom rule, or `rules_jvm_external`'s `jvm_import` --
gets a synthesized group covering its transitive runtime jars and its default
runfiles, so a packager never silently loses its files. `java_import` gains a
`runfiles_weight` attribute so dependency-management rulesets can hint at
relative sizes to guide those merge decisions.

Emission is off by default and gated on the ruleset-wide
`--@rules_runfiles_group//runfiles_group:enabled` flag, so a build that packages
nothing pays nothing for the providers. Consumers that don't understand
`RunfilesGroupInfo` are unaffected and keep using
`DefaultInfo.default_runfiles`.

Adds a dependency on `rules_runfiles_group` for both Bzlmod and WORKSPACE
setups.
@malt3
malt3 force-pushed the support_runfiles_groups branch from 705d909 to 1ad4ccc Compare July 27, 2026 17:00
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.

2 participants