由bazel创造的空的maven瓶子

时间:2018-05-08 07:51:30

标签: maven bazel

在使用bazel构建时,我遇到了使用maven依赖项的问题。问题似乎是下载的jar是空的,只有清单。我已经检查过路径和版本是否正确,并且还使用了sha1以确保正确定位了正确的jar。

WORKSPACE:

maven_server(
  name = "default",
  url = "http://central.maven.org/maven2/
)

maven_jar(
  name = "org_seleniumhq_selenium_selenium_java",
  artifact = "org.seleniumhq.selenium:selenium-java:3.11.0",
  sha1 = "05b50d4072e0e51779b6e9f3594106312061bfde"
)

BUILD:

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

java_library(
  name = "core",
  srcs = glob(
     ["main/core/**/*.java"]
  ),
  resources = glob(["test/resources/*"]),
  deps = ["@org_seleniumhq_selenium_selenium_java//jar"]
)

调用“bazel build // src:core”会立即失败并出现“错误:包org.openqa.selenium不存在”,但是我可以看到selenium-java.jar是在bazel-e2e-testing中创建的/ external / org_seleniumhq_selenium_selenium_java,但同样是空的。

有关我可能做错的任何建议吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

所以,在对Bazel的工作方式进行更多调查之后,我终于找到了问题,我将在这里添加它,以防将来有人遇到同样的问题。

主要问题是传递依赖性,默认情况下maven_jar无法解析。相反,bazel提供了一个名为transitive_maven_jar的有用存储库规则,可用于解决所有传递依赖关系。此外,声明了实际的依赖关系存在问题。

就我而言,我将selenium-java声明为依赖项,但是我只使用了一个传递依赖项(selenium-api)的导入。因此,selenium-java实际上并没有被编译,因为它实际上并没有被使用。一旦我宣布selenium-api作为我的依赖,问题就解决了。

最终的工作空间:

http_archive(
    name = "trans_maven_jar",
    url = "https://github.com/bazelbuild/migration-tooling/archive/master.zip",
    type = "zip",
    strip_prefix = "migration-tooling-master",
)

load("@trans_maven_jar//transitive_maven_jar:transitive_maven_jar.bzl", "transitive_maven_jar")
transitive_maven_jar(
    name = "dependencies",
    artifacts = [
        "org.seleniumhq.selenium:selenium-java:3.11.0",
    ]
)

load("@dependencies//:generate_workspace.bzl", "generated_maven_jars")
generated_maven_jars()

最终构建:

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

java_library(
    name = "core",
    srcs = glob(
        ["main/core/**/*.java"]
    ),
    resources = glob(["test/resources/*"]),
    deps = [
        "@org_seleniumhq_selenium_selenium_api//jar"
    ]
)

请注意,我还没有完全理解bazel是如何工作的,所以我说的部分内容可能不完全正确,在这种情况下,请告诉我,但这对我有用。