@@ -17,6 +17,37 @@ dependencies can instead be placed in separate or grouped layers so
1717application-only changes retain the same dependency-layer digests for
1818registry- and fleet-wide cache reuse.
1919
20+ ## How it fits together
21+
22+ ``` mermaid
23+ flowchart
24+ binary["java_binary or scala_binary"]
25+ runtime["Runtime JARs<br/>JavaRuntimeClasspathInfo"]
26+ data["Binary runfiles<br/>and explicit data"]
27+ lock["Optional Maven lock file"]
28+ rule["jvm_jar_layers"]
29+
30+ binary --> runtime --> rule
31+ binary --> data --> rule
32+ lock -.->|artifact routing| rule
33+
34+ rule --> maven["Maven dependency layers<br/>/app/lib/*.jar"]
35+ rule --> fallback["Fallback layer<br/>app JARs + unmatched JARs"]
36+ rule --> runfiles["Data layer<br/>/app/<repo>/..."]
37+ rule --> classpath["/app/lib/classpath"]
38+ classpath --> fallback
39+
40+ base["Base JVM image"] --> image["OCI image rule"]
41+ maven --> image
42+ fallback --> image
43+ runfiles --> image
44+
45+ image --> output["OCI image"]
46+ output --> entrypoint["Entrypoint<br/>java -cp @/app/lib/classpath MainClass"]
47+ entrypoint -.->|loads intact JARs| maven
48+ entrypoint -.->|loads app and fallback JARs| fallback
49+ ```
50+
2051## Install
2152
2253Until the module is published to a registry, add a pinned override to the
@@ -25,10 +56,13 @@ client's `MODULE.bazel`:
2556``` starlark
2657bazel_dep(name = " jvm_image" , version = " 0.1.0" )
2758
28- git_override (
59+ archive_override (
2960 module_name = " jvm_image" ,
30- commit = " <full-commit-sha>" ,
31- remote = " https://github.com/stackb/jvm_image.git" ,
61+ integrity = " sha256-FcnG0wSlMCAIGnLykKyQIshz8jauYHi8KEdDX5nNG+A=" ,
62+ strip_prefix = " jvm_image-0.1.0" ,
63+ urls = [
64+ " https://github.com/stackb/jvm_image/releases/download/v0.1.0/jvm_image-v0.1.0.tar.gz" ,
65+ ],
3266)
3367```
3468
@@ -83,6 +117,38 @@ runfiles layer under `/app`. Workspace files use
83117the application uses Bazel's runfiles lookup conventions. Host JDK files,
84118binary launchers, and runtime JARs are excluded from this data layer.
85119
120+ The ` example/hello ` oci_tarball has the following structure:
121+
122+ ```
123+ --- sha256:c4fd6f20ece135d1caf7d46368138b7aa58603e775f01c24479912075ec8c490 ---
124+ Mode Size Name
125+ -rw-r--r-- 34 B app/_main/greeting.txt
126+ -rw-r--r-- 36 B app/_main/runtime/native.marker
127+
128+ --- sha256:19730c7f427ef030cf5b9eb1b610fc5d01855a9100e0ea08bdd5da06640fca7f ---
129+ -rw-r--r-- 1.2 kB app/lib/hello.jar
130+ -rw-r--r-- 2.3 kB app/lib/processed_listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
131+ -rw-r--r-- 364 B app/lib/classpath
132+
133+ --- sha256:3abdf128e65e2e1437f3ac7346c0e9fabdf3f9842a99cbcbef42207181b64065 ---
134+ -rw-r--r-- 21 kB app/lib/processed_jsr305-3.0.2.jar
135+
136+ --- sha256:1cbbdab98aee4c1ea5436f305f2cd68169443dfa4f0931becb4800d73371706f ---
137+ -rw-r--r-- 19 kB app/lib/processed_error_prone_annotations-2.36.0.jar
138+
139+ --- sha256:58c28ed69316ce659037cb1df9c51533878a956c5e8bbe3bca7be9ef5bb428f7 ---
140+ -rw-r--r-- 4.8 kB app/lib/processed_failureaccess-1.0.2.jar
141+
142+ --- sha256:a6ef98beaef5ab8b409ca6cec41b3d5be38804bcec418b3c3138cd470e5704e3 ---
143+ -rw-r--r-- 3.1 MB app/lib/processed_guava-33.4.0-jre.jar
144+
145+ --- sha256:8d650354e3037e3908f78628d47b637d0ec1922988c5f24a75b2a15626502c8b ---
146+ -rw-r--r-- 12 kB app/lib/processed_j2objc-annotations-3.0.0.jar
147+
148+ --- sha256:05fd8c687c7112da76548914db47d51d43f023ce2ac3cde4dc91c1a8aad92bd0 ---
149+ -rw-r--r-- 232 kB app/lib/processed_checker-qual-3.43.0.jar
150+ ```
151+
86152## Configuration notes
87153
88154- ` maven_lock_file ` is optional. When omitted, every runtime JAR goes to the
0 commit comments