如何组织第三方java_library规则?

How to organize third-party java_library rules?

我有许多 BUILD 文件需要 Jetty 或其他常见 Java 库(SLF4J、Lucene、Guava 等)。其中每一个都有一组它引用的其他 JAR。我想知道在大型项目中组织这些声明及其依赖项的最佳实践。

例如,通过 bazel run //src/tools/generate_workspace -- --artifact=org.eclipse.jetty:jetty-server:9.3.8.v20160314 使用 generate_workspace 我得到以下结果 BUILD

# The following dependencies were calculated from:
# org.eclipse.jetty:jetty-server:9.3.8.v20160314


java_library(
    name = "org_eclipse_jetty_jetty_http",
    visibility = ["//visibility:public"],
    exports = [
        "@org_eclipse_jetty_jetty_http//jar",
        "@org_eclipse_jetty_jetty_util//jar",
    ],
)

java_library(
    name = "org_eclipse_jetty_jetty_util",
    visibility = ["//visibility:public"],
    exports = [
        "@org_eclipse_jetty_jetty_util//jar",
    ],
)

java_library(
    name = "javax_servlet_javax_servlet_api",
    visibility = ["//visibility:public"],
    exports = [
        "@javax_servlet_javax_servlet_api//jar",
    ],
)

java_library(
    name = "org_eclipse_jetty_jetty_server",
    visibility = ["//visibility:public"],
    exports = [
        "@org_eclipse_jetty_jetty_server//jar",
        "@javax_servlet_javax_servlet_api//jar",
        "@org_eclipse_jetty_jetty_http//jar",
        "@org_eclipse_jetty_jetty_io//jar",
        "@org_eclipse_jetty_jetty_util//jar",
    ],
)

java_library(
    name = "org_eclipse_jetty_jetty_io",
    visibility = ["//visibility:public"],
    exports = [
        "@org_eclipse_jetty_jetty_io//jar",
        "@org_eclipse_jetty_jetty_util//jar",
    ],
)

WORKSPACE

# The following dependencies were calculated from:
# org.eclipse.jetty:jetty-server:9.3.8.v20160314


# org.eclipse.jetty:jetty-server:jar:9.3.8.v20160314
maven_jar(
    name = "org_eclipse_jetty_jetty_http",
    artifact = "org.eclipse.jetty:jetty-http:9.3.8.v20160314",
)

# org.eclipse.jetty:jetty-http:jar:9.3.8.v20160314
# org.eclipse.jetty:jetty-io:jar:9.3.8.v20160314
maven_jar(
    name = "org_eclipse_jetty_jetty_util",
    artifact = "org.eclipse.jetty:jetty-util:9.3.8.v20160314",
)

# org.eclipse.jetty:jetty-server:jar:9.3.8.v20160314
maven_jar(
    name = "javax_servlet_javax_servlet_api",
    artifact = "javax.servlet:javax.servlet-api:3.1.0",
)

maven_jar(
    name = "org_eclipse_jetty_jetty_server",
    artifact = "org.eclipse.jetty:jetty-server:9.3.8.v20160314",
)

# org.eclipse.jetty:jetty-server:jar:9.3.8.v20160314
maven_jar(
    name = "org_eclipse_jetty_jetty_io",
    artifact = "org.eclipse.jetty:jetty-io:9.3.8.v20160314",
)

个文件。

我在很多项目中都依赖于 jetty-server 和 jetty-util。有没有比在每个 BUILD 文件中重复此信息更好的做法?

通常,您会将 generate_workspace 生成的 BUILD 文件放在工作空间的根目录中(在您的 WORKSPACE 文件旁边),然后在其他 BUILD 文件中,您将引用它们需要的任何目标取决于。例如,在 src/main/java/com/your-project/subcomponent/BUILD 中,您可以说:

java_library(
    name = "my-servlet",
    srcs = glob(["*.java"]),
    deps = [
        "//:javax_servlet_javax_servlet_api",
        # other deps...
    ],
)