Quy tắc Java

Báo cáo sự cố Xem nguồn

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)

Xây dựng kho lưu trữ Java ("tệp jar"), cùng với tập lệnh shell bao bọc có cùng tên với quy tắc. Tập lệnh shell 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 đó. Khi chạy tập lệnh shell bao bọc, mọi biến môi trường JAVABIN không trống sẽ được ưu tiên so với 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. 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: Tệp lưu trữ chứa các nguồn ("jar nguồn").
  • name_deploy.jar: 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 của bạn sẽ tạo một tệp jar độc lập với một 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. Việc sử dụng tập lệnh bao bọc đượ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 lựa 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 tìm thấy đã tìm kiếm classpath từ tập lệ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 chỉ số 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 của bạn, tất cả đều được liên kết với 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 tệp jar thu được trực tiếp như 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ừ trạng thái đóng bắc cầu của mục tiêu. Các đối tượng 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ó nhóm nguồn nào phù hợp.

Không cho phép thuộc tính deps trong quy tắc java_binary không có srcs; quy tắc nà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
)

Hãy thực hiện việc này:

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

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất cho mục tiêu này.


Bạn nên sử dụng tên của tệp nguồn làm điểm truy cập chính của ứng dụng (trừ tên đ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 được liên kết đến mục tiêu. Xem nhận xét chung về deps trong phần Các thuộc tính thông thường được xác định theo hầu hết các quy tắc xây dựng.
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 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 đượ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 tại đâ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 thích ứng hơn với những thay đổi trong tương lai: nếu sau này quy tắc đang tạo tạo ra các tệp khác, 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 đó không hoạt động.

Các tệp nguồn thuộc loại .srcjar đã được giải nén và biên dịch. (Quy tắc 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 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 classpath 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 một tệp Java.

Nếu bạn chỉ định tài nguyên, chúng 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 chuẩn của Maven, (một thư mục "src" theo sau là một nội dung 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, 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à []

ĐỪNG SỬ DỤNG PHƯƠNG Á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ợ các thư viện của bên thứ ba đòi hỏi tài nguyên của các thư viện đó phải được tìm thấy trên classpath chính xác là "myconfig.xml". Điều này chỉ được phép thực hiện trên tệp nhị phân chứ không phải trên 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, 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ợ mà một 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 classpath thời gian chạy (và vùng chứa 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 chuỗi; giá trị 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 cần thay thế "Tạo biến".
javacopts

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

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

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

jvm_flags

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

Danh sách cờ cần nhúng trong tập lệnh trình bao bọc được tạo để chạy tệp nhị phân này. Phải thay thế $(location)"Tạo biến"mã thông báo shell Bourne.

Tập lệ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 jar phụ thuộc) và gọi đúng trình thông dịch Java. Dòng lệnh do tập lệnh bao bọc tạo ra sẽ 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ố mà JVM dự định phân tích cú pháp phải được chỉ định 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 đầu ra của *_deploy.jar.

launcher

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

Hãy chỉ định một tệp nhị phân sẽ dùng để chạy chương trình Java của bạn thay vì chương trình bin/java thông thường có trong JDK. Mục tiêu phải là một cc_binary. Bạn có thể chỉ định mọi cc_binary triển khai API gọi Java 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 liên quan chỉ ảnh hưởng đến các mục tiêu java_binaryjava_test chưa không 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ỳ 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 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. Trình liên kết sẽ không xoá mã không sử dụng 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 sử dụng khỏi tệp nhị phân thu được. Điều này có nghĩa là mọi mã C++ chỉ được truy cập qua JNI sẽ không được liên kết trừ phi mục tiêu cc_library chỉ định alwayslink = 1.

Khi sử dụng bất kỳ trình chạy nào 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 các tài liệu chính về java_binary để biết thông tin chi tiết.

main_class

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

Tên 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 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 này có thể được biên dịch bằng 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 không có lớp, thì tệp nhị phân sẽ không hoạt động trong thời gian chạy; không cần kiểm tra thời gian tạo bản dựng.

plugins

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

Các trình bổ trợ trình biên dịch Java để chạy tại 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 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 sử dụng java_import và phần phụ thuộc hoặc Runtime_deps.
resource_strip_prefix

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

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. Đây là một 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 với gói Java của tệp nguồn. Ví dụ: tệp nguồn ở stuff/java/foo/bar/a.txt sẽ nằm ở foo/bar/a.txt.

runtime_deps

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

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, các thuộc tính này sẽ xuất hiện trên classpath thời gian chạy, nhưng không giống như vậy, không xuất hiện trên classpath 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 nên đượ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

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

Liệu có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Những giá trị sau đây có thể xuất hiện:
  • 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ể 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 truyền xuố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. Tính năng này giúp lưu kết quả bản dựng vào bộ nhớ đệm một cách hiệu quả.
  • 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ó dấu không được tạo lại trừ phi phần phụ thuộc thay đổi.

use_launcher

Boolean; mặc định là 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 liên quan sẽ bị bỏ qua đối với mục tiêu này.

use_testrunner

Boolean; mặc định là False

Sử dụng lớp com.google.testing.junit.runner.BazelTestRunner (theo mặc định) của trình chạy kiểm thử làm điểm truy cập chính cho 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 thuộc tính 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. Nhiều khả năng bạn sẽ không muốn làm việc này. Một mục đích sử dụng là dành cho các quy tắc AllTest được gọi bởi một quy tắc khác (ví dụ: để 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 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, add_exports, add_opens, 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, toolchains, 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 duy nhất 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 được liên kết đến mục tiêu. Hãy xem java_library.deps.
data

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

Danh sách các tệp cần thiết cho quy tắc này trong thời gian chạy.
add_exports

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

Cho phép thư viện này truy cập vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-exports=.

add_opens

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

Cho phép thư viện này truy cập phản ánh vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-opens=.

constraints

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

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

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

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

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

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

Boolean; 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ư thế này: API IDE cho các 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

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

Các tệp được dùng làm thông số kỹ thuật Proguard. Phần này sẽ mô tả tập hợp thông số mà Proguard sử dụng. Nếu được chỉ định, chúng 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 ở đây chỉ được chứa các quy tắc không thay đổi giá trị, cụ thể là -dontnote, -dontwarn, assumenosideeffects 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 phi tự động học.
runtime_deps

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

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. Hã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, add_exports, add_opens, bootclasspath, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exported_plugins, exports, features, javabuilder_jvm_flags, javacopts, licenses, neverlink, plugins, proguard_specs, resource_strip_prefix, restricted_to, runtime_deps, tags, target_compatible_with, testonly, toolchains, 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.

Kết quả đầu ra ngầm

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

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất 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 nhận xét chung về deps tại mục Các thuộc tính thông thường được xác định theo hầu hết các quy tắc xây dựng.

Các tệp jar được tạo theo quy tắc java_library được 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. Ngoài ra, 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 cũng như classpath 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 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 đượ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 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 nhau 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.

Các tệp nguồn thuộc loại .srcjar đã được giải nén và biên dịch. (Việc 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 ra bất kỳ tệp nào nêu trên, thì các quy tắc đó sẽ được sử dụng theo cách tương tự như mô tả cho tệp nguồn.

Tệp nguồn thuộc loại .properties được coi là tài nguyên.

Tất cả các tệp khác sẽ bị bỏ qua, miễn là có ít nhất một tệp thuộc loại tệp như mô tả ở trên. Nếu không, lỗi sẽ xảy ra.

Đối số này hầu như luôn bắt buộc, ngoại trừ trường hợp 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 nhận xét chung về data tại mục Các thuộc tính thông thường được xác định theo hầu hết các quy tắc xây dựng.

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

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 một tệp Java.

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

Nếu bạn chỉ định tài nguyên, chúng 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 chuẩn của Maven, (một thư mục "src" theo sau là một thư mục "tài nguyên" nội dung). 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). 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.

add_exports

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

Cho phép thư viện này truy cập vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-exports=.

add_opens

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

Cho phép thư viện này truy cập phản ánh vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-opens=.

bootclasspath

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

API bị hạn chế, không sử dụng!
exported_plugins

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

Danh sách các java_plugin (ví dụ: trình xử lý chú giải) để 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 bất kỳ thư viện nào phụ thuộc trực tiếp vào thư viện này, giống như khi 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à []

Các thư viện đã xuất.

Quy tắc liệt kê ở đây sẽ cung cấp các quy tắc đó cho quy tắc mẹ, như thể 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 vào mã trong Y nếu giữa các quy tắc này có 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ạ đ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 việc đó, A phải khai báo C trong deps, hoặc B có thể giúp A (và bất kỳ điều gì 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 (B).

Tất cả các quy tắc mẹ trực tiếp đều có thể đóng 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, cũng như xuất C nhưng không phụ thuộc vào D. Bây giờ, 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, thì C' và D' thì A chỉ có thể truy cập vào C' mà không truy cập được 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. Theo ví dụ trước, nếu B xuất dữ liệu C và cũng muốn sử dụng cả C, thì trường đó cũng phải liệt kê trong deps của chính nó.

javabuilder_jvm_flags

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

API bị hạn chế, không sử dụng!
javacopts

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

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

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

Boolean; mặc định là False

Liệu thư viện này có nên chỉ được sử dụng để biên dịch chứ không phải trong thời gian chạy hay không. 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 các trình bổ trợ IDE hoặc tools.jar cho mọi dịch vụ 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 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 trình biên dịch, như được Bản đặc tả ngôn ngữ Java cho phép (ví dụ: Hằng số static final của String hoặc của kiểu gốc). Do đó, trường hợp sử dụng ưu tiên là khi thư viện thời gian chạy giống 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 vị trí mà JLS cấm trình biên dịch cùng dòng (và thư viện đó phải áp dụng cho mọi phiên bản JLS trong tương lai).

plugins

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

Các trình bổ trợ trình biên dịch Java để chạy tại 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 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 được dùng làm thông số kỹ thuật Proguard. Phần này sẽ mô tả tập hợp thông số mà Proguard sử dụng. Nếu được chỉ định, chúng 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 ở đây chỉ được chứa các quy tắc không thay đổi giá trị, cụ thể là -dontnote, -dontwarn, assumenosideeffects 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 phi tự động học.
resource_strip_prefix

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

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. Đây là một 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 với gói tệp nguồn Java. Ví dụ: tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm ở foo/bar/a.txt.

runtime_deps

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

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, các biến này sẽ xuất hiện trên classpath thời gian chạy, nhưng không giống như vậy, không xuất hiện trên classpath 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 nên đượ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

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

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

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

Ví dụ:


java_library(
    name = "lib",
    runtime_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 duy nhất 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 cần tạo mã Java.

java_proto_library

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

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

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

Ví dụ:


java_library(
    name = "lib",
    runtime_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 duy nhất 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 cần tạo mã Java.

java_test

Xem nguồn quy tắc
java_test(name, deps, srcs, data, resources, add_exports, add_opens, args, bootclasspath, 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, neverlink, plugins, 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 đang đượ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: Một kho lưu trữ Java phù hợp để triển khai. (Chỉ được xây dựng nếu 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.

Hãy xem phần về đối số java_binary(). Quy tắc này cũng hỗ trợ tất 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 duy nhất 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 được liên kết đến mục tiêu. Xem nhận xét chung về deps tại mục Các thuộc tính thông thường được xác định theo hầu hết các quy tắc xây dựng.
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 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 đượ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 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 nhau 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.

Các tệp nguồn thuộc loại .srcjar đã được giải nén và biên dịch. (Việc 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 ra bất kỳ tệp nào nêu trên, thì các quy tắc đó sẽ được sử dụng theo cách tương tự như mô tả cho 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 classpath 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 nhận xét chung về data tại mục Các thuộc tính thông thường được xác định theo hầu hết các quy tắc xây dựng.
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 một tệp Java.

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

Nếu bạn chỉ định tài nguyên, chúng 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 chuẩn của Maven, (một thư mục "src" theo sau là một thư mục "tài nguyên" nội dung). 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). 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.

add_exports

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

Cho phép thư viện này truy cập vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-exports=.

add_opens

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

Cho phép thư viện này truy cập phản ánh vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-opens=.

bootclasspath

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

API bị hạn chế, không sử dụng!
classpath_resources

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

ĐỪNG SỬ DỤNG PHƯƠNG Á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ợ các thư viện của bên thứ ba đòi hỏi tài nguyên của các thư viện đó phải được tìm thấy trên classpath chính xác là "myconfig.xml". Điều này chỉ được phép trên tệp nhị phân chứ không phải thư viện, do nguy cơ xung đột không gian tên.

create_executable

Boolean; mặc định là True

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

Danh sách chuỗi; giá trị 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 cần thay thế "Tạo biến".
javacopts

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

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

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

jvm_flags

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

Danh sách cờ cần nhúng trong tập lệnh trình bao bọc được tạo để chạy tệp nhị phân này. Có thể thay thế $(location)"Tạo biến"mã thông báo mã shell Bourne.

Tập lệ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 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 bao bọc tạo ra sẽ bao gồm tên của lớp chính, theo sau là "$@" để bạn có thể chuyển các đối số khác sau tên lớp. Tuy nhiên, các đối số mà JVM dự định phân tích cú pháp phải được chỉ định 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ê.

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

launcher

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

Chỉ định một tệp nhị phân sẽ dùng để chạy chương trình Java của bạn thay vì chương trình bin/java thông thường có trong JDK. Mục tiêu phải là một 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 liên quan chỉ ảnh hưởng đến các mục tiêu java_binaryjava_test chưa không 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 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 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. Trình liên kết sẽ không xoá mã không sử dụng 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, thì 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à mọi mã C++ chỉ được truy cập qua JNI trừ phi mục tiêu cc_library chỉ định alwayslink = 1.

Khi sử dụng bất kỳ trình chạy nào 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 các tài liệu chính về java_binary để biết thông tin chi tiết.

main_class

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

Tên 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 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 này có thể được biên dịch bằng 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 không có lớp, thì tệp nhị phân sẽ không hoạt động trong thời gian chạy; không cần kiểm tra thời gian tạo bản dựng.

Boolean; mặc định là False

plugins

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

Các trình bổ trợ trình biên dịch Java để chạy tại 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 kết quả của quy tắc này.
resource_strip_prefix

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

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. Đây là một 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 với gói tệp nguồn Java. Ví dụ: tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm ở foo/bar/a.txt.

runtime_deps

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

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, các biến này sẽ xuất hiện trên classpath thời gian chạy, nhưng không giống như vậy, không xuất hiện trên classpath 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 nên đượ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

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

Liệu có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Những giá trị sau đây có thể xuất hiện:
  • 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ể 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 truyền xuố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. Tính năng này giúp lưu kết quả bản dựng vào bộ nhớ đệm một cách hiệu quả.
  • 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ó dấu không được tạo lại trừ phi phần phụ thuộc thay đổi.

test_class

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

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à các đối số kiểm thử sẽ được sử dụng. 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 đối số này bị bỏ qua, đối số này sẽ được suy ra bằng cách sử dụng name của mục tiêu và đường dẫn tương đối gốc-gốc của đối số đó. Nếu chương trình 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 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 tĩnh suite() công khai trả về junit.framework.Test (hoặc lớp con của Test). Đối với JUnit4, lớp 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 thuộc tính đó thay đổi trong từng trường hợp, chẳng hạn như chạy một tập hợp con khác của 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; mặc định là 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, 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; mặc định là True

Sử dụng lớp trình chạy kiểm thử (theo mặc định) 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 một giá trị của bazel.test_suite thuộc tính hệ thống.
Bạn có thể dùng hành vi 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 dùng hành vi này cho các quy tắc java_binary. Không chắc bạn sẽ muốn làm điều này. Một mục đích sử dụng là cho các quy tắc AllTest được gọi bởi một quy tắc khác (ví dụ: để 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 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, exec_compatible_with, exec_properties, features, javacopts, output_licenses, packages, restricted_to, tags, target_compatible_with, testonly, toolchains, 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ác 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 duy nhất 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 chuỗi; giá trị mặc định là []

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

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

packages

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

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

java_plugin

Xem nguồn quy tắc
java_plugin(name, deps, srcs, data, resources, add_exports, add_opens, bootclasspath, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, generates_api, javabuilder_jvm_flags, javacopts, licenses, neverlink, output_licenses, plugins, processor_class, proguard_specs, resource_strip_prefix, restricted_to, tags, target_compatible_with, testonly, toolchains, 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 các 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 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: Tệp lưu trữ Java.

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

Đối số

Thuộc tính
name

Tên; bắt buộc

Tên duy nhất 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 nhận xét chung về deps tại mục Các thuộc tính thông thường được xác định theo hầu hết các quy tắc xây dựng.

Các tệp jar được tạo theo quy tắc java_library được 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. Ngoài ra, 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 cũng như classpath 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 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 đượ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 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 nhau 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.

Các tệp nguồn thuộc loại .srcjar đã được giải nén và biên dịch. (Việc 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 ra bất kỳ tệp nào nêu trên, thì các quy tắc đó sẽ được sử dụng theo cách tương tự như mô tả cho tệp nguồn.

Tệp nguồn thuộc loại .properties được coi là tài nguyên.

Tất cả các tệp khác sẽ bị bỏ qua, miễn là có ít nhất một tệp thuộc loại tệp như mô tả ở trên. Nếu không, lỗi sẽ xảy ra.

Đối số này hầu như luôn bắt buộc, ngoại trừ trường hợp 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 nhận xét chung về data tại mục Các thuộc tính thông thường được xác định theo hầu hết các quy tắc xây dựng.

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

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 một tệp Java.

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

Nếu bạn chỉ định tài nguyên, chúng 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 chuẩn của Maven, (một thư mục "src" theo sau là một thư mục "tài nguyên" nội dung). 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). 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.

add_exports

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

Cho phép thư viện này truy cập vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-exports=.

add_opens

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

Cho phép thư viện này truy cập phản ánh vào module hoặc package đã cho.

Điều này tương ứng với các cờ javac và JVM --add-opens=.

bootclasspath

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

API bị hạn chế, không sử dụng!
generates_api

Boolean; mặc định là 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 đang tạo API, thì các quy tắc khác tuỳ thuộc vào trình xử lý đó chỉ có thể tham chiếu đến mã đã tạo nếu các thao tác biên dịch của các 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ề việc 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 nếu cần.

javabuilder_jvm_flags

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

API bị hạn chế, không sử dụng!
javacopts

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

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

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

Boolean; mặc định là False

Liệu thư viện này có nên chỉ được sử dụng để biên dịch chứ không phải trong thời gian chạy hay không. 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 các trình bổ trợ IDE hoặc tools.jar cho mọi dịch vụ 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 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 trình biên dịch, như được Bản đặc tả ngôn ngữ Java cho phép (ví dụ: Hằng số static final của String hoặc của kiểu gốc). Do đó, trường hợp sử dụng ưu tiên là khi thư viện thời gian chạy giống 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 vị trí mà JLS cấm trình biên dịch cùng dòng (và thư viện đó phải áp dụng cho mọi phiên bản JLS trong tương lai).

output_licenses

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

plugins

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

Các trình bổ trợ trình biên dịch Java để chạy tại 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 kết quả của quy tắc này.
processor_class

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

Lớp trình xử lý là kiểu lớp đủ điều kiện mà trình biên dịch Java sẽ sử dụng làm điểm truy cập tới 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 cho 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 (Trình bổ trợ Error Prone) tải từ đường dẫn của 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 được dùng làm thông số kỹ thuật Proguard. Phần này sẽ mô tả tập hợp thông số mà Proguard sử dụng. Nếu được chỉ định, chúng 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 ở đây chỉ được chứa các quy tắc không thay đổi giá trị, cụ thể là -dontnote, -dontwarn, assumenosideeffects 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 phi tự động học.
resource_strip_prefix

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

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. Đây là một 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 với gói tệp nguồn Java. Ví dụ: tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm ở foo/bar/a.txt.

java_runtime

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

Chỉ định cấu hình cho một môi trường 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 duy nhất cho mục tiêu này.

srcs

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

Tất 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 ẩn danh. Khi tính năng Hermetic được bật cho một 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 tệp JAR triển khai khép kín.
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.
hermetic_static_libs

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

Các thư viện được liên kết tĩnh với trình chạy để 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; mặc định là ""

Đường dẫn đến thư mục gốc của môi trường thời gian chạy. Có thể 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 ẩn lý 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_ct_sym

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

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

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

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

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

version

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

Phiên bản tính năng của môi trường 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_javacopts, compatible_with, deprecation, deps_checker, distribs, exec_compatible_with, exec_properties, features, forcibly_disable_header_compilation, genclass, header_compiler, header_compiler_builtin_processors, header_compiler_direct, ijar, jacocorunner, java_runtime, javabuilder, javabuilder_data, javabuilder_jvm_opts, javac_supports_multiplex_workers, javac_supports_worker_cancellation, javac_supports_worker_multiplex_sandboxing, javac_supports_workers, javacopts, jspecify_implicit_deps, jspecify_javacopts, jspecify_packages, jspecify_processor, jspecify_processor_class, jspecify_stubs, jvm_opts, licenses, misc, oneversion, oneversion_allowlist_for_tests, oneversion_whitelist, package_configuration, proguard_allowlister, reduced_classpath_incompatible_processors, restricted_to, singlejar, source_version, tags, target_compatible_with, target_version, testonly, timezone_data, toolchains, 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 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ừ 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 duy nhất 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ó thể dùng để mở rộng nhãn trong android_lint_jvm_opts.
android_lint_jvm_opts

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

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

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

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

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

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

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

Nhãn của trình chạy trình tìm lỗi mã nguồn Android, nếu có.
bootclasspath

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

Các mục nhập đường dẫn lớp khởi động mục tiêu Java. Tương ứng với cờ -bootclasspath của javac.
compatible_javacopts

null; default is {}

API nội bộ, không được sử dụng!
deps_checker

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

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

Boolean; mặc định là 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

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

Nhãn của vùng triển khai GenClass.
header_compiler

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

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

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

API nội bộ, không được sử dụng!
header_compiler_direct

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

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 nào tạo API.

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

ijar

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

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

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

Nhãn về tệp triển khai JacocoCoverageRunner.
java_runtime

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

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

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

Nhãn của khu vực triển khai JavaBuilder.
javabuilder_data

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

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

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

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

Boolean; mặc định là True

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

Boolean; mặc định là True

"True" nếu JavaBuilder hỗ trợ huỷ trình thực thi liên tục, "false" nếu không hỗ trợ huỷ.
javac_supports_worker_multiplex_sandboxing

Boolean; mặc định là False

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

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

Danh sách chuỗi; giá trị 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ó.
jspecify_implicit_deps

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

Đang thử nghiệm, đừng sử dụng!
jspecify_javacopts

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

Đang thử nghiệm, không sử dụng!
jspecify_packages

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

Đang thử nghiệm, không sử dụng!
jspecify_processor

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

Đang thử nghiệm, không sử dụng!
jspecify_processor_class

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

Đang thử nghiệm, đừng sử dụng!
jspecify_stubs

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

Đang thử nghiệm, đừng sử dụng!
jvm_opts

Danh sách chuỗi; giá trị 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ể dùng cho tuỳ chọn này.
misc

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

Không dùng nữa: thay vào đó, hãy dùng javacopts
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 sử dụng một phiên bản cho các kiểm thử.
oneversion_whitelist

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

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

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

Cấu hình sẽ đượ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.
reduced_classpath_incompatible_processors

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

API nội bộ, không được sử dụng!
singlejar

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

Nhãn của ngăn triển khai SingleJar.
source_version

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

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

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

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

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

Nhãn của ngăn 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

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

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

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

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

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

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

Danh sách chuỗi; giá trị 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. Hãy dùng dấu gạch ngang phía trước để xoá nó. Vui lòng xem tài liệu Javac về các tuỳ chọn -Xlint để biết thêm thông tin.