Migrating Java/GRPC Application from Maven to Bazel (powered by docker)

Mark :

I'm trying to migrate my build tool from maven to bazel. I have a java/grpc with a proto file, if I build it with maven all is good, but with bazel I keep facing a problem that happens on the grpc. Maybe my bazel BUILD/WORKSPACE file is not configured properly, I'm not too sure. Any help would be appreciated!

Here is my WORKSPACE file:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

RULES_JVM_EXTERNAL_TAG = "3.0"
RULES_JVM_EXTERNAL_SHA = "62133c125bf4109dfd9d2af64830208356ce4ef8b165a6ef15bbff7460b35c3a"

http_archive(
    name = "rules_jvm_external",
    strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
    sha256 = RULES_JVM_EXTERNAL_SHA,
    url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)

http_archive(
    name = "bazel_skylib",
    sha256 = "97e70364e9249702246c0e9444bccdc4b847bed1eb03c5a3ece4f83dfe6abc44",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
        "https://github.com/bazelbuild/bazel-skylib/releases/download/1.0.2/bazel-skylib-1.0.2.tar.gz",
    ],
)

load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace")
bazel_skylib_workspace()

http_archive(
    name = "rules_proto",
    sha256 = "73ebe9d15ba42401c785f9d0aeebccd73bd80bf6b8ac78f74996d31f2c0ad7a6",
    strip_prefix = "rules_proto-2c0468366367d7ed97a1f702f9cd7155ab3f73c5",
    urls = [
        "https://mirror.bazel.build/github.com/bazelbuild/rules_proto/archive/2c0468366367d7ed97a1f702f9cd7155ab3f73c5.tar.gz",
        "https://github.com/bazelbuild/rules_proto/archive/2c0468366367d7ed97a1f702f9cd7155ab3f73c5.tar.gz",
    ],
)

load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies", "rules_proto_toolchains")
rules_proto_dependencies()
rules_proto_toolchains()

http_archive(
    name = "com_google_protobuf",
    sha256 = "e11f901c62f6a35e295b7e9c49123a96ef7a47503afd40ed174860ad4c3f294f",
    strip_prefix = "protobuf-3.10.0",
    url = "https://github.com/protocolbuffers/protobuf/releases/download/v3.10.0/protobuf-all-3.10.0.tar.gz",
)

http_archive(
    name = "googleapi",
    sha256 = "51849d3ef693c88eb7692875eb444ef7131502e3fa200f25fc0a37b1e7e55ab5",
    strip_prefix = "googleapis-a111a53c0c6722afcd793b64724ceef7862db5b9",
    url = "https://github.com/googleapis/googleapis/archive/a111a53c0c6722afcd793b64724ceef7862db5b9.zip",
)

load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
protobuf_deps()

load("@rules_jvm_external//:specs.bzl", "maven")
load("@rules_jvm_external//:defs.bzl", "artifact", "maven_install")

maven_install(
    artifacts = [
        "com.google.cloud:google-cloud-pubsub:1.92.0",
        "com.google.cloud:google-cloud-storage:1.98.0",
        "io.grpc:grpc-netty-shaded:1.23.0",
        "io.grpc:grpc-protobuf:1.23.0",
        "io.grpc:grpc-stub:1.23.0",
        "mysql:mysql-connector-java:8.0.17",
        "com.google.cloud.sql:mysql-socket-factory-connector-j-8:1.0.15",
        "com.zaxxer:HikariCP:3.3.1",
        "com.google.inject:guice:4.2.2",
        "jaxen:jaxen:1.2.0",
        "org.dom4j:dom4j:2.1.1",
        "org.slf4j:slf4j-simple:2.0.0-alpha1",
        "org.slf4j:slf4j-api:2.0.0-alpha1",
        "log4j:log4j:1.2.17",
        "com.google.code.gson:gson:2.8.6",
        "junit:junit:4.13-beta-3",
        "com.google.protobuf:protobuf-java:3.0.0",
        "com.google.protobuf:protobuf-java-util:3.0.0",
    ],
    override_targets = {
        "com.google.protobuf:protobuf-java": "@com_google_protobuf//:protobuf_java",
    },
    maven_install_json = "//:maven_install.json",
    generate_compat_repositories = True,
    repositories = [
        "https://jcenter.bintray.com",
    ],
)

load("@maven//:defs.bzl", "pinned_maven_install")
pinned_maven_install()

load("@maven//:compat.bzl", "compat_repositories")
compat_repositories()

maven_install(
    artifacts = [
        maven.artifact(
            group = "com.google.api.grpc",
            artifact = "proto-google-common-protos",
            version = "1.16.0",
            exclusions = [
                maven.exclusion(
                    group = "com.google.protobuf",
                    artifact = "protobuf-java"
                )
            ]
        )
    ],
    maven_install_json = "//:maven_install.json",
    generate_compat_repositories = True,
    repositories = [
        "https://maven.google.com",
        "https://repo1.maven.org/maven2",
    ],
)

load("@maven//:defs.bzl", "pinned_maven_install")
pinned_maven_install()

load("@maven//:compat.bzl", "compat_repositories")
compat_repositories()

Here is my BUILD file:

package(default_visibility = ["//visibility:public"])

load("@rules_proto//proto:defs.bzl", "proto_library")

proto_library(
    name = "account",
    srcs = glob(["src/main/proto/account.proto"]),
    deps = ["@googleapi//google/api:annotations_proto"],
)

