rules-proto-grpc / rules_proto_grpc

Bazel rules for building Protobuf and gRPC code and libraries from proto_library targets
https://rules-proto-grpc.com
Apache License 2.0
250 stars 157 forks source link

target 'com_google_api_grpc_proto_google_common_protos' not declared in package '' #256

Closed vorburger closed 1 year ago

vorburger commented 1 year ago

Issue Description

I'm attempting to add the java_grpc_library as per https://rules-proto-grpc.com/en/latest/lang/java.html#java-grpc-library to an existing project (https://github.com/enola-dev/enola) where I already have the java_proto_library (without gRPC) working, and I'm getting build errors due to missing gRPC Java libraries dependencies.

It seems that it's not able to find those libraries, but I have not yet been able to figure out what's missing to add them.

Log Output

The exact library missing that the log shows appears to be non-deterministic and varies between different runs; it's one of either com_google_api_grpc_proto_google_common_protos:

ERROR: /home/vorburger/.cache/bazel/_bazel_vorburger/1082815a05c353e54640d436c6f5b32e/external/com_google_api_grpc_proto_google_common_protos/jar/BUILD:2:6: no such target '@rules_jvm_external~5.1~maven~maven//:com_google_api_grpc_proto_google_common_protos': target 'com_google_api_grpc_proto_google_common_protos' not declared in package '' defined by /home/vorburger/.cache/bazel/_bazel_vorburger/1082815a05c353e54640d436c6f5b32e/external/rules_jvm_external~5.1~maven~maven/BUILD (Tip: use `query "@maven//:*"` to see all the targets in that package) and referenced by '@com_google_api_grpc_proto_google_common_protos//jar:jar'

and/or org_apache_tomcat_annotations_api as in:

ERROR: /home/vorburger/.cache/bazel/_bazel_vorburger/1082815a05c353e54640d436c6f5b32e/external/org_apache_tomcat_annotations_api/jar/BUILD:2:6: no such target '@rules_jvm_external~5.1~maven~maven//:org_apache_tomcat_annotations_api': target 'org_apache_tomcat_annotations_api' not declared in package '' defined by /home/vorburger/.cache/bazel/_bazel_vorburger/1082815a05c353e54640d436c6f5b32e/external/rules_jvm_external~5.1~maven~maven/BUILD (Tip: use `query "@maven//:*"` to see all the targets in that package) and referenced by '@org_apache_tomcat_annotations_api//jar:jar'

rules_proto_grpc Version

4.3.0

Bazel Version

6.1.2

OS

Linux

Link to Demo Repo

https://github.com/enola-dev/enola/pull/125

WORKSPACE Content

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

# https://rules-proto-grpc.com/en/latest/#installation
# TODO replace with bazel_dep in MODULE.bazel
# when https://github.com/bazelbuild/bazel-central-registry/issues/353
# and https://github.com/grpc/grpc-java/issues/9559
# are done.
http_archive(
    name = "rules_proto_grpc",
    sha256 = "fb7fc7a3c19a92b2f15ed7c4ffb2983e956625c1436f57a3430b897ba9864059",
    strip_prefix = "rules_proto_grpc-4.3.0",
    urls = ["https://github.com/rules-proto-grpc/rules_proto_grpc/archive/4.3.0.tar.gz"],
)

load("@rules_proto_grpc//:repositories.bzl", "rules_proto_grpc_repos", "rules_proto_grpc_toolchains")

rules_proto_grpc_toolchains()

rules_proto_grpc_repos()

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

rules_proto_dependencies()

rules_proto_toolchains()

# https://rules-proto-grpc.com/en/latest/lang/doc.html#doc-markdown-compile
load("@rules_proto_grpc//doc:repositories.bzl", rules_proto_grpc_doc_repos = "doc_repos")

rules_proto_grpc_doc_repos()

# https://rules-proto-grpc.com/en/latest/lang/buf.html#buf-proto-lint-test
load("@rules_proto_grpc//buf:repositories.bzl", rules_proto_grpc_buf_repos = "buf_repos")

rules_proto_grpc_buf_repos()

# https://rules-proto-grpc.com/en/latest/lang/java.html#java-grpc-library
load("@rules_proto_grpc//java:repositories.bzl", rules_proto_grpc_java_repos = "java_repos")

rules_proto_grpc_java_repos()

load(
    "@io_grpc_grpc_java//:repositories.bzl",
    "IO_GRPC_GRPC_JAVA_ARTIFACTS",
    "IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS",
    "grpc_java_repositories",
)
load("@rules_jvm_external//:defs.bzl", "maven_install")

maven_install(
    artifacts = IO_GRPC_GRPC_JAVA_ARTIFACTS,
    generate_compat_repositories = True,
    override_targets = IO_GRPC_GRPC_JAVA_OVERRIDE_TARGETS,
    repositories = [
        "https://repo.maven.apache.org/maven2/",
    ],
)

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

compat_repositories()

grpc_java_repositories()

BUILD Content

# SPDX-License-Identifier: Apache-2.0
#
# Copyright 2023 The Enola <https://enola.dev> Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

