Quy tắc Java

Quy tắc

java_binary

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 kho lưu trữ Java ("tệp jar"), cùng với tập lệnh shell trình bao bọc có cùng tên với quy tắc. Tập lệnh shell của trình bao bọc sử dụng một classpath, bao gồm một tệp jar cho mỗi thư viện mà tệp nhị phân phụ thuộc vào, cùng với các tệp khác.

Tập lệnh trình bao bọc chấp nhận một số cờ duy nhất. Hãy 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ờ có thể định cấu hình và biến môi trường được trình bao bọc chấp nhận.

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

  • name.jar: Một kho 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 bản lưu trữ chứa các nguồn ("jar nguồn").
  • name_deploy.jar: Một tệp 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 tuỳ chọn --singlejar của tập lệnh bao bọc. Tập lệnh bao bọc sẽ được ưu tiên hơn java -jar vì tập lệnh này cũng truyền các cờ JVM và các tuỳ chọn để tải thư viện gốc.

    Tệp triển khai chứa tất cả các lớp mà trình tải lớp có thể tìm thấy sẽ tìm thấy classpath đã 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. Tệp 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 trình xử lý này sẽ được tự động 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 trình chạy, thì thay vì là tệp JAR thông thường, _deploy.jar sẽ là một tệp nhị phân gốc. Tệp 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 thành một tệp nhị phân tĩnh. Các byte của tệp jar thực tế sẽ được nối vào tệp nhị phân gốc đó, tạo ra một blob nhị phân duy nhất chứa cả tệp thực thi và mã Java. Bạn có thể thực thi trực tiếp tệp jar thu được như cách bạn thực thi bất kỳ tệp nhị phân gốc nào.

  • name_deploy-src.jar: Tệp lưu trữ chứa các nguồn được thu thập từ thời điểm đóng bắc cầu 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 tệp jar không có tệp nguồn nào khớp.

Quy tắc java_binary không cho phép sử dụng thuộc tính deps nếu không có srcs. Quy tắc này yêu cầu phải có 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
)

Hãy làm như sau:

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

Đối số

Thuộc tính
name

Name; required

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


Bạn nên dùng tên của tệp nguồn, là điểm truy cập chính của ứng dụng (trừ phần mở rộng). 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

List of labels; optional

Danh sách các thư viện khác được liên kết đến đích. Hãy xem nhận xét chung về deps tại phần Các thuộc tính thông thường được xác định theo hầu hết quy tắc tạo.
srcs

List of labels; optional

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 bắt buộc; hãy xem các ngoại lệ dưới đây.

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 đó. Điều này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc này dễ thích ứng hơn với các thay đổi trong tương lai: nếu quy tắc đang tạo tạo ra các tệp khác trong tương lai, thì 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ì quy tắc này không hoạt động.

Tệp nguồn loại .srcjar sẽ được giải nén và biên dịch. (Điều này rất hữu ích nếu bạn cần tạo một tập hợp các tệp .java có quy tắc tạo sinh.)

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

Đối số này hầu như luôn bắt buộc, ngoại trừ trường hợp 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 nếu bạn chỉ định đối số runtime_deps.

resources

List of labels; optional

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

