Skip to content

Commit

Permalink
Add deps attributes to the Skylark maven_{a,j}ar rules.
Browse files Browse the repository at this point in the history
The deps are passed through into the generated java_import and aar_import rules. This is necessary for AARs with resource dependencies since maven_aar ignores transitive dependencies. It's less significant for the Java rules, since typically JARs on Maven are compiled class files and as such only have runtime dependencies.

Example usage:

```
# WORKSPACE
load("@bazel_tools//tools/build_defs/repo:maven_rules.bzl", "maven_aar")
maven_aar(
    name = "android_image_cropper",
    artifact = "com.theartofdev.edmodo:android-image-cropper:2.3.1",
    deps = [
        "@androidsdk//com.android.support:appcompat-v7-24.1.1",
    ],
)
```

Fixes bazelbuild#2863.
Fixes bazelbuild#3980.

Also, cleans up some broken stuff in the tests (sadly, they don't run on jenkins, so nothing caught that they were broken). test_maven_jar_with_classifier_skylark still does not work, so I disabled.

RELNOTES: Add deps attribute to Skylark maven_aar and maven_jar workspace rules.
PiperOrigin-RevId: 175698282
  • Loading branch information
aj-michael authored and Copybara-Service committed Nov 14, 2017
1 parent c47c13f commit 431b643
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 10 deletions.
1 change: 0 additions & 1 deletion src/test/shell/bazel/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,6 @@ sh_test(
srcs = ["maven_skylark_test.sh"],
data = [
":test-deps",
"//external:android_ndk_for_testing",
"//external:android_sdk_for_testing",
"@m2//:files",
],
Expand Down
20 changes: 15 additions & 5 deletions src/test/shell/bazel/maven_skylark_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ EOF
expect_log "Tra-la!"
}

function test_maven_jar_with_classifier_skylark() {
function DISABLEDtest_maven_jar_with_classifier_skylark() {
setup_zoo
version="1.21"
packaging = "jar"
classifier = "sources"
packaging="jar"
classifier="sources"
serve_artifact com.example.carnivore carnivore $version $packaging $classifier
setup_local_maven_settings_xml "http://localhost:$fileserver_port"

Expand Down Expand Up @@ -150,8 +150,8 @@ EOF

function test_maven_aar_skylark() {
setup_android_sdk_support
if [ -z "$ANDROID_NDK_API_LEVEL" ] || [ -z "$ANDROID_SDK_API_LEVEL" ]; then
fail "This test cannot run without Android repositories set up," \
if [[ ! -d "${TEST_SRCDIR}/androidsdk" ]]; then
fail "This test cannot run without android_sdk_repository set up," \
"see the WORKSPACE file for instructions"
fi
setup_android_binary
Expand All @@ -164,13 +164,23 @@ maven_aar(
artifact = "com.example.carnivore:herbivore:1.21",
sha1 = "$sha1",
settings = "//:$local_maven_settings_xml",
deps = ["@herbivore2//aar"],
)
maven_aar(
name = "herbivore2",
artifact = "com.example.carnivore:herbivore:1.21",
sha1 = "$sha1",
settings = "//:$local_maven_settings_xml",
)
EOF
bazel build //java/com/app || fail "Expected build to succeed"
unzip -l bazel-bin/java/com/app/app.apk > $TEST_log
expect_log_once "res/layout/my_view.xml"
unzip -l bazel-bin/java/com/app/app_deploy.jar > $TEST_log
expect_log_once "com/herbivore/Stegosaurus.class"
bazel query 'deps(//java/com/app)' >& $TEST_log
expect_log "@herbivore//aar:aar"
expect_log "@herbivore2//aar:aar"
}

# Same as test_maven_jar, except omit sha1 implying "we don't care".
Expand Down
8 changes: 6 additions & 2 deletions src/test/shell/bazel/remote_helpers.sh
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,13 @@ function create_artifact() {
maven_path=$PWD/$(echo $group_id | sed 's/\./\//g')/$artifact_id/$version
mkdir -p $maven_path
openssl sha1 $artifact > $maven_path/$artifact_id-$version.$packaging.sha1
openssl sha1 $srcjar_artifact > $maven_path/$artifact_id-$version-sources.$packaging.sha1
mv $artifact $maven_path/$artifact_id-$version.$packaging
mv $srcjar_artifact $maven_path/$artifact_id-$version-sources.$packaging

# srcjar_artifact is not created for AARs.
if [ ! -z "${srcjar_artifact+x}" ]; then
openssl sha1 $srcjar_artifact > $maven_path/$artifact_id-$version-sources.$packaging.sha1
mv $srcjar_artifact $maven_path/$artifact_id-$version-sources.$packaging
fi
}

function serve_artifact() {
Expand Down
17 changes: 15 additions & 2 deletions tools/build_defs/repo/maven_rules.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,9 @@ _maven_jar_build_file_template = """
java_import(
name = 'jar',
jars = ['{artifact_filename}'],
deps = [
{deps_string}
],
visibility = ['//visibility:public']
)
Expand All @@ -161,6 +164,9 @@ _maven_aar_build_file_template = """
aar_import(
name = 'aar',
aar = '{artifact_filename}',
deps = [
{deps_string}
],
visibility = ['//visibility:public'],
)
Expand All @@ -172,8 +178,11 @@ filegroup(

# Provides the syntax "@jar_name//jar" for dependencies
def _generate_build_file(ctx, template, paths):
deps_string = "\n".join(["'%s'," % dep for dep in ctx.attr.deps])
contents = template.format(
rule_name = ctx.name, artifact_filename = paths.artifact_filename)
rule_name = ctx.name,
artifact_filename = paths.artifact_filename,
deps_string = deps_string)
ctx.file('%s/BUILD' % paths.symlink_dir, contents, False)


Expand Down Expand Up @@ -268,7 +277,11 @@ _common_maven_rule_attrs = {
mandatory = True,
),
"sha1": attr.string(default = ""),
"settings": attr.label(default = None)
"settings": attr.label(default = None),
# Allow the user to specify deps for the generated java_import or aar_import
# since maven_jar and maven_aar do not automatically pull in transitive
# dependencies.
"deps": attr.label_list(),
}

def _maven_jar_impl(ctx):
Expand Down

0 comments on commit 431b643

Please sign in to comment.