Quy tắc Java

Báo cáo vấn đề Xem nguồn Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

Quy tắc

java_binary

Xem nguồn quy tắc
java_binary(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_env, deploy_manifest_lines, deprecation, distribs, env, exec_compatible_with, exec_properties, features, javacopts, jvm_flags, launcher, licenses, main_class, output_licenses, plugins, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, stamp, tags, target_compatible_with, testonly, toolchains, use_launcher, use_testrunner, visibility)

Tạo một kho lưu trữ Java ("tệp jar"), cùng với một tập lệnh trình bao bọc có cùng tên với quy tắc. Tập lệnh shell trình bao bọc sử dụng một đường dẫn lớp bao gồm, trong số những thứ khác, một tệp jar cho mỗi thư viện mà tệp nhị phân phụ thuộc vào. Khi chạy tập lệnh trình bao gói, mọi biến môi trường JAVABIN không trống sẽ được ưu tiên hơn phiên bản được chỉ định thông qua cờ --java_runtime_version của Bazel.

Tập lệnh trình bao bọc chấp nhận một số cờ duy nhất. Tham khảo //src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt để biết danh sách các cờ và biến môi trường có thể định cấu hình mà trình bao bọc chấp nhận.

Mục tiêu đầu ra ngầm ẩn

  • name.jar: Một tệp lưu trữ Java, chứa các tệp lớp và các tài nguyên khác tương ứng với các phần phụ thuộc trực tiếp của tệp nhị phân.
  • name-src.jar: Một kho lưu trữ chứa các nguồn ("source jar").
  • name_deploy.jar: Một kho lưu trữ Java phù hợp để triển khai (chỉ được tạo nếu được yêu cầu rõ ràng).

    Việc tạo mục tiêu <name>_deploy.jar cho quy tắc sẽ tạo một tệp jar độc lập có tệp kê khai cho phép chạy tệp đó bằng lệnh java -jar hoặc bằng lựa chọn --singlejar của tập lệnh trình bao bọc. Bạn nên sử dụng tập lệnh trình bao bọc thay vì java -jar vì tập lệnh này cũng truyền cờ JVM và các lựa chọn để tải thư viện gốc.

    Tệp jar triển khai chứa tất cả các lớp mà một trình tải lớp sẽ tìm thấy khi tìm kiếm đường dẫn lớp từ tập lệnh trình bao bọc của tệp nhị phân từ đầu đến cuối. Thư mục này cũng chứa các thư viện gốc cần thiết cho các phần phụ thuộc. Các tệp này sẽ tự động được tải vào JVM trong thời gian chạy.

    Nếu mục tiêu của bạn chỉ định một thuộc tính launcher, thì thay vì là một tệp JAR thông thường, _deploy.jar sẽ là một tệp nhị phân gốc. Thư mục này sẽ chứa trình chạy cùng với mọi phần phụ thuộc gốc (C++) của quy tắc, tất cả đều được liên kết vào một tệp nhị phân tĩnh. Các byte của tệp jar thực tế sẽ được thêm vào tệp nhị phân gốc đó, tạo ra một blob nhị phân duy nhất chứa cả mã thực thi và mã Java. Bạn có thể thực thi trực tiếp tệp jar kết quả giống như cách bạn thực thi bất kỳ tệp nhị phân gốc nào.

  • name_deploy-src.jar: Một kho lưu trữ chứa các nguồn được thu thập từ bao đóng bắc cầu của mục tiêu. Các lớp này sẽ khớp với các lớp trong deploy.jar, ngoại trừ trường hợp các jar không có jar nguồn khớp.

Bạn không được phép dùng thuộc tính deps trong quy tắc java_binary mà không có srcs; quy tắc như vậy yêu cầu main_class do runtime_deps cung cấp.

Đoạn mã sau đây minh hoạ một lỗi thường gặp:

java_binary(
    name = "DontDoThis",
    srcs = [
        ...,
        "GeneratedJavaFile.java",  # a generated .java file
    ],
    deps = [":generating_rule",],  # rule that generates that file
)

Thay vào đó, hãy làm như sau:

