Bazel Maven迁移传递依赖范围
Posted
技术标签:
【中文标题】Bazel Maven迁移传递依赖范围【英文标题】:Bazel Maven migration Transitive Dependencies Scope 【发布时间】:2017-09-21 11:19:49 【问题描述】:我正在尝试在具有 deps 和传递依赖项的项目之一上使用 generate_workspace
。生成generate_workspace.bzl
后,我将其复制到 WORKSPACE 并按照 bazel 文档中的说明进行操作。虽然我看到 generate_workspace.bzl
中列出的 deps 及其传递 deps,但我的项目在 java_library 阶段无法解析传递 deps。当我在 IDEA 中导入同一个项目时,我没有看到正确加载的 jar。
我的疑问是我看到 generate_workspace.bzl 将其传递的部门添加为 runtime_deps
这意味着它们仅在 runtenter code here
ime 期间可用
我在这里创建了所有文件的要点 https://gist.github.com/kameshsampath/8a4bdc8b22d85bbe3f243fa1b816e464
理想情况下,在我的 maven 项目中,我只需要 https://gist.github.com/kameshsampath/8a4bdc8b22d85bbe3f243fa1b816e464#file-src_main_build-L8-L9,尽管 generate_workspace.bzl 已正确解决,但我认为如果我的 src/main/BUILD 看起来像这样就足够了
java_binary(
name = "main",
srcs = glob(["java/**/*.java"]),
resources = glob(["resources/**"]),
main_class = "com.redhat.developers.DemoApplication",
# FIXME why I should import all the jars when they are transitive to spring boot starter
deps = [
"//third_party:org_springframework_boot_spring_boot_starter_actuator",
"//third_party:org_springframework_boot_spring_boot_starter_web",
],
)
但遗憾的是,由于传递的 deps 没有作为上述声明的一部分加载,因此会产生很多编译错误。最终我必须像我在https://gist.github.com/kameshsampath/8a4bdc8b22d85bbe3f243fa1b816e464#file-src_main_build
中所做的那样定义
src_main_build 是 src/main/BUILD 包下的 BUILD 文件 third_party_BUILD 是包third_party/BUILD下的BUILD
【问题讨论】:
我认为 sn-p 在这里会有很长的路要走。另外,您是否看到“出口”的任何用法? @Ittai 添加了代码 sn-ps 和 gist 链接 【参考方案1】:Bazel 希望您声明所有直接依赖项。 IE。如果您直接使用 jar A 中的类,则需要将其包含在您的直接依赖项中。
您正在寻找的是部署 jar。这有点老套,但你实际上可以这样做(third_party/BUILD
):
java_binary(
name = "org_springframework_boot_spring_boot_starter_actuator_bin",
main_class = "not.important",
runtime_deps = [":org_springframework_boot_spring_boot_starter_actuator"], )
java_import(
name = "springframework_actuator",
jars = [":org_springframework_boot_spring_boot_starter_actuator_bin_deploy.jar"],
)
这将捆绑所有依赖项,除了一个 jar 中的 neverlink (_deploy.jar
)并重新公开它。
【讨论】:
Damien,他不能只使用“deps”,然后遍历来自 strict-deps 的一些警告吗?这将通过他需要传递的几个障碍,但仍然会给他一个更清晰的依赖关系图 达米恩,收到错误ERROR: /Users/kameshs/MyLabs/bazel/bazel-demos/spring-boot-bazel-demo/src/main/BUILD:7:14: in deps attribute of java_binary rule //src/main:main: java_binary rule '//third_party:org_springframework_boot_spring_boot_starter_web _bin' is misplaced here (expected cc_binary, cc_library, genrule, genproto, java_import, java_library, java_proto_library, java_lite_proto_library, proto_library, sh_binary or sh_library) and '//third_party:org_springframework_boot_spring_boot_starter_web_bin' does not have mandatory providers: 'link_params' or 'java_common.provider'.
Kamesh:你能提供你的构建文件的内容吗? Ittai:是的,他可以而且应该得到一个干净的图表,但他希望能够只导入 2 个罐子......【参考方案2】:
更新:rules_jvm_external
是 Bazel 团队官方维护的规则集,用于传递地获取和解析工件。
您可以找到 Spring Boot here 的示例。 WORKSPACE 文件中的声明如下所示:
load("@rules_jvm_external//:defs.bzl", "maven_install")
maven_install(
artifacts = [
"org.hamcrest:hamcrest-library:1.3",
"org.springframework.boot:spring-boot-autoconfigure:2.1.3.RELEASE",
"org.springframework.boot:spring-boot-test-autoconfigure:2.1.3.RELEASE",
"org.springframework.boot:spring-boot-test:2.1.3.RELEASE",
"org.springframework.boot:spring-boot:2.1.3.RELEASE",
"org.springframework.boot:spring-boot-starter-web:2.1.3.RELEASE",
"org.springframework:spring-beans:5.1.5.RELEASE",
"org.springframework:spring-context:5.1.5.RELEASE",
"org.springframework:spring-test:5.1.5.RELEASE",
"org.springframework:spring-web:5.1.5.RELEASE",
],
repositories = [
"https://jcenter.bintray.com",
]
)
【讨论】:
以上是关于Bazel Maven迁移传递依赖范围的主要内容,如果未能解决你的问题,请参考以下文章