Skip to content

Commit

Permalink
[bazel] Add ability to create maven jars
Browse files Browse the repository at this point in the history
  • Loading branch information
shs96c committed Aug 1, 2019
1 parent b4c6833 commit 85a1010
Show file tree
Hide file tree
Showing 7 changed files with 147 additions and 7 deletions.
19 changes: 19 additions & 0 deletions java/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
load("//java:maven.bzl", "maven_jars")

exports_files(
srcs = [
"empty_test_template.txt",
Expand All @@ -7,3 +9,20 @@ exports_files(
"//visibility:public",
],
)


maven_jars(
name = "release-jars",
targets = [
"//java/client/src/org/openqa/selenium:core",
"//java/client/src/org/openqa/selenium/chrome",
"//java/client/src/org/openqa/selenium/edge:edgeium",
"//java/client/src/org/openqa/selenium/edge/edgehtml",
"//java/client/src/org/openqa/selenium/firefox",
"//java/client/src/org/openqa/selenium/firefox/xpi",
"//java/client/src/org/openqa/selenium/ie",
"//java/client/src/org/openqa/selenium/opera",
"//java/client/src/org/openqa/selenium/safari",
"//java/client/src/org/openqa/selenium/remote",
],
)
2 changes: 1 addition & 1 deletion java/client/src/org/openqa/selenium/edge/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ java_library(
"maven_coordinates=org.seleniumhq.selenium:selenium-edge-driver:%s" % SE_VERSION,
],
visibility = [
"//java/client/src/org/openqa/selenium/edge:__subpackages__",
"//visibility:public",
],
deps = [
"//java/client/src/org/openqa/selenium:core",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ java_library(
"maven_coordinates=org.seleniumhq.selenium:selenium-edgehtml-driver:%s" % SE_VERSION,
],
visibility = [
"//java/client/src/org/openqa/selenium/edge:__subpackages__",
"//visibility:public",
],
deps = [
"//java/client/src/org/openqa/selenium/edge:edgeium",
Expand Down
121 changes: 121 additions & 0 deletions java/maven.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@

MavenInfo = provider(
fields = {
"coordinates": "Maven coordinates of the library we're building (optional)",
"artifact_jars": "Jars to include within the artifact when we build it",
"source_jars": "Source jars to include within the maven source jar",
"maven_deps": "Maven coordinates that this module depends on",
"transitive_maven_deps": "All maven coordinates that are transitive dependencies",
"transitive_runtime_jars": "Transitive set of jars that this library depends on (including artifact_jars)",
"transitive_source_jars": "Transitive set of source jars that this library depends on",
},
)

_PREFIX = "maven_coordinates="

def _has_maven_deps_impl(target, ctx):
java_info = target[JavaInfo]

tags = getattr(ctx.rule.attr, "tags", [])
deps = getattr(ctx.rule.attr, "deps", [])
exports = getattr(ctx.rule.attr, "exports", [])
rt_deps = getattr(ctx.rule.attr, "runtime_deps", [])
all_deps = deps + exports + rt_deps

coordinates = []
for tag in tags:
if tag.startswith(_PREFIX):
coordinates.append(tag[len(_PREFIX):])
if len(coordinates) > 1:
fail("Zero or one set of coordinates should be defined: %s" % coordinates)

# Find all the deps that have coordinates
all_infos = [dep[MavenInfo] for dep in all_deps if MavenInfo in dep]

maven_deps = depset([], transitive = [info.transitive_maven_deps for info in all_infos])
transitive_maven_deps = depset(coordinates, transitive = [info.transitive_maven_deps for info in all_infos])
artifact_jars = depset(java_info.runtime_output_jars, transitive = [info.artifact_jars for info in all_infos if not info.coordinates])
source_jars = depset(java_info.source_jars, transitive = [info.source_jars for info in all_infos if not info.coordinates])

infos = []
coordinate = coordinates[0] if len(coordinates) > 0 else None
info = MavenInfo(
coordinates = coordinate,
maven_deps = maven_deps,
artifact_jars = artifact_jars,
source_jars = source_jars,
transitive_maven_deps = transitive_maven_deps,
)
infos.append(info)

return infos

_has_maven_deps = aspect(
implementation = _has_maven_deps_impl,
attr_aspects = [
"deps",
"exports",
"runtime_deps",
],
)

def _combine_jars(ctx, inputs, output):
args = ctx.actions.args()
args.add_all(["--compression", "--normalize"])
args.add("--output", output)
args.add_all(inputs, before_each = "--sources")

ctx.actions.run(
mnemonic = "BuildMavenJar",
inputs = inputs,
outputs = [output],
executable = ctx.executable._singlejar,
arguments = [args],
)

def _determine_name(coordinates):
bits = coordinates.split(":")
return bits[1]

def _maven_jars_impl(ctx):
targets = ctx.attr.targets

outs = []

for target in targets:
info = target[MavenInfo]
if not info.coordinates:
fail("No coordinates specified for %s" % target)

name = _determine_name(info.coordinates)

bin_jar = ctx.actions.declare_file("%s.jar" % name)
outs.append(bin_jar)
_combine_jars(ctx, info.artifact_jars.to_list(), bin_jar)
src_jar = ctx.actions.declare_file("%s-sources.jar" % name)
outs.append(src_jar)
_combine_jars(ctx, info.source_jars.to_list(), src_jar)

args = ctx.actions.args()
args.add_all(["--compression", "--normalize"])
args.add_all(info.artifact_jars.to_list(), before_each = "--sources")
args.add("--output", bin_jar)

return [
DefaultInfo(files = depset(outs))
]

maven_jars = rule(
_maven_jars_impl,
attrs = {
"targets": attr.label_list(
allow_empty = False,
aspects = [_has_maven_deps],
providers = [JavaInfo, MavenInfo]),
"_singlejar": attr.label(
executable = True,
cfg = "host",
default = "@bazel_tools//tools/jdk:singlejar",
allow_files = True),
},
)
6 changes: 3 additions & 3 deletions third_party/java/commons/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@ package(default_visibility = ["//visibility:public"])

maven_java_import(
name = "commons-exec",
coords = "org.apache.commons:commons-exec:jar:1.3",
coords = "org.apache.commons:commons-exec:1.3",
jar = "commons-exec-1.3.jar",
srcjar = "commons-exec-1.3-sources.jar",
)

maven_java_import(
name = "commons-lang3",
coords = "org.apache.commons:commons-lang3:jar:3.8.1",
coords = "org.apache.commons:commons-lang3:3.8.1",
jar = "commons-lang3-3.8.1.jar",
srcjar = "commons-lang3-3.8.1-sources.jar",
)

maven_java_import(
name = "commons-text",
coords = "org.apache.commons:commons-text:jar:1.6",
coords = "org.apache.commons:commons-text:1.6",
jar = "commons-text-1.6.jar",
srcjar = "commons-text-1.6-sources.jar",
deps = [
Expand Down
2 changes: 1 addition & 1 deletion third_party/java/kotlin-stdlib/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ package(default_visibility = ["//visibility:public"])

maven_java_import(
name = "kotlin-stdlib",
coords = "org.jetbrains.kotlin:kotlin-stdlib:jar:1.3.41",
coords = "org.jetbrains.kotlin:kotlin-stdlib:1.3.41",
jar = "kotlin-stdlib-1.3.41.jar",
srcjar = "kotlin.stdlib-1.3.41-sources.jar",
)
2 changes: 1 addition & 1 deletion third_party/java/okhttp3/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ package(default_visibility = ["//visibility:public"])

maven_java_import(
name = "okhttp",
coords = "com.squareup.okhttp3:okhttp:jar:4.0.1",
coords = "com.squareup.okhttp3:okhttp:4.0.1",
jar = "okhttp-4.0.1.jar",
srcjar = "okhttp-4.0.1-sources.jar",
deps = [
Expand Down

0 comments on commit 85a1010

Please sign in to comment.