java_proto_library(
    name = "account_proto_java",
    deps = [":account"],
)

java_library(
    name = "AccountService",
    srcs = glob(["src/main/java/**/*.java"]),
    resources = glob(["src/main/resources/**"]),
    deps = [
        "@maven//:com_google_cloud_google_cloud_pubsub",
        "@maven//:com_google_cloud_google_cloud_storage",
        "@maven//:io_grpc_grpc_netty_shaded",
        "@maven//:io_grpc_grpc_protobuf",
        "@maven//:io_grpc_grpc_stub",
        "@maven//:mysql_mysql_connector_java",
        "@maven//:com_google_cloud_sql_mysql_socket_factory_connector_j_8",
        "@maven//:com_zaxxer_HikariCP",
        "@maven//:com_google_inject_guice",
        "@maven//:jaxen_jaxen",
        "@maven//:org_dom4j_dom4j",
        "@maven//:org_slf4j_slf4j_simple",
        "@maven//:org_slf4j_slf4j_api",
        "@maven//:log4j_log4j",
        "@maven//:com_google_code_gson_gson",
        "@maven//:junit_junit",
        "@maven//:com_google_guava_guava",
        "@maven//:io_grpc_grpc_api",
        "@maven//:com_google_protobuf_protobuf_java",
        "@maven//:com_google_protobuf_protobuf_java_util",
        ":account_proto_java",
    ],
)

I finally run that command: docker run --rm -v /${PWD}:${PWD} -w /${PWD} l.gcr.io/google/bazel:latest build ///...

Some issues that occur:

  1. I always seem to get an error when it's downloading the resources. Here is an example: WARNING: Download from https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar failed: class com.google.devtools.build.lib.bazel.repository.downloader.UnrecoverableHttpException GET returned 404 Not Found
  2. For some reason, it doesn't stop there when the 404 appears, towards the end when it comes to build the proto section. I get this error:
ERROR: /c/Users/<username>/projects/Ecommerce-Account-Microservice/BUILD:16:1: Building libAccountService-class.jar (198 source files) failed (Exit 1)
        src/main/java/com/app/account/GRPCClient.java:7: error: cannot find symbol
        import com.app.account.services.AccountServiceGrpc;
                                         ^
          symbol:   class AccountServiceGrpc
          location: package com.app.account.services
        src/main/java/com/app/account/GRPCClient.java:20: error: package AccountServiceGrpc does not exist
            private final AccountServiceGrpc.AccountServiceBlockingStub blockingStub;
                                            ^
        src/main/java/com/app/account/server/services/AccountService.java:24: error: cannot find symbol
        import com.app.account.services.AccountServiceGrpc;
                                         ^
          symbol:   class AccountServiceGrpc
          location: package com.app.account.services
        src/main/java/com/app/account/server/services/AccountService.java:39: error: package AccountServiceGrpc does not exist
        public class AccountService extends AccountServiceGrpc.AccountServiceImplBase {
                                                              ^
        src/main/java/com/app/account/GRPCClient.java:28: error: cannot find symbol
                blockingStub = AccountServiceGrpc.newBlockingStub(channel);
                               ^
          symbol:   variable AccountServiceGrpc
          location: class GRPCClient
        src/main/java/com/app/account/server/GrpcServer.java:28: error: no suitable method found for addService(AccountService)
                        .addService(AccountService.getInstance())
                        ^
            method ServerBuilder.addService(ServerServiceDefinition) is not applicable
              (argument mismatch; AccountService cannot be converted to ServerServiceDefinition)
            method ServerBuilder.addService(BindableService) is not applicable
              (argument mismatch; AccountService cannot be converted to BindableService)
          where CAP#1 is a fresh type-variable:
            CAP#1 extends ServerBuilder<CAP#1> from capture of ?
        src/main/java/com/app/account/server/services/AccountService.java:57: error: method does not override or implement a method from a supertype
                @Override
                ^
        src/main/java/com/app/account/server/services/AccountService.java:65: error: method does not override or implement a method from a supertype
                @Override
                ^
        src/main/java/com/app/account/server/services/AccountService.java:223: error: method does not override or implement a method from a supertype
                @Override
                ^
        src/main/java/com/app/account/server/services/AccountService.java:273: error: method does not override or implement a method from a supertype
                @Override
                ^
        INFO: Elapsed time: 373.098s, Critical Path: 44.04s
        INFO: 358 processes: 353 processwrapper-sandbox, 5 worker.
        FAILED: Build did NOT complete successfully
        FAILED: Build did NOT complete successfully

I'm not too sure what is going on or what I'm doing wrong at that point, that's why I'm showing all the code.

Thanks a lot!

Mark

Jin :

If you want to use multiple maven_install declarations, you need unique names for each of them. See documentation here.

I always seem to get an error when it's downloading the resources. Here is an example: WARNING: Download from https://maven.google.com/org/checkerframework/checker-compat-qual/2.5.5/checker-compat-qual-2.5.5.jar failed: class com.google.devtools.build.lib.bazel.repository.downloader.UnrecoverableHttpException GET returned 404 Not Found

It looks like you don't actually use maven.google.com for any of the artifacts. Remove that from your maven_install.repositories lists and re-run artifact pinning for them.

For the missing GRPC classes, it looks like you're missing a java_grpc_library between java_library and java_proto_library. Example.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=194628&siteId=1