Mark war-provided libraries as neverlink inside the Gerrit tree When Gitiles is built as a Gerrit plugin from source, the plugin jar was packaging the full transitive closure of libraries that Gerrit already ships in gerrit.war (Guava, Gson, Soy, ICU4J, JGit, commons-lang3/io, text/reload4j/flogger, ASM, html-types, ...). That inflated gitiles.jar to ~34 MB of classes that are already on the plugin's runtime classpath via gerrit.war -- pure duplication. Introduce lib/provided.bzl with a provided_java_library() wrapper: a single java_library whose neverlink attribute is a select() on the existing @com_googlesource_gerrit_bazlets//flags:in_gerrit_tree flag. Gerrit sets that flag in its .bazelrc; standalone Gitiles never does, so it defaults to false. * Standalone (flag false): the libraries are linked exactly as before and bundled into gitiles.war -- no behavioral change, zero regression risk. * In the Gerrit tree (flag true): they become neverlink, so their classes are dropped from the plugin's runtime closure and are not re-packaged into gitiles.jar. Gerrit already provides them. Only libraries that gerrit.war actually ships are converted (lib/BUILD, lib/soy, lib/flogger). Gitiles-only libraries (the commonmark family, java-prettify and autolink) stay linked in both configurations. Alternative considered: exclude the same closure with deploy_env from within the Gerrit plugin's BUILD (the pattern used by other plugins). We defer that here because in_gerrit_tree is more principled -- Gitiles itself declares "these are provided when I'm built inside Gerrit," so the knowledge lives with the dependency declarations instead of being duplicated as an exclusion list in Gerrit's plugin wiring. deploy_env remains a viable follow-up if we later prefer to keep this decision entirely on the Gerrit side. Change-Id: I4f12d3a4be71a89df8830ecc872877f869997a8c
diff --git a/lib/BUILD b/lib/BUILD index bd8b90a..3fd40f7 100644 --- a/lib/BUILD +++ b/lib/BUILD
@@ -1,9 +1,20 @@ load("@rules_java//java:defs.bzl", "java_library") +load("//lib:provided.bzl", "provided_java_library") package( default_visibility = ["//visibility:public"], ) +# True when Gitiles is built inside the Gerrit source tree; Gerrit sets +# --@com_googlesource_gerrit_bazlets//flags:in_gerrit_tree=true in its .bazelrc. +# Standalone Gitiles never sets it, so it defaults to false. +config_setting( + name = "in_gerrit_tree", + flag_values = {"@com_googlesource_gerrit_bazlets//flags:in_gerrit_tree": "true"}, + visibility = ["//visibility:public"], +) + +# Libraries that are NOT shipped in gerrit.war; the Gitiles plugin bundles them. [java_library( name = local_name, exports = [coord], @@ -11,18 +22,11 @@ ("autolink", "@external_deps//:org_nibor_autolink_autolink"), ("commonmark", "@external_deps//:org_commonmark_commonmark"), ("commons-codec", "@external_deps//:commons_codec_commons_codec"), - ("commons-io", "@external_deps//:commons_io_commons_io"), - ("commons-lang3", "@external_deps//:org_apache_commons_commons_lang3"), - ("commons-text", "@external_deps//:org_apache_commons_commons_text"), ("cm-autolink", "@external_deps//:org_commonmark_commonmark_ext_autolink"), ("gfm-strikethrough", "@external_deps//:org_commonmark_commonmark_ext_gfm_strikethrough"), ("gfm-tables", "@external_deps//:org_commonmark_commonmark_ext_gfm_tables"), ("cm-yaml-front-matter", "@external_deps//:org_commonmark_commonmark_ext_yaml_front_matter"), - ("html-types", "@external_deps//:com_google_common_html_types_types"), - ("jsr305", "@external_deps//:com_google_code_findbugs_jsr305"), ("servlet-api", "@external_deps//:javax_servlet_javax_servlet_api"), - ("gson", "@external_deps//:com_google_code_gson_gson"), - ("guava", "@external_deps//:com_google_guava_guava"), ("guava-failureaccess", "@external_deps//:com_google_guava_failureaccess"), ("ow2-asm", "@external_deps//:org_ow2_asm_asm"), ("ow2-asm-analysis", "@external_deps//:org_ow2_asm_asm_analysis"), @@ -31,13 +35,28 @@ ("ow2-asm-util", "@external_deps//:org_ow2_asm_asm_util"), ]] +# Libraries already shipped in gerrit.war: linked standalone, neverlink in-tree. +[provided_java_library( + name = local_name, + exports = [coord], +) for local_name, coord in [ + ("commons-io", "@external_deps//:commons_io_commons_io"), + ("commons-lang3", "@external_deps//:org_apache_commons_commons_lang3"), + ("commons-text", "@external_deps//:org_apache_commons_commons_text"), + ("html-types", "@external_deps//:com_google_common_html_types_types"), + ("jsr305", "@external_deps//:com_google_code_findbugs_jsr305"), + ("gson", "@external_deps//:com_google_code_gson_gson"), + ("guava", "@external_deps//:com_google_guava_guava"), + ("errorprone-annotations", "@external_deps//:com_google_errorprone_error_prone_annotations"), +]] + java_library( name = "prettify", visibility = ["//visibility:public"], exports = ["@java-prettify"], ) -java_library( +provided_java_library( name = "slf4j-api", exports = ["@external_deps//:org_slf4j_slf4j_api"], ) @@ -50,9 +69,8 @@ ], ) -java_library( +provided_java_library( name = "jgit", - visibility = ["//visibility:public"], exports = ["@jgit//org.eclipse.jgit:jgit"], runtime_deps = [ ":slf4j-api", @@ -60,9 +78,8 @@ ], ) -java_library( +provided_java_library( name = "jgit-archive", - visibility = ["//visibility:public"], exports = ["@jgit//org.eclipse.jgit.archive:jgit-archive"], runtime_deps = [":jgit"], ) @@ -75,9 +92,8 @@ runtime_deps = [":jgit"], ) -java_library( +provided_java_library( name = "jgit-servlet", - visibility = ["//visibility:public"], exports = ["@jgit//org.eclipse.jgit.http.server.ee8:jgit-servlet-ee8"], runtime_deps = [":jgit"], ) @@ -91,9 +107,3 @@ name = "commons-compress", exports = ["@external_deps//:org_apache_commons_commons_compress"], ) - -java_library( - name = "errorprone-annotations", - visibility = ["//visibility:public"], - exports = ["@external_deps//:com_google_errorprone_error_prone_annotations"], -)
diff --git a/lib/flogger/BUILD b/lib/flogger/BUILD index 57c6e5a..e48dd33 100644 --- a/lib/flogger/BUILD +++ b/lib/flogger/BUILD
@@ -1,8 +1,7 @@ -load("@rules_java//java:defs.bzl", "java_library") +load("//lib:provided.bzl", "provided_java_library") -java_library( +provided_java_library( name = "flogger", - visibility = ["//visibility:public"], exports = [ "@external_deps//:ch_qos_reload4j_reload4j", "@external_deps//:com_google_flogger_flogger",
diff --git a/lib/provided.bzl b/lib/provided.bzl new file mode 100644 index 0000000..89d3712 --- /dev/null +++ b/lib/provided.bzl
@@ -0,0 +1,29 @@ +"""Wrapper for libraries that Gerrit already ships in gerrit.war. + +Standalone Gitiles links these and bundles them into gitiles.war as usual. +When Gitiles is built inside the Gerrit tree +(--@com_googlesource_gerrit_bazlets//flags:in_gerrit_tree=true), they are +switched to neverlink, so the Gitiles Gerrit plugin does not re-package +classes that gerrit.war already provides on the runtime classpath. +""" + +load("@rules_java//java:defs.bzl", "java_library") + +def provided_java_library(name, exports, runtime_deps = []): + """java_library that is linked standalone but neverlink inside Gerrit. + + Args: + name: target name; consumers depend on this directly. + exports: exported libraries (as for java_library). + runtime_deps: runtime deps (only relevant to the standalone build). + """ + java_library( + name = name, + exports = exports, + runtime_deps = runtime_deps, + neverlink = select({ + "//lib:in_gerrit_tree": 1, + "//conditions:default": 0, + }), + visibility = ["//visibility:public"], + )
diff --git a/lib/soy/BUILD b/lib/soy/BUILD index 3b08e29..ca6fdb4 100644 --- a/lib/soy/BUILD +++ b/lib/soy/BUILD
@@ -1,10 +1,10 @@ -load("@rules_java//java:defs.bzl", "java_library") +load("//lib:provided.bzl", "provided_java_library") package( default_visibility = ["//visibility:public"], ) -java_library( +provided_java_library( name = "soy", exports = [ "@external_deps//:com_google_template_soy",