Nếu bạn chỉ định tài nguyên, các tài nguyên này sẽ được nhóm trong tệp jar cùng với các tệp .class thông thường được tạo bằng quá trình biên dịch. 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 tìm bố cục thư mục tiêu chuẩn của Maven, (một thư mục "src" theo sau là một thư mục con của thư mục "resources"). Nếu không tìm thấy tài nguyên đó, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (chẳng hạn, nếu tài nguyên nằm tại <workspace root>/x/java/y/java/z, đường dẫn của tài nguyên sẽ là y/java/z. Phương pháp phỏng đoán này không thể bị ghi đè. 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

List of labels; optional

KHÔNG DÙNG LỰA CHỌN NÀY, TRỪ KHI KHÔNG CÓ 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ợ thư viện bên thứ ba yêu cầu tài nguyên của các thư viện này phải được tìm thấy trên classpath chính xác là "myconfig.xml". Do có nguy cơ xung đột không gian tên, bạn chỉ được phép sử dụng tính năng này trên tệp nhị phân chứ không phải thư viện.

create_executable

Boolean; optional; nonconfigurable; default is True

Liệu tệp nhị phân có thể thực thi hay không. Các tệp nhị phân không thể thực thi thu thập các phần phụ thuộc Java thời gian chạy bắc cầu vào một tệp triển khai, nhưng không thể thực thi trực tiếp. Sẽ không có tập lệnh trình bao bọc nào được tạo nếu bạn đặt thuộc tính này. Sẽ có lỗi nếu bạn đặt giá trị này thành 0 nếu bạn đặt thuộc tính launcher hoặc main_class.
deploy_env

List of labels; optional

Danh sách các mục tiêu java_binary khác đại diện cho môi trường triển khai cho tệp nhị phân này. Đặt thuộc tính này khi tạo một trình bổ trợ mà java_binary khác sẽ tải.
Việc đặt thuộc tính này sẽ loại trừ mọi phần phụ thuộc khỏi đường dẫn lớp thời gian chạy (và vùng 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

List of strings; optional

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 thay thế "Tạo biến".
javacopts

List of strings; optional

Các tuỳ chọn trình biên dịch bổ sung dành cho thư viện này. Có thể thay thế "Tạo biến"mã thông báo shell shell.

Các tuỳ chọn trình biên dịch này được chuyển đến javac sau các tuỳ chọn trình biên dịch chung.

jvm_flags

List of strings; optional

Danh sách cờ để nhúng vào tập lệnh bao bọc được tạo để chạy tệp nhị phân này. Tuân theo sự thay thế $(location)"Make variable" (Tạo biến) và phương thức mã hoá vỏ Bourne.

Tập lệnh trình bao bọc cho tệp nhị phân Java bao gồm định nghĩa CLASSPATH (để tìm tất cả các tệp 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 sẽ chứa 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, bạn phải chỉ định các đối số dành cho JVM phân tích cú pháp trước tên lớp trên dòng lệnh. Nội dung của jvm_flags đượ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 dữ liệu đầu ra của *_deploy.jar.

launcher

Label; optional

Chỉ định một tệp nhị phân sẽ 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 bất kỳ cc_binary triển khai API gọi Java nào 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 các 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 nhau tuỳ thuộc vào việc bạn đang sử dụng trình chạy JDK hay trình chạy khác:

  • Nếu bạn đang 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 xây dựng dưới dạng thư viện chia sẻ có tên là {name}_nativedeps.so, trong đó {name} là thuộc tính name của quy tắc java_binary này. Mã không sử dụng không bị trình liên kết xoá 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ới một tệp nhị phân có tên là {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 thu được, tức là không liên kết được bất kỳ mã C++ nào chỉ được truy cập qua JNI, trừ phi mục tiêu cc_library đó chỉ định alwayslink = 1.

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

main_class

String; optional

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 tuỳ chọn này, thì quy tắc đó không cần có danh sách srcs=[...]. Do đó, với thuộc tính này, người dùng có thể tạo tệp thực thi 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 đó có thể được biên dịch bởi quy tắc này (từ srcs) hoặc được cung cấp bởi các phần phụ thuộc trực tiếp hoặc bắc cầu (thông qua runtime_deps hoặc deps). Nếu lớp không có sẵn, tệp nhị phân sẽ không thành công trong thời gian chạy; không có việc kiểm tra thời gian xây dựng.

plugins

List of labels; optional

Các trình bổ trợ trình biên dịch Java để chạy vào thời gian 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. Thư viện cũng có thể kế thừa trình bổ trợ từ các phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo ra sẽ được đưa vào tệp chứa quy tắc này.
resource_jars

List of labels; optional

Ngừng sử dụng: Thay vào đó, hãy dùng java_import và phần phụ thuộc hoặc Runtime_deps.
resource_strip_prefix

String; optional

Tiền tố đường dẫn để xoá 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. Sẽ có lỗi khi tệp tài nguyên không nằm trong thư mục này. 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ụ: tệp nguồn ở stuff/java/foo/bar/a.txt sẽ được đặt ở foo/bar/a.txt.

runtime_deps

List of labels; optional

Các thư viện cung cấp cho tệp nhị phân cuối cùng hoặc chỉ kiểm thử trong thời gian chạy. Giống như deps thông thường, những lớ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ư những lớ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 thiết 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 nên bỏ qua các mục tiêu xuất hiện trong cả runtime_depsdeps.
stamp

Integer; optional; default is -1

Liệu có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Có thể là những giá trị sau đây:
  • 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 sử dụng chế độ cài đặt này, vì chế độ cài đặt này có thể tắt hoạt động lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác xuôi dòng phụ thuộc vào chế độ cài đặt này.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Chức năng này lưu kết quả bản dựng vào bộ nhớ đệm tốt.
  • stamp = -1: Việc nhúng thông tin bản dựng chịu sự kiểm soát của cờ --[no]stamp.

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

use_launcher

Boolean; optional; default is True

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

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

use_testrunner

Boolean; optional; default is False

Sử dụng lớp 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 một chương trình Java và cung cấp lớp kiểm thử này cho trình chạy kiểm thử dưới dạng một giá trị của thuộc tính hệ thống bazel.test_suite. Bạn có thể sử dụng tính năng 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 hành vi này cho các quy tắc java_binary. Ít có khả năng bạn sẽ muốn làm việc này. Một trường hợp sử dụng là đối với các quy tắc AllTest được gọi bởi một quy tắc khác (chẳng hạn như để thiết lập cơ sở dữ liệu trước khi chạy kiểm thử). Bạn phải khai báo quy tắc AllTestjava_binary, nhưng vẫn nên 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 chạy kiểm thử bằng thuộc tính main_class.

java_import

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

Name; required

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

deps

List of labels; optional

Danh sách các thư viện khác được liên kết đến đích. Xem java_library.deps.
constraints

List of strings; optional; nonconfigurable

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

List of labels; optional

Các mục tiêu được cung cấp cho người dùng quy tắc này. Xem java_library.exports.
jars

List of labels; required

Danh sách 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; optional; default is False

Chỉ sử dụng thư viện này để biên dịch và không sử dụng 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ư thế này: API IDE cho trình bổ trợ IDE hoặc tools.jar cho mọi dịch vụ chạy trên JDK tiêu chuẩn.
proguard_specs

List of labels; optional

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

List of labels; optional

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

Label; optional

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

java_library

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 bản lưu trữ Java chứa các tệp lớp.
  • libname-src.jar: Một bản lưu trữ chứa các nguồn ("jar nguồn").

Đối số

Thuộc tính
name

Name; required

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

deps

List of labels; optional

Danh sách thư viện cần liên kết đến thư viện này. Hãy xem nhận xét chung về deps tại phần Các thuộc tính thông thường được xác định theo hầu hết quy tắc tạo.

Các tệp lọ do quy tắc java_library tạo và liệt kê trong deps sẽ nằm trên classpath thời gian biên dịch của quy tắc này. Hơn nữa, trạng thái đóng bắc cầu của deps, runtime_depsexports sẽ nằm trên classpath 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 các tệp runfile nhưng không nằm trên classpath thời gian biên dịch lẫn classpath thời gian chạy.

srcs

List of labels; optional

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 bắt buộc; hãy xem các ngoại lệ dưới đây.

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 đó. Điều này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc này dễ thích ứng hơn với các thay đổi trong tương lai: nếu quy tắc đang tạo tạo ra các tệp khác trong tương lai, thì 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ì quy tắc này không hoạt động.

Tệp nguồn loại .srcjar sẽ được giải nén và biên dịch. (Điều này rất hữu ích nếu bạn cần tạo một tập hợp các tệp .java có quy tắc tạo sinh.)

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

Đối số này hầu như luôn bắt buộc, ngoại trừ trường hợp 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 nếu bạn chỉ định đối số runtime_deps.

data

List of labels; optional

Danh sách các tệp mà thư viện này cần trong thời gian chạy. Hãy xem nhận xét chung về data tại phần Các thuộc tính thông thường được xác định theo hầu hết quy tắc tạo.

Khi tạo java_library, Bazel không đặt những tệp này ở bất cứ đâu. Nếu các tệp data là các tệp được tạo thì Bazel sẽ tạo các tệp đó. Khi tạo một quy trình 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 vùng runfiles.

resources

List of labels; optional

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

Nếu bạn chỉ định tài nguyên, các tài nguyên này sẽ được nhóm trong tệp jar cùng với các tệp .class thông thường được tạo bằng quá trình biên dịch. 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 tìm bố cục thư mục tiêu chuẩn của Maven, (một thư mục "src" theo sau là một thư mục con của thư mục "resources"). Nếu không tìm thấy tài nguyên đó, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (chẳng hạn, nếu tài nguyên nằm tại <workspace root>/x/java/y/java/z, đường dẫn của tài nguyên sẽ là y/java/z. Phương pháp phỏng đoán này không thể bị ghi đè. 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

List of labels; optional

Danh sách các java_plugin (ví dụ: trình xử lý chú giải) cần 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

List of labels; optional

Thư viện đã xuất.

Các quy tắc liệt kê ở đây sẽ cung cấp các quy tắc đó cho quy tắc gốc, 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 đối với deps thông thường (không xuất).

Tóm tắt: một quy tắc X có thể truy cập mã trong Y nếu tồn tại một đường dẫn phần phụ thuộc bắt đầu bằng cạnh deps, theo sau là 0 hoặc nhiều cạnh exports. Hãy xem một số ví dụ để minh hoạ cho đ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à phần phụ thuộc bắc cầu của A, vì vậy, việc thay đổi 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, hoặc B có thể giúp A (và mọi nội dung 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 (B) của nó.

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

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

javacopts

List of strings; optional

Các tuỳ chọn trình biên dịch bổ sung dành cho thư viện này. Có thể thay thế "Tạo biến"mã thông báo shell shell.

Các tuỳ chọn trình biên dịch này được chuyển đến javac sau các tuỳ chọn trình biên dịch chung.

Boolean; optional; default is False

Liệu thư viện này chỉ nên được dùng để biên dịch chứ không dùng 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ề những thư viện như vậy: API IDE cho trình bổ trợ IDE hoặc tools.jar cho mọi dịch vụ chạy trên JDK tiêu chuẩn.

Xin lưu ý rằng neverlink = 1 không ngăn trình biên dịch chèn 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 nội dung đó, như được Quy cách ngôn ngữ Java cho phép (ví dụ: Hằng số static final của String hoặ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 đó chỉ khác ở những vị trí mà JLS cấm trình biên dịch cùng dòng (và phải áp dụng cho mọi phiên bản JLS trong tương lai).

plugins

List of labels; optional

Các trình bổ trợ trình biên dịch Java để chạy vào thời gian 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. Thư viện cũng có thể kế thừa trình bổ trợ từ các phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo ra sẽ được đưa vào tệp chứa quy tắc này.
proguard_specs

List of labels; optional

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

List of labels; optional

Ngừng sử dụng: Thay vào đó, hãy dùng java_import và phần phụ thuộc hoặc Runtime_deps.
resource_strip_prefix

String; optional

Tiền tố đường dẫn để xoá 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. Sẽ có lỗi khi tệp tài nguyên không nằm trong thư mục này. 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ụ: tệp nguồn ở stuff/java/foo/bar/a.txt sẽ được đặt ở foo/bar/a.txt.

runtime_deps

List of labels; optional

Các thư viện cung cấp cho tệp nhị phân cuối cùng hoặc chỉ kiểm thử trong thời gian chạy. Giống như deps thông thường, những lớ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ư những lớ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 thiết 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 nên bỏ qua các mục tiêu xuất hiện trong cả runtime_depsdeps.

java_lite_proto_library

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 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

Name; required

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

deps

List of labels; optional

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

java_proto_library

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 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

Name; required

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

deps

List of labels; optional

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

java_test

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() biên dịch kiểm thử Java. Kiểm thử là một trình bao bọc nhị phân xung quanh mã kiểm thử. 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: Tệp lưu trữ Java.
  • name_deploy.jar: Tệp lưu trữ Java phù hợp để triển khai. (Chỉ được tạo khi có yêu cầu rõ ràng.) Hãy xem nội dung mô tả về đầu ra name_deploy.jar của java_binary để biết thêm thông tin chi tiết.

Xem phần về đố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

Name; required

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

deps

List of labels; optional

Danh sách các thư viện khác được liên kết đến đích. Hãy xem nhận xét chung về deps tại phần Các thuộc tính thông thường được xác định theo hầu hết quy tắc tạo.
srcs

List of labels; optional

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 bắt buộc; hãy xem các ngoại lệ dưới đây.

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 đó. Điều này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc này dễ thích ứng hơn với các thay đổi trong tương lai: nếu quy tắc đang tạo tạo ra các tệp khác trong tương lai, thì 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ì quy tắc này không hoạt động.

Tệp nguồn loại .srcjar sẽ được giải nén và biên dịch. (Điều này rất hữu ích nếu bạn cần tạo một tập hợp các tệp .java có quy tắc tạo sinh.)

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

Đối số này hầu như luôn bắt buộc, ngoại trừ trường hợp 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 nếu bạn chỉ định đối số runtime_deps.

resources

List of labels; optional

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

Nếu bạn chỉ định tài nguyên, các tài nguyên này sẽ được nhóm trong tệp jar cùng với các tệp .class thông thường được tạo bằng quá trình biên dịch. 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 tìm bố cục thư mục tiêu chuẩn của Maven, (một thư mục "src" theo sau là một thư mục con của thư mục "resources"). Nếu không tìm thấy tài nguyên đó, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (chẳng hạn, nếu tài nguyên nằm tại <workspace root>/x/java/y/java/z, đường dẫn của tài nguyên sẽ là y/java/z. Phương pháp phỏng đoán này không thể bị ghi đè. 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

List of labels; optional

KHÔNG DÙNG LỰA CHỌN NÀY, TRỪ KHI KHÔNG CÓ 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ợ thư viện bên thứ ba yêu cầu tài nguyên của các thư viện này phải được tìm thấy trên classpath chính xác là "myconfig.xml". Do có nguy cơ xung đột không gian tên, bạn chỉ được phép sử dụng tính năng này trên tệp nhị phân chứ không phải thư viện.

create_executable

Boolean; optional; nonconfigurable; default is True

Liệu tệp nhị phân có thể thực thi hay không. Các tệp nhị phân không thể thực thi thu thập các phần phụ thuộc Java thời gian chạy bắc cầu vào một tệp triển khai, nhưng không thể thực thi trực tiếp. Sẽ không có tập lệnh trình bao bọc nào được tạo nếu bạn đặt thuộc tính này. Sẽ có lỗi nếu bạn đặt giá trị này thành 0 nếu bạn đặt thuộc tính launcher hoặc main_class.
deploy_manifest_lines

List of strings; optional

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 thay thế "Tạo biến".
javacopts

List of strings; optional

Các tuỳ chọn trình biên dịch bổ sung dành cho thư viện này. Có thể thay thế "Tạo biến"mã thông báo shell shell.

Các tuỳ chọn trình biên dịch này được chuyển đến javac sau các tuỳ chọn trình biên dịch chung.

jvm_flags

List of strings; optional

Danh sách cờ để nhúng vào tập lệnh bao bọc được tạo để chạy tệp nhị phân này. Tuân theo sự thay thế $(location)"Make variable" (Tạo biến) và phương thức mã hoá vỏ Bourne.

Tập lệnh trình bao bọc cho tệp nhị phân Java bao gồm định nghĩa CLASSPATH (để tìm tất cả các tệp 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 sẽ chứa 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, bạn phải chỉ định các đối số dành cho JVM phân tích cú pháp trước tên lớp trên dòng lệnh. Nội dung của jvm_flags đượ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 dữ liệu đầu ra của *_deploy.jar.

launcher

Label; optional

Chỉ định một tệp nhị phân sẽ 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 bất kỳ cc_binary triển khai API gọi Java nào 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 các 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 nhau tuỳ thuộc vào việc bạn đang sử dụng trình chạy JDK hay trình chạy khác:

  • Nếu bạn đang 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 xây dựng dưới dạng thư viện chia sẻ có tên là {name}_nativedeps.so, trong đó {name} là thuộc tính name của quy tắc java_binary này. Mã không sử dụng không bị trình liên kết xoá 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ới một tệp nhị phân có tên là {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 thu được, tức là không liên kết được bất kỳ mã C++ nào chỉ được truy cập qua JNI, trừ phi mục tiêu cc_library đó chỉ định alwayslink = 1.

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

main_class

String; optional

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 tuỳ chọn này, thì quy tắc đó không cần có danh sách srcs=[...]. Do đó, với thuộc tính này, người dùng có thể tạo tệp thực thi 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 đó có thể được biên dịch bởi quy tắc này (từ srcs) hoặc được cung cấp bởi các phần phụ thuộc trực tiếp hoặc bắc cầu (thông qua runtime_deps hoặc deps). Nếu lớp không có sẵn, tệp nhị phân sẽ không thành công trong thời gian chạy; không có việc kiểm tra thời gian xây dựng.

plugins

List of labels; optional

Các trình bổ trợ trình biên dịch Java để chạy vào thời gian 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. Thư viện cũng có thể kế thừa trình bổ trợ từ các phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo ra sẽ được đưa vào tệp chứa quy tắc này.
resource_jars

List of labels; optional

Ngừng sử dụng: Thay vào đó, hãy dùng java_import và phần phụ thuộc hoặc Runtime_deps.
resource_strip_prefix

String; optional

Tiền tố đường dẫn để xoá 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. Sẽ có lỗi khi tệp tài nguyên không nằm trong thư mục này. 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ụ: tệp nguồn ở stuff/java/foo/bar/a.txt sẽ được đặt ở foo/bar/a.txt.

runtime_deps

List of labels; optional

Các thư viện cung cấp cho tệp nhị phân cuối cùng hoặc chỉ kiểm thử trong thời gian chạy. Giống như deps thông thường, những lớ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ư những lớ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 thiết 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 nên bỏ qua các mục tiêu xuất hiện trong cả runtime_depsdeps.
stamp

Integer; optional; default is 0

Liệu có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Có thể là những giá trị sau đây:
  • 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 sử dụng chế độ cài đặt này, vì chế độ cài đặt này có thể tắt hoạt động lưu vào bộ nhớ đệm từ xa đối với tệp nhị phân và mọi thao tác xuôi dòng phụ thuộc vào chế độ cài đặt này.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Chức năng này lưu kết quả bản dựng vào bộ nhớ đệm tốt.
  • stamp = -1: Việc nhúng thông tin bản dựng chịu sự kiểm soát của cờ --[no]stamp.

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

test_class

String; optional

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

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

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

Đối với JUnit3, lớp kiểm thử cần phải là lớp con của junit.framework.TestCase hoặc cần có phương thức suite() tĩnh công khai trả về 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ú thích 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 vào thuộc tính này (ví dụ: qua jvm_flags=['-Dkey=value']) để hành vi của lớp thay đổi 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 bài kiểm thử Java bên ngoài cây javatests.

use_launcher

Boolean; optional; default is True

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

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

use_testrunner

Boolean; optional; default is True

Sử dụng lớp 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 một chương trình Java và cung cấp lớp kiểm thử này cho trình chạy kiểm thử dưới dạng một giá trị của thuộc tính hệ thống bazel.test_suite. Bạn có thể sử dụng tính năng 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 hành vi này cho các quy tắc java_binary. Ít có khả năng bạn sẽ muốn làm việc này. Một trường hợp sử dụng là đối với các quy tắc AllTest được gọi bởi một quy tắc khác (chẳng hạn như để thiết lập cơ sở dữ liệu trước khi chạy kiểm thử). Bạn phải khai báo quy tắc AllTestjava_binary, nhưng vẫn nên 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 chạy kiểm thử bằng thuộc tính main_class.

java_package_configuration

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 tập hợp các 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

Name; required

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

data

List of labels; optional

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

List of strings; optional

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

List of labels; optional

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

java_plugin

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ú giải. Quy tắc java_library hoặc java_binary có thể chạy trình bổ trợ bằng cách phụ thuộc vào các trình bổ trợ đó thông qua thuộc tính plugins. java_library cũng có thể tự động xuất trình bổ trợ sang các thư viện trực tiếp phụ thuộc 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: Tệp lưu trữ Java.

Các đối số giống với java_library, ngoại trừ việc thêm đối số processor_class.

Đối số

Thuộc tính
name

Name; required

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

deps

List of labels; optional

Danh sách thư viện cần liên kết đến thư viện này. Hãy xem nhận xét chung về deps tại phần Các thuộc tính thông thường được xác định theo hầu hết quy tắc tạo.

Các tệp lọ do quy tắc java_library tạo và liệt kê trong deps sẽ nằm trên classpath thời gian biên dịch của quy tắc này. Hơn nữa, trạng thái đóng bắc cầu của deps, runtime_depsexports sẽ nằm trên classpath 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 các tệp runfile nhưng không nằm trên classpath thời gian biên dịch lẫn classpath thời gian chạy.

srcs

List of labels; optional

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 bắt buộc; hãy xem các ngoại lệ dưới đây.

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 đó. Điều này không chỉ cải thiện khả năng đọc mà còn giúp quy tắc này dễ thích ứng hơn với các thay đổi trong tương lai: nếu quy tắc đang tạo tạo ra các tệp khác trong tương lai, thì 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ì quy tắc này không hoạt động.

Tệp nguồn loại .srcjar sẽ được giải nén và biên dịch. (Điều này rất hữu ích nếu bạn cần tạo một tập hợp các tệp .java có quy tắc tạo sinh.)

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

Đối số này hầu như luôn bắt buộc, ngoại trừ trường hợp 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 nếu bạn chỉ định đối số runtime_deps.

data

List of labels; optional

Danh sách các tệp mà thư viện này cần trong thời gian chạy. Hãy xem nhận xét chung về data tại phần Các thuộc tính thông thường được xác định theo hầu hết quy tắc tạo.

Khi tạo java_library, Bazel không đặt những tệp này ở bất cứ đâu. Nếu các tệp data là các tệp được tạo thì Bazel sẽ tạo các tệp đó. Khi tạo một quy trình 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 vùng runfiles.

resources

List of labels; optional

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

Nếu bạn chỉ định tài nguyên, các tài nguyên này sẽ được nhóm trong tệp jar cùng với các tệp .class thông thường được tạo bằng quá trình biên dịch. 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 tìm bố cục thư mục tiêu chuẩn của Maven, (một thư mục "src" theo sau là một thư mục con của thư mục "resources"). Nếu không tìm thấy tài nguyên đó, Bazel sẽ tìm thư mục trên cùng có tên "java" hoặc "javatests" (chẳng hạn, nếu tài nguyên nằm tại <workspace root>/x/java/y/java/z, đường dẫn của tài nguyên sẽ là y/java/z. Phương pháp phỏng đoán này không thể bị ghi đè. 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; optional; default is False

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

Nếu một quy tắc sử dụng trình xử lý chú giải 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ã đã tạo nếu các thao tác biên dịch của những quy tắc đó được lên lịch sau quy tắc tạo. Thuộc tính này hướng dẫn Bazel giới thiệu các quy tắc ràng buộc về lập lịch khi bật --java_header_compilation.

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

javacopts

List of strings; optional

Các tuỳ chọn trình biên dịch bổ sung dành cho thư viện này. Có thể thay thế "Tạo biến"mã thông báo shell shell.

Các tuỳ chọn trình biên dịch này được chuyển đến javac sau các tuỳ chọn trình biên dịch chung.

Boolean; optional; default is False

Liệu thư viện này chỉ nên được dùng để biên dịch chứ không dùng 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ề những thư viện như vậy: API IDE cho trình bổ trợ IDE hoặc tools.jar cho mọi dịch vụ chạy trên JDK tiêu chuẩn.

Xin lưu ý rằng neverlink = 1 không ngăn trình biên dịch chèn 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 nội dung đó, như được Quy cách ngôn ngữ Java cho phép (ví dụ: Hằng số static final của String hoặ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 đó chỉ khác ở những vị trí mà JLS cấm trình biên dịch cùng dòng (và phải áp dụng cho mọi phiên bản JLS trong tương lai).

output_licenses

Licence type; optional

Xem common attributes
plugins

List of labels; optional

Các trình bổ trợ trình biên dịch Java để chạy vào thời gian 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. Thư viện cũng có thể kế thừa trình bổ trợ từ các phần phụ thuộc sử dụng exported_plugins. Các tài nguyên do trình bổ trợ tạo ra sẽ được đưa vào tệp chứa quy tắc này.
processor_class

String; optional

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

List of labels; optional

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

List of labels; optional

Ngừng sử dụng: Thay vào đó, hãy dùng java_import và phần phụ thuộc hoặc Runtime_deps.
resource_strip_prefix

String; optional

Tiền tố đường dẫn để xoá 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. Sẽ có lỗi khi tệp tài nguyên không nằm trong thư mục này. 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ụ: tệp nguồn ở stuff/java/foo/bar/a.txt sẽ được đặt ở foo/bar/a.txt.

java_runtime

java_runtime(name, srcs, compatible_with, deprecation, distribs, features, hermetic_srcs, java, java_home, lib_modules, licenses, restricted_to, tags, target_compatible_with, testonly, visibility)

Chỉ định cấu hình cho 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

Name; required

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

srcs

List of labels; optional

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

List of labels; optional

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

Label; optional

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

String; optional

Đường dẫn đến thư mục gốc của môi trường thời gian chạy. Phải thay thế biến"Make". Nếu đường dẫn này là tuyệt đối, thì quy tắc này biểu thị một môi trường thời gian chạy Java không mang tính hệ thống với một đường dẫn phổ biến. Trong trường hợp đó, thuộc tính srcsjava phải để trống.
lib_modules

Label; optional

Tệp lib/modules cần thiết cho việc triển khai khép kín.

java_toolchain

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_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ụ nào cần sử dụng thông qua đối số --java_toolchain. Thông thường, bạn không nên viết các loại quy tắc đó trừ khi bạn muốn điều chỉnh trình biên dịch Java.

Ví dụ

Một ví dụ đơn giản là:

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

Name; required

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

android_lint_data

List of labels; optional

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

List of strings; optional

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

List of strings; optional

Danh sách các đối số của Android Lint.
android_lint_package_configuration

List of labels; optional

Cấu hình tìm lỗi mã nguồn Android sẽ được áp dụng cho các nhóm gói đã chỉ định.
android_lint_runner

Label; optional

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

List of labels; optional

Các mục nhập đường dẫn khởi động đích của Java. Tương ứng với cờ -bootclasspath của javac.
deps_checker

List of labels; optional

Nhãn của vùng triển khai ImportDepsChecker.
forcibly_disable_header_compilation

Boolean; optional; default is False

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

List of labels; required

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

List of labels; optional

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

List of labels; optional

Nhãn không bắt buộc của trình biên dịch tiêu đề, dùng cho các thao tác classpath trực tiếp không bao gồm bất kỳ trình xử lý chú giải tạo API nào.

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

ijar

List of labels; required

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

Label; optional

Nhãn của nhóm triển khai JacocoCoverageRunner.
java_runtime

Label; required

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

List of labels; required

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

List of labels; optional

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

List of strings; optional

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

Boolean; optional; default is True

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

Boolean; optional; default is 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 hỗ trợ.
javacopts

List of strings; optional

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

List of strings; optional

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ể sử dụng cho tuỳ chọn này.
oneversion

Label; optional

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

Label; optional

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

List of labels; optional

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

Label; optional; default is @bazel_tools//tools/jdk:proguard_whitelister

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

List of labels; optional

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

List of labels; required

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

String; optional

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

String; optional

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

Label; optional

Nhãn của nhóm 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 phần phụ thuộc thời gian chạy ngầm của tất cả các quy tắc java_binary.
tools

List of labels; optional

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

List of labels; optional

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

List of strings; optional

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

List of strings; optional

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