load("@rules_java//java:defs.bzl", "java_library", "java_test")
load("@rules_proto//proto:defs.bzl", "proto_library")

# https://rules-proto-grpc.com/en/latest/lang/buf.html#buf-proto-lint-test
load("@rules_proto_grpc//buf:defs.bzl", "buf_proto_lint_test")

# https://rules-proto-grpc.com/en/latest/lang/doc.html#doc-markdown-compile
load("@rules_proto_grpc//doc:defs.bzl", "doc_markdown_compile")

# https://rules-proto-grpc.com/en/latest/lang/java.html#java-proto-library
load("@rules_proto_grpc//java:defs.bzl", "java_proto_library")

# https://rules-proto-grpc.com/en/latest/lang/java.html#java-grpc-library
load("@rules_proto_grpc//java:defs.bzl", "java_grpc_library")

# https://rules-proto-grpc.com/en/latest/example.html#step-3-write-a-build-file
proto_library(
    name = "core_proto",
    srcs = ["src/main/java/dev/enola/core/enola_core.proto"],
    deps = [
        "@com_google_protobuf//:any_proto",
        "@com_google_protobuf//:timestamp_proto",
    ],
)

proto_library(
    name = "connector_proto",
    srcs = ["src/main/java/dev/enola/core/connector/enola_connector.proto"],
    deps = [":core_proto"],
)

proto_library(
    name = "meta_proto",
    srcs = ["src/main/java/dev/enola/core/meta/enola_meta.proto"],
    # TODO ??? strip_import_prefix = "core/lib/src/main/java/",
    deps = [":core_proto"],
)

proto_library(
    name = "util_proto",
    srcs = ["src/main/java/dev/enola/core/util/enola_util.proto"],
    deps = [
        "@com_google_protobuf//:timestamp_proto",
    ],
)

java_proto_library(
    name = "core_proto_java_library",
    protos = [
        "connector_proto",
        "core_proto",
        "meta_proto",
        "util_proto",
    ],
    visibility = [
        "//cli:__subpackages__",
        "//connectors:__subpackages__",
        "//core:__subpackages__",
    ],
)

java_grpc_library(
    name = "core_java_grpc",
    protos = [
        "connector_proto",
        "core_proto",
        "meta_proto",
        # TODO enola_util.proto won't have a service, so rm this?
        "util_proto",
    ],
)

doc_markdown_compile(
    name = "core_proto_doc",
    protos = [
        "connector_proto",
        "core_proto",
        "meta_proto",
        "util_proto",
    ],
)

buf_proto_lint_test(
    name = "core_buf_proto_lint",
    size = "small",
    except_rules = [
        "PACKAGE_VERSION_SUFFIX",
        "PACKAGE_DIRECTORY_MATCH",
    ],
    protos = [
        "connector_proto",
        "core_proto",
        "meta_proto",
        "util_proto",
    ],
    use_rules = [
        "DEFAULT",
        "COMMENTS",
    ],
)

java_library(
    name = "lib_java",
    srcs = glob(["src/main/java/**/*.java"]),
    # NB: /java/ not /resources/ for the *.proto!
    # TODO Required for https://github.com/google/closure-templates/issues/1300 or not?
    # resources = glob(["src/main/java/**/*.proto"]),
    visibility = [
        "//cli:__subpackages__",
        "//connectors:__subpackages__",
        "//core:__subpackages__",
    ],
    deps = [
        ":core_proto_java_library",
        "@maven//:com_google_guava_guava",
    ],
)

[java_test(
    name = name[:-len(".java")],
    size = "small",
    srcs = glob(["src/test/java/**/*.java"]),
    resources = glob(["src/test/resources/**/*"]),
    deps = [
        ":core_proto_java_library",
        ":lib_java",
        "@maven//:com_google_truth_truth",
    ],
) for name in glob([
    "src/test/java/**/*Test.java",
])]

Proto Content

syntax = "proto3";

package dev.enola.core.connector;

import "core/lib/src/main/java/dev/enola/core/enola_core.proto";

option java_string_check_utf8 = true;
option java_package = "dev.enola.core.connector.proto";
option java_multiple_files = true;

message AugmentRequest {
  dev.enola.core.Entity entity = 1;
}
message AugmentResponse {
  dev.enola.core.Entity entity = 1;
}
service ConnectorService {
  rpc Augment(AugmentRequest) returns (AugmentResponse) {}
}

Any Other Content

No response

vorburger commented 1 year ago

Hm, so I MAY be able to work around this by manually (!) adding all (!) those dependencies to the MODULE.bazel in my project.

Other than being a (one-time) PITA, even if it works (TBC, WIP), somehow that doesn't feel like the right solution.

Won't such a hard-coded version lead to version skew / mismatch the next time around I upgrade the rules_proto_grpc version from 4.3.0 to something more recent which requires another proto-google-common-protos?

Is there a better way to solve this?

vorburger commented 1 year ago

adding dependencies to the MODULE.bazel in my project

This seems to do the trick, at least for the classpath of my project:

"com.google.api.grpc:proto-google-common-protos:2.17.0",
"io.grpc:grpc-netty:1.54.1",
"org.apache.tomcat:annotations-api:6.0.53",