java_binary(
    name = "DoThisInstead",
    srcs = [
        ...,
        ":generating_rule",
    ],
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.


Bạn nên sử dụng tên của tệp nguồn là điểm truy cập chính của ứng dụng (trừ đuôi). Ví dụ: nếu điểm truy cập của bạn có tên là Main.java, thì tên của bạn có thể là Main.
deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác sẽ được liên kết vào mục tiêu. Xem các nhận xét chung về deps tại Các thuộc tính điển hình do hầu hết các quy tắc xây dựng xác định.
srcs

Danh sách nhãn; mặc định là []

Danh sách các tệp nguồn được xử lý để tạo mục tiêu. Thuộc tính này hầu như luôn là thuộc tính bắt buộc; hãy xem các trường hợp ngoại lệ bên dưới.

Các tệp nguồn thuộc loại .java sẽ được biên dịch. Trong trường hợp các tệp .java được tạo, bạn nên đặt tên của quy tắc tạo ở đây thay vì tên của chính tệp đó. Việc này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc có khả năng thích ứng tốt hơn với các thay đổi trong tương lai: nếu quy tắc tạo tạo ra các tệp khác nhau trong tương lai, bạn chỉ cần sửa một nơi: outs của quy tắc tạo. Bạn không nên liệt kê quy tắc tạo trong deps vì đây là một quy tắc không hoạt động.

Các tệp nguồn thuộc loại .srcjar sẽ được giải nén và biên dịch. (Điều này sẽ hữu ích nếu bạn cần tạo một nhóm tệp .java bằng genrule.)

Quy tắc: nếu quy tắc (thường là genrule hoặc filegroup) tạo ra bất kỳ tệp nào trong danh sách ở trên, thì các tệp đó sẽ được sử dụng theo cách tương tự như mô tả đối với tệp nguồn.

Đối số này gần như luôn bắt buộc, trừ phi thuộc tính main_class chỉ định một lớp trên đường dẫn lớp thời gian chạy hoặc bạn chỉ định đối số runtime_deps.

resources

Danh sách nhãn; mặc định là []

Danh sách các tệp dữ liệu cần đưa vào tệp jar Java.

Nếu bạn chỉ định tài nguyên, thì các tài nguyên đó sẽ được đi kèm trong tệp jar cùng với các tệp .class thông thường do quá trình biên dịch tạo ra. Vị trí của các tài nguyên bên trong tệp jar được xác định theo cấu trúc dự án. Trước tiên, Bazel sẽ tìm bố cục thư mục tiêu chuẩn của Maven (thư mục "src" theo sau là thư mục "resources" cháu). Nếu không tìm thấy, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (ví dụ: nếu một tài nguyên ở <workspace root>/x/java/y/java/z, thì đường dẫn của tài nguyên đó sẽ là y/java/z. Bạn không thể ghi đè phương pháp phỏng đoán này, tuy nhiên, bạn có thể dùng thuộc tính resource_strip_prefix để chỉ định một thư mục thay thế cụ thể cho các tệp tài nguyên.

Tài nguyên có thể là tệp nguồn hoặc tệp được tạo.

classpath_resources

Danh sách nhãn; mặc định là []

KHÔNG SỬ DỤNG LỰA CHỌN NÀY TRỪ KHI KHÔNG CÒN CÁCH NÀO KHÁC)

Danh sách các tài nguyên phải nằm ở gốc của cây java. Mục đích duy nhất của thuộc tính này là hỗ trợ các thư viện bên thứ ba yêu cầu tìm thấy tài nguyên của chúng trên đường dẫn lớp chính xác là "myconfig.xml". Bạn chỉ được phép sử dụng tính năng này trên các tệp nhị phân chứ không được phép sử dụng trên các thư viện, do nguy cơ xung đột không gian tên.

create_executable

Boolean; không thể định cấu hình; mặc định là True

Không dùng nữa, hãy chuyển sang dùng java_single_jar.
deploy_env

Danh sách nhãn; mặc định là []

Danh sách các mục tiêu java_binary khác đại diện cho môi trường triển khai của tệp nhị phân này. Đặt thuộc tính này khi tạo một trình bổ trợ sẽ được tải bởi một java_binary khác.
Việc đặt thuộc tính này sẽ loại trừ tất cả các phần phụ thuộc khỏi đường dẫn lớp thời gian chạy (và jar triển khai) của tệp nhị phân này được chia sẻ giữa tệp nhị phân này và các mục tiêu được chỉ định trong deploy_env.
deploy_manifest_lines

Danh sách các chuỗi; mặc định là []

Danh sách các dòng cần thêm vào tệp META-INF/manifest.mf được tạo cho mục tiêu *_deploy.jar. Nội dung của thuộc tính này không phải tuân theo quy tắc thay thế "Tạo biến".
javacopts

Danh sách các chuỗi; mặc định là []

Các lựa chọn bổ sung cho trình biên dịch của thư viện này. Chịu sự thay thế "Tạo biến"phân tích cú pháp Bourne shell.

Các lựa chọn trình biên dịch này được truyền đến javac sau các lựa chọn trình biên dịch chung.

jvm_flags

Danh sách các chuỗi; mặc định là []

Danh sách các cờ cần nhúng vào tập lệnh trình bao bọc được tạo để chạy tệp nhị phân này. Tuỳ thuộc vào $(location) và thay thế "Make variable", cũng như Bourne shell tokenization.

Tập lệnh trình bao bọc cho một tệp nhị phân Java bao gồm một định nghĩa CLASSPATH (để tìm tất cả các tệp jar phụ thuộc) và gọi trình thông dịch Java phù hợp. Dòng lệnh do tập lệnh trình bao bọc tạo ra bao gồm tên của lớp chính, theo sau là "$@" để bạn có thể truyền các đối số khác sau tên lớp. Tuy nhiên, các đối số dùng để phân tích cú pháp theo JVM phải được chỉ định trước tên lớp trên dòng lệnh. Nội dung của jvm_flags sẽ được thêm vào tập lệnh trình bao bọc trước khi tên lớp được liệt kê.

Xin lưu ý rằng thuộc tính này không ảnh hưởng đến các đầu ra *_deploy.jar.

launcher

Nhãn; mặc định là None

Chỉ định một tệp nhị phân sẽ được dùng để chạy chương trình Java thay vì chương trình bin/java thông thường có trong JDK. Mục tiêu phải là cc_binary. Bạn có thể chỉ định mọi cc_binary triển khai Java Invocation API làm giá trị cho thuộc tính này.

Theo mặc định, Bazel sẽ sử dụng trình chạy JDK thông thường (bin/java hoặc java.exe).

Cờ Bazel --java_launcher có liên quan chỉ ảnh hưởng đến những mục tiêu java_binaryjava_test chưa chỉ định thuộc tính launcher.

Xin lưu ý rằng các phần phụ thuộc gốc (C++, SWIG, JNI) sẽ được tạo theo cách khác tuỳ thuộc vào việc bạn đang sử dụng trình chạy JDK hay một trình chạy khác:

  • Nếu bạn đang sử dụng trình chạy JDK thông thường (mặc định), thì các phần phụ thuộc gốc sẽ được tạo dưới dạng một thư viện dùng chung có tên là {name}_nativedeps.so, trong đó {name} là thuộc tính name của quy tắc java_binary này. Trình liên kết không xoá mã không dùng đến trong cấu hình này.
  • Nếu bạn đang sử dụng bất kỳ trình chạy nào khác, các phần phụ thuộc gốc (C++) sẽ được liên kết tĩnh vào một tệp nhị phân có tên {name}_nativedeps, trong đó {name} là thuộc tính name của quy tắc java_binary này. Trong trường hợp này, trình liên kết sẽ xoá mọi mã mà trình liên kết cho là không dùng đến khỏi tệp nhị phân kết quả, nghĩa là mọi mã C++ chỉ được truy cập thông qua JNI đều có thể không được liên kết, trừ phi đích cc_library đó chỉ định alwayslink = 1.

Khi sử dụng trình chạy khác với trình chạy JDK mặc định, định dạng của đầu ra *_deploy.jar sẽ thay đổi. Hãy xem tài liệu java_binary chính để biết thông tin chi tiết.

main_class

Chuỗi; giá trị mặc định là ""

Tên của lớp có phương thức main() để dùng làm điểm truy cập. Nếu một quy tắc sử dụng lựa chọn này, thì quy tắc đó không cần danh sách srcs=[...]. Do đó, với thuộc tính này, bạn có thể tạo một tệp thực thi từ một thư viện Java đã chứa một hoặc nhiều phương thức main().

Giá trị của thuộc tính này là tên lớp chứ không phải tệp nguồn. Lớp phải có sẵn trong thời gian chạy: lớp này có thể được quy tắc này biên dịch (từ srcs) hoặc do các phần phụ thuộc trực tiếp hoặc bắc cầu cung cấp (thông qua runtime_deps hoặc deps). Nếu lớp không có sẵn, tệp nhị phân sẽ gặp lỗi trong thời gian chạy; không có quy trình kiểm tra thời gian xây dựng.

plugins

Danh sách nhãn; mặc định là []

Trình bổ trợ trình biên dịch Java để chạy tại thời điểm biên dịch. Mỗi java_plugin được chỉ định trong thuộc tính này sẽ chạy bất cứ khi nào quy tắc này được tạo. Một thư viện cũng có thể kế thừa các trình bổ trợ từ những phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo sẽ được đưa vào tệp jar kết quả của quy tắc này.
resource_jars

Danh sách nhãn; mặc định là []

Không dùng nữa: Thay vào đó, hãy dùng java_import và deps hoặc runtime_deps.
resource_strip_prefix

Chuỗi; giá trị mặc định là ""

Tiền tố đường dẫn cần loại bỏ khỏi các tài nguyên Java.

Nếu được chỉ định, tiền tố đường dẫn này sẽ bị xoá khỏi mọi tệp trong thuộc tính resources. Nếu tệp tài nguyên không nằm trong thư mục này thì đó là lỗi. Nếu không được chỉ định (mặc định), đường dẫn của tệp tài nguyên sẽ được xác định theo cùng một logic như gói Java của tệp nguồn. Ví dụ: một tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm tại foo/bar/a.txt.

runtime_deps

Danh sách nhãn; mặc định là []

Các thư viện chỉ có sẵn cho tệp nhị phân hoặc kiểm thử cuối cùng trong thời gian chạy. Giống như deps thông thường, các tệp này sẽ xuất hiện trên đường dẫn lớp thời gian chạy, nhưng không giống như các tệp đó, các tệp này sẽ không xuất hiện trên đường dẫn lớp thời gian biên dịch. Các phần phụ thuộc chỉ cần trong thời gian chạy sẽ được liệt kê ở đây. Các công cụ phân tích phần phụ thuộc sẽ bỏ qua những mục tiêu xuất hiện trong cả runtime_depsdeps.
stamp

Số nguyên; giá trị mặc định là -1

Có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Các giá trị có thể là:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh chế độ cài đặt này, vì chế độ này có thể loại bỏ tính năng lưu vào bộ nhớ đệm từ xa cho tệp nhị phân và mọi thao tác tiếp theo phụ thuộc vào tệp nhị phân đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị hằng số. Điều này giúp lưu vào bộ nhớ đệm kết quả của bản dựng một cách hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng được kiểm soát bằng cờ --[no]stamp.

Các tệp nhị phân được đóng dấu sẽ không được tạo lại trừ phi các phần phụ thuộc của chúng thay đổi.

use_launcher

Boolean; giá trị mặc định là True

Có nên sử dụng trình chạy tuỳ chỉnh cho tệp nhị phân hay không.

Nếu bạn đặt thuộc tính này thành false, thì thuộc tính launcher và cờ --java_launcher có liên quan sẽ bị bỏ qua đối với mục tiêu này.

use_testrunner

Boolean; giá trị mặc định là False

Sử dụng lớp trình chạy kiểm thử (theo mặc định là com.google.testing.junit.runner.BazelTestRunner) làm điểm truy cập chính cho chương trình Java và cung cấp lớp kiểm thử cho trình chạy kiểm thử dưới dạng giá trị của thuộc tính hệ thống bazel.test_suite. Bạn có thể dùng phương thức này để ghi đè hành vi mặc định (sử dụng trình chạy kiểm thử cho các quy tắc java_test và không sử dụng cho các quy tắc java_binary). Bạn khó có thể muốn làm việc này. Một trường hợp sử dụng là cho các quy tắc AllTest do một quy tắc khác gọi (ví dụ: để thiết lập cơ sở dữ liệu trước khi chạy các kiểm thử). Quy tắc AllTest phải được khai báo là java_binary, nhưng vẫn phải sử dụng trình chạy kiểm thử làm điểm truy cập chính. Bạn có thể ghi đè tên của một lớp trình chạy kiểm thử bằng thuộc tính main_class.

java_import

Xem nguồn quy tắc
java_import(name, deps, data, compatible_with, constraints, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, jars, licenses, neverlink, proguard_specs, restricted_to, runtime_deps, srcjar, tags, target_compatible_with, testonly, visibility)

Quy tắc này cho phép sử dụng các tệp .jar được biên dịch trước làm thư viện cho các quy tắc java_libraryjava_binary.

Ví dụ

    java_import(
        name = "maven_model",
        jars = [
            "maven_model/maven-aether-provider-3.2.3.jar",
            "maven_model/maven-model-3.2.3.jar",
            "maven_model/maven-model-builder-3.2.3.jar",
        ],
    )

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác sẽ được liên kết vào mục tiêu. Xem java_library.deps.
constraints

Danh sách các chuỗi; không thể định cấu hình; mặc định là []

Các ràng buộc bổ sung được áp dụng cho quy tắc này dưới dạng một thư viện Java.
exports

Danh sách nhãn; mặc định là []

Các mục tiêu mà người dùng của quy tắc này có thể sử dụng. Xem java_library.exports.
jars

Danh sách nhãn; bắt buộc

Danh sách các tệp JAR được cung cấp cho các mục tiêu Java phụ thuộc vào mục tiêu này.

Boolean; giá trị mặc định là False

Chỉ sử dụng thư viện này để biên dịch chứ không phải trong thời gian chạy. Hữu ích nếu thư viện sẽ được môi trường thời gian chạy cung cấp trong quá trình thực thi. Ví dụ về các thư viện như vậy là API IDE cho các trình bổ trợ IDE hoặc tools.jar cho mọi thứ chạy trên JDK tiêu chuẩn.
proguard_specs

Danh sách nhãn; mặc định là []

Các tệp sẽ được dùng làm quy cách Proguard. Các thông số này sẽ mô tả bộ thông số kỹ thuật mà Proguard sẽ sử dụng. Nếu được chỉ định, chúng sẽ được thêm vào mọi mục tiêu android_binary tuỳ thuộc vào thư viện này. Các tệp có trong đây chỉ được có các quy tắc bất biến, cụ thể là -dontnote, -dontwarn, assumenosideeffects và các quy tắc bắt đầu bằng -keep. Các lựa chọn khác chỉ có thể xuất hiện trong proguard_specs của android_binary để đảm bảo các lần hợp nhất không trùng lặp.
runtime_deps

Danh sách nhãn; mặc định là []

Các thư viện chỉ có sẵn cho tệp nhị phân hoặc kiểm thử cuối cùng trong thời gian chạy. Xem java_library.runtime_deps.
srcjar

Nhãn; mặc định là None

Tệp JAR chứa mã nguồn cho các tệp JAR đã biên dịch.

java_library

Xem nguồn quy tắc
java_library(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exported_plugins, exports, features, javacopts, licenses, neverlink, plugins, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, tags, target_compatible_with, testonly, visibility)

Quy tắc này biên dịch và liên kết các nguồn thành một tệp .jar.

Mục tiêu đầu ra ngầm ẩn

  • libname.jar: Một tệp lưu trữ Java chứa các tệp lớp.
  • libname-src.jar: Một kho lưu trữ chứa các nguồn ("source jar").

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện cần liên kết vào thư viện này. Xem các nhận xét chung về deps tại Các thuộc tính điển hình do hầu hết các quy tắc xây dựng xác định.

Các jar do các quy tắc java_library được liệt kê trong deps tạo sẽ nằm trên đường dẫn lớp thời gian biên dịch của quy tắc này. Hơn nữa, bao đóng bắc cầu của deps, runtime_depsexports sẽ nằm trên đường dẫn lớp thời gian chạy.

Ngược lại, các mục tiêu trong thuộc tính data được đưa vào runfiles nhưng không nằm trên đường dẫn lớp thời gian biên dịch cũng như thời gian chạy.

srcs

Danh sách nhãn; mặc định là []

Danh sách các tệp nguồn được xử lý để tạo mục tiêu. Thuộc tính này hầu như luôn là thuộc tính bắt buộc; hãy xem các trường hợp ngoại lệ bên dưới.

Các tệp nguồn thuộc loại .java sẽ được biên dịch. Trong trường hợp các tệp .java được tạo, bạn nên đặt tên của quy tắc tạo ở đây thay vì tên của chính tệp đó. Việc này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc có khả năng thích ứng tốt hơn với các thay đổi trong tương lai: nếu quy tắc tạo tạo ra các tệp khác nhau trong tương lai, bạn chỉ cần sửa một nơi: outs của quy tắc tạo. Bạn không nên liệt kê quy tắc tạo trong deps vì đây là một quy tắc không hoạt động.

Các tệp nguồn thuộc loại .srcjar sẽ được giải nén và biên dịch. (Điều này sẽ hữu ích nếu bạn cần tạo một nhóm tệp .java bằng genrule.)

Quy tắc: nếu quy tắc (thường là genrule hoặc filegroup) tạo ra bất kỳ tệp nào trong danh sách ở trên, thì các tệp đó sẽ được sử dụng theo cách tương tự như mô tả đối với tệp nguồn.

Đối số này gần như luôn bắt buộc, trừ phi thuộc tính main_class chỉ định một lớp trên đường dẫn lớp thời gian chạy hoặc bạn chỉ định đối số runtime_deps.

data

Danh sách nhãn; mặc định là []

Danh sách các tệp mà thư viện này cần trong thời gian chạy. Xem các nhận xét chung về data tại Các thuộc tính điển hình do hầu hết các quy tắc xây dựng xác định.

Khi tạo một java_library, Bazel không đặt các tệp này ở bất kỳ đâu; nếu data là tệp được tạo thì Bazel sẽ tạo các tệp đó. Khi tạo một kiểm thử phụ thuộc vào java_library này, Bazel sẽ sao chép hoặc liên kết các tệp data vào khu vực runfiles.

resources

Danh sách nhãn; mặc định là []

Danh sách các tệp dữ liệu cần đưa vào tệp jar Java.

Nếu bạn chỉ định tài nguyên, thì các tài nguyên đó sẽ được đi kèm trong tệp jar cùng với các tệp .class thông thường do quá trình biên dịch tạo ra. Vị trí của các tài nguyên bên trong tệp jar được xác định theo cấu trúc dự án. Trước tiên, Bazel sẽ tìm bố cục thư mục tiêu chuẩn của Maven (thư mục "src" theo sau là thư mục "resources" cháu). Nếu không tìm thấy, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (ví dụ: nếu một tài nguyên ở <workspace root>/x/java/y/java/z, thì đường dẫn của tài nguyên đó sẽ là y/java/z. Bạn không thể ghi đè phương pháp phỏng đoán này, tuy nhiên, bạn có thể dùng thuộc tính resource_strip_prefix để chỉ định một thư mục thay thế cụ thể cho các tệp tài nguyên.

Tài nguyên có thể là tệp nguồn hoặc tệp được tạo.

exported_plugins

Danh sách nhãn; mặc định là []

Danh sách java_plugin (ví dụ: trình xử lý chú thích) để xuất sang các thư viện phụ thuộc trực tiếp vào thư viện này.

Danh sách java_plugin được chỉ định sẽ được áp dụng cho mọi thư viện phụ thuộc trực tiếp vào thư viện này, giống như thể thư viện đó đã khai báo rõ ràng các nhãn này trong plugins.

exports

Danh sách nhãn; mặc định là []

Thư viện đã xuất.

Việc liệt kê các quy tắc ở đây sẽ giúp các quy tắc này có sẵn cho các quy tắc mẹ, như thể các quy tắc mẹ phụ thuộc rõ ràng vào các quy tắc này. Điều này không đúng với deps thông thường (không được xuất).

Tóm tắt: quy tắc X có thể truy cập vào mã trong Y nếu có một đường dẫn phụ thuộc giữa chúng bắt đầu bằng một cạnh deps, theo sau là không hoặc nhiều cạnh exports. Hãy xem một số ví dụ để minh hoạ điều này.

Giả sử A phụ thuộc vào BB phụ thuộc vào C. Trong trường hợp này, C là một phần phụ thuộc bắc cầu của A, vì vậy, việc thay đổi các nguồn của C và tạo lại A sẽ tạo lại mọi thứ một cách chính xác. Tuy nhiên, A sẽ không thể sử dụng các lớp trong C. Để cho phép điều đó, A phải khai báo C trong deps của nó hoặc B có thể giúp A (và mọi thứ có thể phụ thuộc vào A) dễ dàng hơn bằng cách khai báo C trong thuộc tính exports của nó (B).

Thao tác đóng thư viện đã xuất có sẵn cho tất cả các quy tắc gốc trực tiếp. Hãy xem một ví dụ khác: A phụ thuộc vào B, B phụ thuộc vào C và D, đồng thời xuất C nhưng không xuất D. Giờ đây, A có quyền truy cập vào C nhưng không có quyền truy cập vào D. Giờ đây, nếu C và D xuất một số thư viện, lần lượt là C' và D', thì A chỉ có thể truy cập vào C' chứ không truy cập được vào D'.

Lưu ý quan trọng: quy tắc được xuất không phải là một phần phụ thuộc thông thường. Theo ví dụ trước, nếu B xuất C và cũng muốn sử dụng C, thì B cũng phải liệt kê C trong deps của riêng mình.

javacopts

Danh sách các chuỗi; mặc định là []

Các lựa chọn bổ sung cho trình biên dịch của thư viện này. Chịu sự thay thế "Tạo biến"phân tích cú pháp Bourne shell.

Các lựa chọn trình biên dịch này được truyền đến javac sau các lựa chọn trình biên dịch chung.

Boolean; giá trị mặc định là False

Thư viện này chỉ nên được dùng để biên dịch chứ không phải trong thời gian chạy. Hữu ích nếu thư viện sẽ được môi trường thời gian chạy cung cấp trong quá trình thực thi. Ví dụ về các thư viện như vậy là API IDE cho các trình bổ trợ IDE hoặc tools.jar cho mọi thứ chạy trên JDK tiêu chuẩn.

Lưu ý rằng neverlink = 1 không ngăn trình biên dịch nội tuyến hoá tài liệu từ thư viện này vào các mục tiêu biên dịch phụ thuộc vào thư viện này, theo quy định của Đặc tả ngôn ngữ Java (ví dụ: hằng số static final của String hoặc của các kiểu dữ liệu nguyên thuỷ). Do đó, trường hợp sử dụng ưu tiên là khi thư viện thời gian chạy giống hệt với thư viện biên dịch.

Nếu thư viện thời gian chạy khác với thư viện biên dịch, thì bạn phải đảm bảo rằng thư viện này chỉ khác ở những nơi mà JLS cấm trình biên dịch nội tuyến (và điều này phải áp dụng cho tất cả các phiên bản JLS trong tương lai).

plugins

Danh sách nhãn; mặc định là []

Trình bổ trợ trình biên dịch Java để chạy tại thời điểm biên dịch. Mỗi java_plugin được chỉ định trong thuộc tính này sẽ chạy bất cứ khi nào quy tắc này được tạo. Một thư viện cũng có thể kế thừa các trình bổ trợ từ những phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo sẽ được đưa vào tệp jar kết quả của quy tắc này.
proguard_specs

Danh sách nhãn; mặc định là []

Các tệp sẽ được dùng làm quy cách Proguard. Các thông số này sẽ mô tả bộ thông số kỹ thuật mà Proguard sẽ sử dụng. Nếu được chỉ định, chúng sẽ được thêm vào mọi mục tiêu android_binary tuỳ thuộc vào thư viện này. Các tệp có trong đây chỉ được có các quy tắc bất biến, cụ thể là -dontnote, -dontwarn, assumenosideeffects và các quy tắc bắt đầu bằng -keep. Các lựa chọn khác chỉ có thể xuất hiện trong proguard_specs của android_binary để đảm bảo các lần hợp nhất không trùng lặp.
resource_jars

Danh sách nhãn; mặc định là []

Không dùng nữa: Thay vào đó, hãy dùng java_import và deps hoặc runtime_deps.
resource_strip_prefix

Chuỗi; giá trị mặc định là ""

Tiền tố đường dẫn cần loại bỏ khỏi các tài nguyên Java.

Nếu được chỉ định, tiền tố đường dẫn này sẽ bị xoá khỏi mọi tệp trong thuộc tính resources. Nếu tệp tài nguyên không nằm trong thư mục này thì đó là lỗi. Nếu không được chỉ định (mặc định), đường dẫn của tệp tài nguyên sẽ được xác định theo cùng một logic như gói Java của tệp nguồn. Ví dụ: một tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm tại foo/bar/a.txt.

runtime_deps

Danh sách nhãn; mặc định là []

Các thư viện chỉ có sẵn cho tệp nhị phân hoặc kiểm thử cuối cùng trong thời gian chạy. Giống như deps thông thường, các tệp này sẽ xuất hiện trên đường dẫn lớp thời gian chạy, nhưng không giống như các tệp đó, các tệp này sẽ không xuất hiện trên đường dẫn lớp thời gian biên dịch. Các phần phụ thuộc chỉ cần trong thời gian chạy sẽ được liệt kê ở đây. Các công cụ phân tích phần phụ thuộc sẽ bỏ qua những mục tiêu xuất hiện trong cả runtime_depsdeps.

java_lite_proto_library

Xem nguồn quy tắc
java_lite_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

java_lite_proto_library tạo mã Java từ các tệp .proto.

deps phải trỏ đến các quy tắc proto_library .

Ví dụ:

java_library(
    name = "lib",
    deps = [":foo"],
)

java_lite_proto_library(
    name = "foo",
    deps = [":bar"],
)

proto_library(
    name = "bar",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các quy tắc proto_library để tạo mã Java.

java_proto_library

Xem nguồn quy tắc
java_proto_library(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

java_proto_library tạo mã Java từ các tệp .proto.

deps phải trỏ đến các quy tắc proto_library .

Ví dụ:

java_library(
    name = "lib",
    deps = [":foo_java_proto"],
)

java_proto_library(
    name = "foo_java_proto",
    deps = [":foo_proto"],
)

proto_library(
    name = "foo_proto",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các quy tắc proto_library để tạo mã Java.

java_test

Xem nguồn quy tắc
java_test(name, deps, srcs, data, resources, args, classpath_resources, compatible_with, create_executable, deploy_manifest_lines, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, launcher, licenses, local, main_class, plugins, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, use_testrunner, visibility)

Quy tắc java_test() sẽ biên dịch một kiểm thử Java. Kiểm thử là một trình bao bọc nhị phân xung quanh mã kiểm thử của bạn. Phương thức chính của trình chạy kiểm thử được gọi thay vì lớp chính được biên dịch.

Mục tiêu đầu ra ngầm ẩn

  • name.jar: Kho lưu trữ Java.
  • name_deploy.jar: Một kho lưu trữ Java phù hợp để triển khai. (Chỉ được tạo nếu được yêu cầu rõ ràng.) Hãy xem nội dung mô tả về đầu ra name_deploy.jar từ java_binary để biết thêm thông tin chi tiết.

Hãy xem phần về các đối số java_binary(). Quy tắc này cũng hỗ trợ tất cả các thuộc tính chung cho mọi quy tắc kiểm thử (*_test).

Ví dụ

java_library(
    name = "tests",
    srcs = glob(["*.java"]),
    deps = [
        "//java/com/foo/base:testResources",
        "//java/com/foo/testing/util",
    ],
)

java_test(
    name = "AllTests",
    size = "small",
    runtime_deps = [
        ":tests",
        "//util/mysql",
    ],
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện khác sẽ được liên kết vào mục tiêu. Xem các nhận xét chung về deps tại Các thuộc tính điển hình do hầu hết các quy tắc xây dựng xác định.
srcs

Danh sách nhãn; mặc định là []

Danh sách các tệp nguồn được xử lý để tạo mục tiêu. Thuộc tính này hầu như luôn là thuộc tính bắt buộc; hãy xem các trường hợp ngoại lệ bên dưới.

Các tệp nguồn thuộc loại .java sẽ được biên dịch. Trong trường hợp các tệp .java được tạo, bạn nên đặt tên của quy tắc tạo ở đây thay vì tên của chính tệp đó. Việc này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc có khả năng thích ứng tốt hơn với các thay đổi trong tương lai: nếu quy tắc tạo tạo ra các tệp khác nhau trong tương lai, bạn chỉ cần sửa một nơi: outs của quy tắc tạo. Bạn không nên liệt kê quy tắc tạo trong deps vì đây là một quy tắc không hoạt động.

Các tệp nguồn thuộc loại .srcjar sẽ được giải nén và biên dịch. (Điều này sẽ hữu ích nếu bạn cần tạo một nhóm tệp .java bằng genrule.)

Quy tắc: nếu quy tắc (thường là genrule hoặc filegroup) tạo ra bất kỳ tệp nào trong danh sách ở trên, thì các tệp đó sẽ được sử dụng theo cách tương tự như mô tả đối với tệp nguồn.

Đối số này gần như luôn bắt buộc, trừ phi thuộc tính main_class chỉ định một lớp trên đường dẫn lớp thời gian chạy hoặc bạn chỉ định đối số runtime_deps.

resources

Danh sách nhãn; mặc định là []

Danh sách các tệp dữ liệu cần đưa vào tệp jar Java.

Nếu bạn chỉ định tài nguyên, thì các tài nguyên đó sẽ được đi kèm trong tệp jar cùng với các tệp .class thông thường do quá trình biên dịch tạo ra. Vị trí của các tài nguyên bên trong tệp jar được xác định theo cấu trúc dự án. Trước tiên, Bazel sẽ tìm bố cục thư mục tiêu chuẩn của Maven (thư mục "src" theo sau là thư mục "resources" cháu). Nếu không tìm thấy, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (ví dụ: nếu một tài nguyên ở <workspace root>/x/java/y/java/z, thì đường dẫn của tài nguyên đó sẽ là y/java/z. Bạn không thể ghi đè phương pháp phỏng đoán này, tuy nhiên, bạn có thể dùng thuộc tính resource_strip_prefix để chỉ định một thư mục thay thế cụ thể cho các tệp tài nguyên.

Tài nguyên có thể là tệp nguồn hoặc tệp được tạo.

classpath_resources

Danh sách nhãn; mặc định là []

KHÔNG SỬ DỤNG LỰA CHỌN NÀY TRỪ KHI KHÔNG CÒN CÁCH NÀO KHÁC)

Danh sách các tài nguyên phải nằm ở gốc của cây java. Mục đích duy nhất của thuộc tính này là hỗ trợ các thư viện bên thứ ba yêu cầu tìm thấy tài nguyên của chúng trên đường dẫn lớp chính xác là "myconfig.xml". Bạn chỉ được phép sử dụng tính năng này trên các tệp nhị phân chứ không được phép sử dụng trên các thư viện, do nguy cơ xung đột không gian tên.

create_executable

Boolean; không thể định cấu hình; mặc định là True

Không dùng nữa, hãy chuyển sang dùng java_single_jar.
deploy_manifest_lines

Danh sách các chuỗi; mặc định là []

Danh sách các dòng cần thêm vào tệp META-INF/manifest.mf được tạo cho mục tiêu *_deploy.jar. Nội dung của thuộc tính này không phải tuân theo quy tắc thay thế "Tạo biến".
javacopts

Danh sách các chuỗi; mặc định là []

Các lựa chọn bổ sung cho trình biên dịch của thư viện này. Chịu sự thay thế "Tạo biến"phân tích cú pháp Bourne shell.

Các lựa chọn trình biên dịch này được truyền đến javac sau các lựa chọn trình biên dịch chung.

jvm_flags

Danh sách các chuỗi; mặc định là []

Danh sách các cờ cần nhúng vào tập lệnh trình bao bọc được tạo để chạy tệp nhị phân này. Tuỳ thuộc vào $(location) và thay thế "Make variable", cũng như Bourne shell tokenization.

Tập lệnh trình bao bọc cho một tệp nhị phân Java bao gồm một định nghĩa CLASSPATH (để tìm tất cả các tệp jar phụ thuộc) và gọi trình thông dịch Java phù hợp. Dòng lệnh do tập lệnh trình bao bọc tạo ra bao gồm tên của lớp chính, theo sau là "$@" để bạn có thể truyền các đối số khác sau tên lớp. Tuy nhiên, các đối số dùng để phân tích cú pháp theo JVM phải được chỉ định trước tên lớp trên dòng lệnh. Nội dung của jvm_flags sẽ được thêm vào tập lệnh trình bao bọc trước khi tên lớp được liệt kê.

Xin lưu ý rằng thuộc tính này không ảnh hưởng đến các đầu ra *_deploy.jar.

launcher

Nhãn; mặc định là None

Chỉ định một tệp nhị phân sẽ được dùng để chạy chương trình Java thay vì chương trình bin/java thông thường có trong JDK. Mục tiêu phải là cc_binary. Bạn có thể chỉ định mọi cc_binary triển khai Java Invocation API làm giá trị cho thuộc tính này.

Theo mặc định, Bazel sẽ sử dụng trình chạy JDK thông thường (bin/java hoặc java.exe).

Cờ Bazel --java_launcher có liên quan chỉ ảnh hưởng đến những mục tiêu java_binaryjava_test chưa chỉ định thuộc tính launcher.

Xin lưu ý rằng các phần phụ thuộc gốc (C++, SWIG, JNI) sẽ được tạo theo cách khác tuỳ thuộc vào việc bạn đang sử dụng trình chạy JDK hay một trình chạy khác:

  • Nếu bạn đang sử dụng trình chạy JDK thông thường (mặc định), thì các phần phụ thuộc gốc sẽ được tạo dưới dạng một thư viện dùng chung có tên là {name}_nativedeps.so, trong đó {name} là thuộc tính name của quy tắc java_binary này. Trình liên kết không xoá mã không dùng đến trong cấu hình này.
  • Nếu bạn đang sử dụng bất kỳ trình chạy nào khác, các phần phụ thuộc gốc (C++) sẽ được liên kết tĩnh vào một tệp nhị phân có tên {name}_nativedeps, trong đó {name} là thuộc tính name của quy tắc java_binary này. Trong trường hợp này, trình liên kết sẽ xoá mọi mã mà trình liên kết cho là không dùng đến khỏi tệp nhị phân kết quả, nghĩa là mọi mã C++ chỉ được truy cập thông qua JNI đều có thể không được liên kết, trừ phi đích cc_library đó chỉ định alwayslink = 1.

Khi sử dụng trình chạy khác với trình chạy JDK mặc định, định dạng của đầu ra *_deploy.jar sẽ thay đổi. Hãy xem tài liệu java_binary chính để biết thông tin chi tiết.

main_class

Chuỗi; giá trị mặc định là ""

Tên của lớp có phương thức main() để dùng làm điểm truy cập. Nếu một quy tắc sử dụng lựa chọn này, thì quy tắc đó không cần danh sách srcs=[...]. Do đó, với thuộc tính này, bạn có thể tạo một tệp thực thi từ một thư viện Java đã chứa một hoặc nhiều phương thức main().

Giá trị của thuộc tính này là tên lớp chứ không phải tệp nguồn. Lớp phải có sẵn trong thời gian chạy: lớp này có thể được quy tắc này biên dịch (từ srcs) hoặc do các phần phụ thuộc trực tiếp hoặc bắc cầu cung cấp (thông qua runtime_deps hoặc deps). Nếu lớp không có sẵn, tệp nhị phân sẽ gặp lỗi trong thời gian chạy; không có quy trình kiểm tra thời gian xây dựng.

plugins

Danh sách nhãn; mặc định là []

Trình bổ trợ trình biên dịch Java để chạy tại thời điểm biên dịch. Mỗi java_plugin được chỉ định trong thuộc tính này sẽ chạy bất cứ khi nào quy tắc này được tạo. Một thư viện cũng có thể kế thừa các trình bổ trợ từ những phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo sẽ được đưa vào tệp jar kết quả của quy tắc này.
resource_jars

Danh sách nhãn; mặc định là []

Không dùng nữa: Thay vào đó, hãy dùng java_import và deps hoặc runtime_deps.
resource_strip_prefix

Chuỗi; giá trị mặc định là ""

Tiền tố đường dẫn cần loại bỏ khỏi các tài nguyên Java.

Nếu được chỉ định, tiền tố đường dẫn này sẽ bị xoá khỏi mọi tệp trong thuộc tính resources. Nếu tệp tài nguyên không nằm trong thư mục này thì đó là lỗi. Nếu không được chỉ định (mặc định), đường dẫn của tệp tài nguyên sẽ được xác định theo cùng một logic như gói Java của tệp nguồn. Ví dụ: một tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm tại foo/bar/a.txt.

runtime_deps

Danh sách nhãn; mặc định là []

Các thư viện chỉ có sẵn cho tệp nhị phân hoặc kiểm thử cuối cùng trong thời gian chạy. Giống như deps thông thường, các tệp này sẽ xuất hiện trên đường dẫn lớp thời gian chạy, nhưng không giống như các tệp đó, các tệp này sẽ không xuất hiện trên đường dẫn lớp thời gian biên dịch. Các phần phụ thuộc chỉ cần trong thời gian chạy sẽ được liệt kê ở đây. Các công cụ phân tích phần phụ thuộc sẽ bỏ qua những mục tiêu xuất hiện trong cả runtime_depsdeps.
stamp

Số nguyên; giá trị mặc định là 0

Có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Các giá trị có thể là:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh chế độ cài đặt này, vì chế độ này có thể loại bỏ tính năng lưu vào bộ nhớ đệm từ xa cho tệp nhị phân và mọi thao tác tiếp theo phụ thuộc vào tệp nhị phân đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị hằng số. Điều này giúp lưu vào bộ nhớ đệm kết quả của bản dựng một cách hiệu quả.
  • stamp = -1: Việc nhúng thông tin bản dựng được kiểm soát bằng cờ --[no]stamp.

Các tệp nhị phân được đóng dấu sẽ không được tạo lại trừ phi các phần phụ thuộc của chúng thay đổi.

test_class

Chuỗi; giá trị mặc định là ""

Lớp Java mà trình chạy kiểm thử sẽ tải.

Theo mặc định, nếu bạn không xác định đối số này thì chế độ cũ sẽ được sử dụng và các đối số kiểm thử sẽ được dùng thay thế. Đặt cờ --nolegacy_bazel_java_test để không dự phòng cho đối số đầu tiên.

Thuộc tính này chỉ định tên của một lớp Java sẽ được kiểm thử này chạy. Bạn hiếm khi cần đặt thông số này. Nếu bạn bỏ qua đối số này, hệ thống sẽ suy luận bằng cách sử dụng name của mục tiêu và đường dẫn tương đối theo nguồn gốc của mục tiêu. Nếu kiểm thử nằm bên ngoài một gốc nguồn đã biết, Bazel sẽ báo cáo lỗi nếu test_class chưa được đặt.

Đối với JUnit3, lớp kiểm thử cần phải là một lớp con của junit.framework.TestCase hoặc cần có một phương thức tĩnh công khai suite() trả về một junit.framework.Test (hoặc một lớp con của Test). Đối với JUnit4, lớp này cần được chú giải bằng org.junit.runner.RunWith.

Thuộc tính này cho phép một số quy tắc java_test chia sẻ cùng một Test (TestCase, TestSuite, ...). Thông thường, thông tin bổ sung sẽ được truyền đến quy tắc này (ví dụ: thông qua jvm_flags=['-Dkey=value']) để hành vi của quy tắc khác nhau trong mỗi trường hợp, chẳng hạn như chạy một tập hợp con khác của các bài kiểm thử. Thuộc tính này cũng cho phép sử dụng các kiểm thử Java bên ngoài cây javatests.

use_launcher

Boolean; giá trị mặc định là True

Có nên sử dụng trình chạy tuỳ chỉnh cho tệp nhị phân hay không.

Nếu bạn đặt thuộc tính này thành false, thì thuộc tính launcher và cờ --java_launcher có liên quan sẽ bị bỏ qua đối với mục tiêu này.

use_testrunner

Boolean; giá trị mặc định là True

Sử dụng lớp trình chạy kiểm thử (theo mặc định là com.google.testing.junit.runner.BazelTestRunner) làm điểm truy cập chính cho chương trình Java và cung cấp lớp kiểm thử cho trình chạy kiểm thử dưới dạng giá trị của thuộc tính hệ thống bazel.test_suite. Bạn có thể dùng phương thức này để ghi đè hành vi mặc định (sử dụng trình chạy kiểm thử cho các quy tắc java_test và không sử dụng cho các quy tắc java_binary). Bạn khó có thể muốn làm việc này. Một trường hợp sử dụng là cho các quy tắc AllTest do một quy tắc khác gọi (ví dụ: để thiết lập cơ sở dữ liệu trước khi chạy các kiểm thử). Quy tắc AllTest phải được khai báo là java_binary, nhưng vẫn phải sử dụng trình chạy kiểm thử làm điểm truy cập chính. Bạn có thể ghi đè tên của một lớp trình chạy kiểm thử bằng thuộc tính main_class.

java_package_configuration

Xem nguồn quy tắc
java_package_configuration(name, data, compatible_with, deprecation, distribs, features, javacopts, licenses, packages, restricted_to, tags, target_compatible_with, testonly, visibility)

Cấu hình để áp dụng cho một nhóm gói. Bạn có thể thêm cấu hình vào java_toolchain.javacopts.

Ví dụ:

java_package_configuration(
    name = "my_configuration",
    packages = [":my_packages"],
    javacopts = ["-Werror"],
)

package_group(
    name = "my_packages",
    packages = [
        "//com/my/project/...",
        "-//com/my/project/testing/...",
    ],
)

java_toolchain(
    ...,
    package_configuration = [
        ":my_configuration",
    ]
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

data

Danh sách nhãn; mặc định là []

Danh sách các tệp mà cấu hình này cần trong thời gian chạy.
javacopts

Danh sách các chuỗi; mặc định là []

Cờ của trình biên dịch Java.
packages

Danh sách nhãn; mặc định là []

Tập hợp các package_group mà cấu hình sẽ được áp dụng.

java_plugin

Xem nguồn quy tắc
java_plugin(name, deps, srcs, data, resources, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, generates_api, javacopts, licenses, neverlink, output_licenses, plugins, processor_class, proguard_specs, resource_jars, resource_strip_prefix, restricted_to, tags, target_compatible_with, testonly, visibility)

java_plugin xác định các trình bổ trợ cho trình biên dịch Java do Bazel chạy. Hiện tại, loại trình bổ trợ duy nhất được hỗ trợ là trình xử lý chú thích. Quy tắc java_library hoặc java_binary có thể chạy các trình bổ trợ bằng cách phụ thuộc vào chúng thông qua thuộc tính plugins. java_library cũng có thể tự động xuất các trình bổ trợ sang những thư viện phụ thuộc trực tiếp vào trình bổ trợ đó bằng cách sử dụng exported_plugins.

Mục tiêu đầu ra ngầm ẩn

  • libname.jar: Kho lưu trữ Java.

Các đối số giống với java_library, ngoại trừ việc bổ sung đối số processor_class.

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện cần liên kết vào thư viện này. Xem các nhận xét chung về deps tại Các thuộc tính điển hình do hầu hết các quy tắc xây dựng xác định.

Các jar do các quy tắc java_library được liệt kê trong deps tạo sẽ nằm trên đường dẫn lớp thời gian biên dịch của quy tắc này. Hơn nữa, bao đóng bắc cầu của deps, runtime_depsexports sẽ nằm trên đường dẫn lớp thời gian chạy.

Ngược lại, các mục tiêu trong thuộc tính data được đưa vào runfiles nhưng không nằm trên đường dẫn lớp thời gian biên dịch cũng như thời gian chạy.

srcs

Danh sách nhãn; mặc định là []

Danh sách các tệp nguồn được xử lý để tạo mục tiêu. Thuộc tính này hầu như luôn là thuộc tính bắt buộc; hãy xem các trường hợp ngoại lệ bên dưới.

Các tệp nguồn thuộc loại .java sẽ được biên dịch. Trong trường hợp các tệp .java được tạo, bạn nên đặt tên của quy tắc tạo ở đây thay vì tên của chính tệp đó. Việc này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc có khả năng thích ứng tốt hơn với các thay đổi trong tương lai: nếu quy tắc tạo tạo ra các tệp khác nhau trong tương lai, bạn chỉ cần sửa một nơi: outs của quy tắc tạo. Bạn không nên liệt kê quy tắc tạo trong deps vì đây là một quy tắc không hoạt động.

Các tệp nguồn thuộc loại .srcjar sẽ được giải nén và biên dịch. (Điều này sẽ hữu ích nếu bạn cần tạo một nhóm tệp .java bằng genrule.)

Quy tắc: nếu quy tắc (thường là genrule hoặc filegroup) tạo ra bất kỳ tệp nào trong danh sách ở trên, thì các tệp đó sẽ được sử dụng theo cách tương tự như mô tả đối với tệp nguồn.

Đối số này gần như luôn bắt buộc, trừ phi thuộc tính main_class chỉ định một lớp trên đường dẫn lớp thời gian chạy hoặc bạn chỉ định đối số runtime_deps.

data

Danh sách nhãn; mặc định là []

Danh sách các tệp mà thư viện này cần trong thời gian chạy. Xem các nhận xét chung về data tại Các thuộc tính điển hình do hầu hết các quy tắc xây dựng xác định.

Khi tạo một java_library, Bazel không đặt các tệp này ở bất kỳ đâu; nếu data là tệp được tạo thì Bazel sẽ tạo các tệp đó. Khi tạo một kiểm thử phụ thuộc vào java_library này, Bazel sẽ sao chép hoặc liên kết các tệp data vào khu vực runfiles.

resources

Danh sách nhãn; mặc định là []

Danh sách các tệp dữ liệu cần đưa vào tệp jar Java.

Nếu bạn chỉ định tài nguyên, thì các tài nguyên đó sẽ được đi kèm trong tệp jar cùng với các tệp .class thông thường do quá trình biên dịch tạo ra. Vị trí của các tài nguyên bên trong tệp jar được xác định theo cấu trúc dự án. Trước tiên, Bazel sẽ tìm bố cục thư mục tiêu chuẩn của Maven (thư mục "src" theo sau là thư mục "resources" cháu). Nếu không tìm thấy, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (ví dụ: nếu một tài nguyên ở <workspace root>/x/java/y/java/z, thì đường dẫn của tài nguyên đó sẽ là y/java/z. Bạn không thể ghi đè phương pháp phỏng đoán này, tuy nhiên, bạn có thể dùng thuộc tính resource_strip_prefix để chỉ định một thư mục thay thế cụ thể cho các tệp tài nguyên.

Tài nguyên có thể là tệp nguồn hoặc tệp được tạo.

generates_api

Boolean; giá trị mặc định là False

Thuộc tính này đánh dấu các trình xử lý chú thích tạo mã API.

Nếu một quy tắc sử dụng trình xử lý chú thích tạo API, thì các quy tắc khác tuỳ thuộc vào quy tắc đó chỉ có thể tham chiếu đến mã được tạo nếu các thao tác biên dịch của chúng được lên lịch sau quy tắc tạo. Thuộc tính này hướng dẫn Bazel đưa ra các ràng buộc về lập lịch khi --java_header_compilation được bật.

CẢNH BÁO: Thuộc tính này ảnh hưởng đến hiệu suất bản dựng, chỉ sử dụng nếu cần.

javacopts

Danh sách các chuỗi; mặc định là []

Các lựa chọn bổ sung cho trình biên dịch của thư viện này. Chịu sự thay thế "Tạo biến"phân tích cú pháp Bourne shell.

Các lựa chọn trình biên dịch này được truyền đến javac sau các lựa chọn trình biên dịch chung.

Boolean; giá trị mặc định là False

Thư viện này chỉ nên được dùng để biên dịch chứ không phải trong thời gian chạy. Hữu ích nếu thư viện sẽ được môi trường thời gian chạy cung cấp trong quá trình thực thi. Ví dụ về các thư viện như vậy là API IDE cho các trình bổ trợ IDE hoặc tools.jar cho mọi thứ chạy trên JDK tiêu chuẩn.

Lưu ý rằng neverlink = 1 không ngăn trình biên dịch nội tuyến hoá tài liệu từ thư viện này vào các mục tiêu biên dịch phụ thuộc vào thư viện này, theo quy định của Đặc tả ngôn ngữ Java (ví dụ: hằng số static final của String hoặc của các kiểu dữ liệu nguyên thuỷ). Do đó, trường hợp sử dụng ưu tiên là khi thư viện thời gian chạy giống hệt với thư viện biên dịch.

Nếu thư viện thời gian chạy khác với thư viện biên dịch, thì bạn phải đảm bảo rằng thư viện này chỉ khác ở những nơi mà JLS cấm trình biên dịch nội tuyến (và điều này phải áp dụng cho tất cả các phiên bản JLS trong tương lai).

output_licenses

Loại giấy phép; mặc định là ["none"]

Xem common attributes
plugins

Danh sách nhãn; mặc định là []

Trình bổ trợ trình biên dịch Java để chạy tại thời điểm biên dịch. Mỗi java_plugin được chỉ định trong thuộc tính này sẽ chạy bất cứ khi nào quy tắc này được tạo. Một thư viện cũng có thể kế thừa các trình bổ trợ từ những phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo sẽ được đưa vào tệp jar kết quả của quy tắc này.
processor_class

Chuỗi; giá trị mặc định là ""

Lớp trình xử lý là loại đủ điều kiện của lớp mà trình biên dịch Java sẽ dùng làm điểm truy cập vào trình xử lý chú thích. Nếu không được chỉ định, quy tắc này sẽ không đóng góp một trình xử lý chú giải cho quá trình xử lý chú giải của trình biên dịch Java, nhưng đường dẫn lớp thời gian chạy của quy tắc này vẫn sẽ được đưa vào đường dẫn trình xử lý chú giải của trình biên dịch. (Đây chủ yếu là để các trình bổ trợ Error Prone sử dụng, được tải từ đường dẫn trình xử lý chú giải bằng java.util.ServiceLoader.)
proguard_specs

Danh sách nhãn; mặc định là []

Các tệp sẽ được dùng làm quy cách Proguard. Các thông số này sẽ mô tả bộ thông số kỹ thuật mà Proguard sẽ sử dụng. Nếu được chỉ định, chúng sẽ được thêm vào mọi mục tiêu android_binary tuỳ thuộc vào thư viện này. Các tệp có trong đây chỉ được có các quy tắc bất biến, cụ thể là -dontnote, -dontwarn, assumenosideeffects và các quy tắc bắt đầu bằng -keep. Các lựa chọn khác chỉ có thể xuất hiện trong proguard_specs của android_binary để đảm bảo các lần hợp nhất không trùng lặp.
resource_jars

Danh sách nhãn; mặc định là []

Không dùng nữa: Thay vào đó, hãy dùng java_import và deps hoặc runtime_deps.
resource_strip_prefix

Chuỗi; giá trị mặc định là ""

Tiền tố đường dẫn cần loại bỏ khỏi các tài nguyên Java.

Nếu được chỉ định, tiền tố đường dẫn này sẽ bị xoá khỏi mọi tệp trong thuộc tính resources. Nếu tệp tài nguyên không nằm trong thư mục này thì đó là lỗi. Nếu không được chỉ định (mặc định), đường dẫn của tệp tài nguyên sẽ được xác định theo cùng một logic như gói Java của tệp nguồn. Ví dụ: một tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm tại foo/bar/a.txt.

java_runtime

Xem nguồn quy tắc
java_runtime(name, srcs, compatible_with, default_cds, deprecation, distribs, features, hermetic_srcs, java, java_home, lib_ct_sym, lib_modules, licenses, restricted_to, tags, target_compatible_with, testonly, version, visibility)

Chỉ định cấu hình cho một thời gian chạy Java.

Ví dụ:

java_runtime(
    name = "jdk-9-ea+153",
    srcs = glob(["jdk9-ea+153/**"]),
    java_home = "jdk9-ea+153",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

srcs

Danh sách nhãn; mặc định là []

Tất cả các tệp trong thời gian chạy.
default_cds

Nhãn; mặc định là None

Kho lưu trữ CDS mặc định cho java_runtime khép kín. Khi hermetic được bật cho mục tiêu java_binary và nếu mục tiêu không cung cấp kho lưu trữ CDS riêng bằng cách chỉ định thuộc tính classlist, thì CDS mặc định java_runtime sẽ được đóng gói trong JAR triển khai hermetic.
hermetic_srcs

Danh sách nhãn; mặc định là []

Các tệp trong thời gian chạy cần thiết cho việc triển khai khép kín.
java

Nhãn; mặc định là None

Đường dẫn đến tệp thực thi java.
java_home

Chuỗi; giá trị mặc định là ""

Đường dẫn đến gốc của thời gian chạy. Có thể thay thế bằng biến "Make" (Thực hiện). Nếu đường dẫn này là đường dẫn tuyệt đối, thì quy tắc sẽ biểu thị một thời gian chạy Java không khép kín với một đường dẫn nổi tiếng. Trong trường hợp đó, các thuộc tính srcsjava phải trống.
lib_ct_sym

Nhãn; mặc định là None

Tệp lib/ct.sym cần thiết để biên dịch bằng --release. Nếu bạn không chỉ định và có chính xác một tệp trong srcs có đường dẫn kết thúc bằng /lib/ct.sym, thì tệp đó sẽ được dùng.
lib_modules

Nhãn; mặc định là None

Tệp lib/modules cần thiết cho các hoạt động triển khai khép kín.
version

Số nguyên; giá trị mặc định là 0

Phiên bản tính năng của thời gian chạy Java. Tức là số nguyên do Runtime.version().feature() trả về.

java_toolchain

Xem nguồn quy tắc
java_toolchain(name, android_lint_data, android_lint_jvm_opts, android_lint_opts, android_lint_package_configuration, android_lint_runner, bootclasspath, compatible_with, deprecation, deps_checker, distribs, features, forcibly_disable_header_compilation, genclass, header_compiler, header_compiler_direct, ijar, jacocorunner, java_runtime, javabuilder, javabuilder_data, javabuilder_jvm_opts, javac_supports_multiplex_workers, javac_supports_workers, javacopts, jvm_opts, licenses, oneversion, oneversion_allowlist_for_tests, oneversion_whitelist, package_configuration, proguard_allowlister, resourcejar, restricted_to, singlejar, source_version, tags, target_compatible_with, target_version, testonly, timezone_data, tools, turbine_data, turbine_jvm_opts, visibility, xlint)

Chỉ định cấu hình cho trình biên dịch Java. Bạn có thể thay đổi chuỗi công cụ cần dùng thông qua đối số --java_toolchain. Thông thường, bạn không nên viết những loại quy tắc đó, trừ phi bạn muốn điều chỉnh trình biên dịch Java.

Ví dụ

Ví dụ đơn giản:

java_toolchain(
    name = "toolchain",
    source_version = "7",
    target_version = "7",
    bootclasspath = ["//tools/jdk:bootclasspath"],
    xlint = [ "classfile", "divzero", "empty", "options", "path" ],
    javacopts = [ "-g" ],
    javabuilder = ":JavaBuilder_deploy.jar",
)

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên riêng cho mục tiêu này.

android_lint_data

Danh sách nhãn; mặc định là []

Nhãn của các công cụ có sẵn để mở rộng nhãn trong android_lint_jvm_opts.
android_lint_jvm_opts

Danh sách các chuỗi; mặc định là []

Danh sách các đối số cho JVM khi gọi Android Lint.
android_lint_opts

Danh sách các chuỗi; mặc định là []

Danh sách các đối số của trình tìm lỗi mã nguồn Android.
android_lint_package_configuration

Danh sách nhãn; mặc định là []

Cấu hình Android Lint cần được áp dụng cho các nhóm gói được chỉ định.
android_lint_runner

Nhãn; mặc định là None

Nhãn của trình chạy Android Lint (nếu có).
bootclasspath

Danh sách nhãn; mặc định là []

Các mục bootclasspath đích của Java. Tương ứng với cờ -bootclasspath của javac.
deps_checker

Danh sách nhãn; mặc định là []

Nhãn của tệp jar triển khai ImportDepsChecker.
forcibly_disable_header_compilation

Boolean; giá trị mặc định là False

Ghi đè --java_header_compilation để tắt quá trình biên dịch tiêu đề trên những nền tảng không hỗ trợ quá trình này, ví dụ: JDK 7 Bazel.
genclass

Danh sách nhãn; bắt buộc

Nhãn của tệp jar triển khai GenClass.
header_compiler

Danh sách nhãn; mặc định là []

Nhãn của trình biên dịch tiêu đề. Bắt buộc nếu bạn bật --java_header_compilation.
header_compiler_direct

Danh sách nhãn; mặc định là []

Nhãn không bắt buộc của trình biên dịch tiêu đề để sử dụng cho các thao tác trực tiếp trên đường dẫn lớp không bao gồm bất kỳ trình xử lý chú thích nào tạo API.

Công cụ này không hỗ trợ xử lý chú thích.

ijar

Danh sách nhãn; bắt buộc

Nhãn của tệp thực thi ijar.
jacocorunner

Nhãn; mặc định là None

Nhãn của tệp jar triển khai JacocoCoverageRunner.
java_runtime

Nhãn; bắt buộc

java_runtime để sử dụng với chuỗi công cụ này. Theo mặc định, giá trị này là java_runtime trong cấu hình thực thi.
javabuilder

Danh sách nhãn; bắt buộc

Nhãn của tệp jar triển khai JavaBuilder.
javabuilder_data

Danh sách nhãn; mặc định là []

Nhãn của dữ liệu có sẵn để mở rộng nhãn trong javabuilder_jvm_opts.
javabuilder_jvm_opts

Danh sách các chuỗi; mặc định là []

Danh sách các đối số cho JVM khi gọi JavaBuilder.
javac_supports_multiplex_workers

Boolean; giá trị mặc định là True

True nếu JavaBuilder hỗ trợ chạy dưới dạng một trình thực thi liên tục đa luồng, false nếu không.
javac_supports_workers

Boolean; giá trị mặc định là True

True nếu JavaBuilder hỗ trợ chạy dưới dạng một worker liên tục, false nếu không.
javacopts

Danh sách các chuỗi; mặc định là []

Danh sách các đối số bổ sung cho trình biên dịch Java. Vui lòng tham khảo tài liệu về trình biên dịch Java để biết danh sách đầy đủ các cờ trình biên dịch Java có thể có.
jvm_opts

Danh sách các chuỗi; mặc định là []

Danh sách các đối số cho JVM khi gọi trình biên dịch Java. Vui lòng tham khảo tài liệu về máy ảo Java để biết danh sách đầy đủ các cờ có thể có cho lựa chọn này.
oneversion

Nhãn; mặc định là None

Nhãn của tệp nhị phân thực thi một phiên bản.
oneversion_allowlist_for_tests

Nhãn; mặc định là None

Nhãn của danh sách cho phép một phiên bản để kiểm thử.
oneversion_whitelist

Nhãn; mặc định là None

Nhãn của danh sách cho phép một phiên bản.
package_configuration

Danh sách nhãn; mặc định là []

Cấu hình cần được áp dụng cho các nhóm gói đã chỉ định.
proguard_allowlister

Nhãn; mặc định là "@bazel_tools//tools/jdk:proguard_whitelister"

Nhãn của danh sách cho phép Proguard.
resourcejar

Danh sách nhãn; mặc định là []

Nhãn của tệp thực thi trình tạo jar tài nguyên.
singlejar

Danh sách nhãn; bắt buộc

Nhãn của tệp jar triển khai SingleJar.
source_version

Chuỗi; giá trị mặc định là ""

Phiên bản nguồn Java (ví dụ: "6" hoặc "7"). Nội dung này chỉ định tập hợp cấu trúc mã nào được phép trong mã nguồn Java.
target_version

Chuỗi; giá trị mặc định là ""

Phiên bản mục tiêu Java (ví dụ: "6" hoặc "7"). Nó chỉ định thời gian chạy Java mà lớp này sẽ được tạo.
timezone_data

Nhãn; mặc định là None

Nhãn của một jar tài nguyên chứa dữ liệu múi giờ. Nếu được đặt, dữ liệu múi giờ sẽ được thêm dưới dạng một phần phụ thuộc thời gian chạy ngầm định của tất cả các quy tắc java_binary.
tools

Danh sách nhãn; mặc định là []

Nhãn của các công cụ có sẵn để mở rộng nhãn trong jvm_opts.
turbine_data

Danh sách nhãn; mặc định là []

Nhãn của dữ liệu có sẵn để mở rộng nhãn trong turbine_jvm_opts.
turbine_jvm_opts

Danh sách các chuỗi; mặc định là []

Danh sách các đối số cho JVM khi gọi turbine.
xlint

Danh sách các chuỗi; mặc định là []

Danh sách cảnh báo cần thêm hoặc xoá khỏi danh sách mặc định. Thêm dấu gạch ngang vào trước để xoá. Vui lòng xem tài liệu về Javac về các lựa chọn -Xlint để biết thêm thông tin.