กฎ Java

กฎ

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)

สร้างที่เก็บถาวรของ Java ("ไฟล์ jar") และสคริปต์เชลล์ Wrapper ที่มีชื่อเดียวกับกฎ สคริปต์ Shell Wrapper จะใช้คลาสพาธซึ่งรวมไฟล์ Jar สำหรับไลบรารีแต่ละไลบรารีที่ไบนารีอ้างอิงอยู่

สคริปต์ Wrapper ยอมรับแฟล็กที่ไม่ซ้ำกันหลายรายการ โปรดดู //src/main/java/com/google/devtools/build/lib/bazel/rules/java/java_stub_template.txt สำหรับรายการแฟล็กที่กำหนดค่าได้และตัวแปรสภาพแวดล้อมที่ Wrapper ยอมรับ

เป้าหมายเอาต์พุตโดยนัย

  • name.jar: ที่เก็บถาวรของ Java ที่มีไฟล์คลาสและทรัพยากรอื่นๆ ที่เกี่ยวข้องกับทรัพยากร Dependency โดยตรงของไบนารี
  • name-src.jar: ที่เก็บถาวรที่มีแหล่งที่มา ("jar แหล่งที่มา")
  • name_deploy.jar: ที่เก็บถาวรของ Java ที่เหมาะสำหรับการทำให้ใช้งานได้ (สร้างเมื่อมีการขออย่างชัดแจ้งเท่านั้น)

    การสร้างเป้าหมาย <name>_deploy.jar สำหรับกฎจะสร้างไฟล์ Jar แบบในตัวโดยมีไฟล์ Manifest ที่อนุญาตให้เรียกใช้ด้วยคำสั่ง java -jar หรือด้วยตัวเลือก --singlejar ของสคริปต์ Wrapper เราขอแนะนำให้ใช้สคริปต์ Wrapper สำหรับ java -jar เนื่องจากสคริปต์ดังกล่าวส่งแฟล็ก JVM และตัวเลือกในการโหลดไลบรารีเนทีฟด้วย

    Jar การทำให้ใช้งานได้มีคลาสทั้งหมดที่ตัวโหลดคลาสจะพบซึ่งค้นหาคลาสพาธจากสคริปต์ Wrapper ของไบนารีตั้งแต่ต้นจนจบ และยังมีไลบรารีเนทีฟที่จำเป็นสำหรับทรัพยากร Dependency ด้วย ซึ่งระบบจะโหลดข้อมูลเหล่านี้ลงใน JVM โดยอัตโนมัติระหว่างรันไทม์

    หากเป้าหมายระบุแอตทริบิวต์ Launcher _deploy.jar จะเป็นไบนารีเนทีฟแทนการเป็นไฟล์ JAR ปกติ ซึ่งจะมี Launcher รวมถึงทรัพยากร Dependency (C++) ของกฎทั้งหมด ซึ่งจะลิงก์กับไบนารีแบบคงที่ ไบต์จริงของไฟล์ jar จะต่อท้ายไบนารีดั้งเดิมนั้น เพื่อสร้าง Blob ของไบนารีหนึ่งที่มีทั้งไฟล์ปฏิบัติการและโค้ด Java คุณเรียกใช้ไฟล์ Jar ที่ได้ได้โดยตรงเหมือนที่ทำกับไบนารีเนทีฟ

  • name_deploy-src.jar: ที่เก็บถาวรซึ่งมีแหล่งที่มาที่รวบรวมจากการปิดเป้าหมายแบบชั่วคราว รายการเหล่านี้จะตรงกับคลาสใน deploy.jar ยกเว้นกรณีที่ Jars ไม่มี Jar ที่ตรงกัน

ไม่อนุญาตให้มีแอตทริบิวต์ deps ในกฎ java_binary ที่ไม่มี srcs กฎดังกล่าวจึงต้องใช้ main_class ที่ระบุโดย runtime_deps

ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นถึงข้อผิดพลาดที่พบบ่อย

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

ให้ดำเนินการนี้แทน

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

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้


แนวทางปฏิบัติที่ดีคือการใช้ชื่อไฟล์ต้นทางที่เป็นจุดแรกเข้าหลักของแอปพลิเคชัน (ลบนามสกุล) ตัวอย่างเช่น หากจุดแรกเข้าชื่อว่า Main.java ชื่อก็อาจเป็น Main
deps

List of labels; optional

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมาย ดูความคิดเห็นทั่วไปเกี่ยวกับ deps ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่
srcs

List of labels; optional

รายการไฟล์ต้นฉบับที่ประมวลผลเพื่อสร้างเป้าหมาย แอตทริบิวต์นี้จำเป็นเกือบทุกครั้ง โปรดดูข้อยกเว้นด้านล่าง

ไฟล์ต้นฉบับประเภท .java จะได้รับการคอมไพล์ ในกรณีของไฟล์ .java ที่สร้างขึ้น โดยทั่วไปแล้ว เราขอแนะนำให้ใส่ชื่อของกฎที่สร้างที่นี่แทนชื่อของไฟล์ การทำเช่นนี้ไม่เพียงช่วยให้อ่านง่ายขึ้นเท่านั้น แต่ยังทำให้กฎมีความยืดหยุ่นมากขึ้นต่อการเปลี่ยนแปลงในอนาคตด้วย หากกฎที่สร้างสร้างไฟล์อื่นในอนาคต คุณจะต้องแก้ไขเพียงที่เดียว นั่นคือ outs ของกฎที่สร้างขึ้น คุณไม่ควรแสดงรายการกฎที่สร้างใน deps เนื่องจากเป็นกฎที่ไม่มีการดำเนินการ

ไฟล์ต้นฉบับประเภท .srcjar จะถูกคลายการแพคและคอมไพล์แล้ว (ซึ่งจะเป็นประโยชน์หากต้องการสร้างชุดไฟล์ .java ที่มีกฎเกณฑ์)

กฎ: หากกฎ (โดยทั่วไปคือ genrule หรือ filegroup) สร้างไฟล์ใดๆ ที่ระบุไว้ด้านบน ระบบจะใช้ไฟล์ในลักษณะเดียวกับที่อธิบายไว้สำหรับไฟล์ต้นฉบับ

ระบบจำเป็นต้องใช้อาร์กิวเมนต์นี้เกือบทุกครั้ง ยกเว้นในกรณีที่แอตทริบิวต์ main_class ระบุคลาสในคลาสพาธรันไทม์หรือคุณระบุอาร์กิวเมนต์ runtime_deps

resources

List of labels; optional

รายการไฟล์ข้อมูลที่จะรวมใน Java jar

หากระบุทรัพยากรแล้ว ระบบจะรวมทรัพยากรเหล่านั้นไว้ใน Jar พร้อมกับไฟล์ .class ปกติที่สร้างจากการคอมไพล์ ตำแหน่งของทรัพยากรภายในไฟล์ Jar จะกำหนดโดยโครงสร้างโปรเจ็กต์ ก่อนอื่น Bazel จะมองหาเลย์เอาต์ไดเรกทอรีมาตรฐานของ Maven (ไดเรกทอรี "src" ตามด้วยไดเรกทอรี "resources" ย่อย) หากไม่พบค่านี้ Bazel จะมองหาไดเรกทอรีระดับบนสุดที่ชื่อ "java" หรือ "javatests" (เช่น หากทรัพยากรอยู่ที่ <workspace root>/x/java/y/java/z เส้นทางของทรัพยากรจะเป็น y/java/z ลบล้างฮิวริสติกนี้ไม่ได้ แต่จะใช้แอตทริบิวต์ resource_strip_prefix เพื่อระบุไดเรกทอรีทางเลือกที่เจาะจงสำหรับไฟล์ทรัพยากรได้

ทรัพยากรอาจเป็นไฟล์ต้นฉบับหรือไฟล์ที่สร้างขึ้น

classpath_resources

List of labels; optional

อย่าใช้ตัวเลือกนี้หากไม่มีวิธีอื่น)

รายการทรัพยากรที่ต้องอยู่ที่รากของแผนผัง Java แอตทริบิวต์นี้มีไว้เพื่อรองรับไลบรารีของบุคคลที่สามที่กำหนดให้ต้องค้นหาทรัพยากรในคลาสพาธให้เหมือนกับ "myconfig.xml" ทุกประการ แต่อนุญาตให้ใช้ในไบนารีเท่านั้น ไม่ใช่ไลบรารี เนื่องจากอันตรายจากข้อขัดแย้งของเนมสเปซ

create_executable

Boolean; optional; nonconfigurable; default is True

ไบนารีนี้สั่งการได้หรือไม่ ไบนารีที่เรียกใช้ไม่ได้จะรวบรวมทรัพยากร Dependency ของ Java สำหรับรันไทม์แบบทรานซิทีฟลงใน Jar การทำให้ใช้งานได้ แต่จะดำเนินการโดยตรงไม่ได้ ระบบจะไม่สร้างสคริปต์ Wrapper หากตั้งค่าแอตทริบิวต์นี้ไว้ หากตั้งค่าแอตทริบิวต์ launcher หรือ main_class ไว้ ข้อผิดพลาดจะต้องกำหนดค่าเป็น 0
deploy_env

List of labels; optional

รายการเป้าหมาย java_binary อื่นๆ ที่แสดงถึงสภาพแวดล้อม การทำให้ใช้งานได้สำหรับไบนารีนี้ ตั้งค่าแอตทริบิวต์นี้เมื่อสร้างปลั๊กอินซึ่ง java_binary อื่นจะโหลดปลั๊กอิน
การตั้งค่าแอตทริบิวต์นี้จะยกเว้นทรัพยากร Dependency ทั้งหมดจาก classpath รันไทม์ (และ jar การทำให้ใช้งานได้) ของไบนารีนี้ที่แชร์ระหว่างไบนารีนี้กับเป้าหมายที่ระบุใน deploy_env
deploy_manifest_lines

List of strings; optional

รายการบรรทัดที่จะเพิ่มลงในไฟล์ META-INF/manifest.mf ที่สร้างขึ้นสำหรับเป้าหมาย *_deploy.jar เนื้อหาของแอตทริบิวต์นี้ไม่อยู่ภายใต้การแทนที่ "สร้างตัวแปร"
javacopts

List of strings; optional

ตัวเลือกคอมไพเลอร์เพิ่มเติมสำหรับไลบรารีนี้ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง

jvm_flags

List of strings; optional

รายการแฟล็กที่จะฝังในสคริปต์ Wrapper ที่สร้างขึ้นสำหรับการเรียกใช้ไบนารีนี้ ขึ้นอยู่กับการแทนที่ $(location) และ "MakeVariable" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

สคริปต์ Wrapper สำหรับไบนารีของ Java มีคําจํากัดความ CLASSPATH (เพื่อค้นหา Jars ที่ขึ้นต่อกันทั้งหมด) และเรียกใช้อินเทอร์พรีเตอร์ Java ที่ถูกต้อง บรรทัดคำสั่งที่สร้างโดยสคริปต์ Wrapper จะมีชื่อของคลาสหลักตามด้วย "$@" เพื่อให้คุณส่งผ่านอาร์กิวเมนต์อื่นๆ หลังชื่อคลาสได้ อย่างไรก็ตาม คุณต้องระบุอาร์กิวเมนต์ที่มีไว้สำหรับการแยกวิเคราะห์โดย JVM ก่อนชื่อคลาสในบรรทัดคำสั่ง เนื้อหาของ jvm_flags จะเพิ่มไปยังสคริปต์ Wrapper ก่อนที่ชื่อคลาสจะแสดง

โปรดทราบว่าแอตทริบิวต์นี้ไม่มีผลกับเอาต์พุต *_deploy.jar

launcher

Label; optional

ระบุไบนารีที่จะใช้ในการเรียกใช้โปรแกรม Java แทนโปรแกรม bin/java ปกติที่รวมอยู่ใน JDK เป้าหมายต้องเป็น cc_binary คุณระบุ cc_binary ที่ใช้ Ja Invocation API เป็นค่าสำหรับแอตทริบิวต์นี้ได้

โดยค่าเริ่มต้น Bazel จะใช้ JDK Launcher ปกติ (bin/java หรือ java.exe)

แฟล็ก --java_launcher Bazel ที่เกี่ยวข้องจะมีผลเฉพาะกับเป้าหมาย java_binary และ java_test ที่ไม่ระบุแอตทริบิวต์ launcher

โปรดทราบว่าระบบจะสร้างทรัพยากร Dependency แบบเนทีฟ (C++, SWIG, JNI) ในลักษณะต่างๆ โดยขึ้นอยู่กับว่าคุณใช้ Launcher ของ JDK หรือ Launcher อื่นอยู่

  • หากคุณใช้ Launcher ของ JDK ปกติ (ค่าเริ่มต้น) ทรัพยากร Dependency แบบเนทีฟจะสร้างขึ้นเป็นไลบรารีที่ใช้ร่วมกันชื่อ {name}_nativedeps.so โดยที่ {name} คือแอตทริบิวต์ name ของกฎ java_binary นี้ ตัวลิงก์จะไม่นำโค้ดที่ไม่ได้ใช้ออกในการกำหนดค่านี้
  • หากคุณใช้ Launcher อื่นๆ ทรัพยากร Dependency แบบเนทีฟ (C++) จะลิงก์แบบคงที่กับไบนารีชื่อ {name}_nativedeps โดยที่ {name} คือแอตทริบิวต์ name ของกฎ java_binary นี้ ในกรณีนี้ Linker จะนำโค้ดที่คิดว่าไม่ได้ใช้จากไบนารีผลลัพธ์ออก ซึ่งหมายความว่าจะไม่มีการลิงก์โค้ด C++ ที่เข้าถึงผ่าน JNI เท่านั้นเว้นแต่เป้าหมาย cc_library จะระบุ alwayslink = 1

เมื่อใช้ Launcher อื่นๆ นอกเหนือจาก Launcher เริ่มต้น JDK รูปแบบของเอาต์พุต *_deploy.jar จะเปลี่ยนไป ดูรายละเอียดในเอกสาร java_binary หลัก

main_class

String; optional

ชื่อคลาสที่มีเมธอด main() เพื่อใช้เป็นจุดแรกเข้า หากกฎใช้ตัวเลือกนี้ กฎนั้นจะไม่จำเป็นต้องมีรายการ srcs=[...] ดังนั้นแอตทริบิวต์นี้จึงสร้างไฟล์สั่งการจากไลบรารี Java ที่มีเมธอด main() อย่างน้อย 1 รายการอยู่แล้วได้

ค่าของแอตทริบิวต์นี้เป็นชื่อคลาส ไม่ใช่ไฟล์ต้นฉบับ คลาสต้องพร้อมใช้งานขณะรันไทม์: อาจคอมไพล์โดยกฎนี้ (จาก srcs) หรือจัดเตรียมโดยทรัพยากร Dependency โดยตรงหรือแบบผกผัน (ผ่าน runtime_deps หรือ deps) หากคลาสไม่พร้อมใช้งาน ไบนารีจะล้มเหลวขณะรันไทม์ และไม่มีการตรวจสอบเวลาบิลด์

plugins

List of labels; optional

ปลั๊กอินของคอมไพเลอร์ Java ที่จะเรียกใช้ในเวลาคอมไพล์ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์นี้จะทำงานเมื่อมีการสร้างกฎนี้ ไลบรารีอาจรับค่าปลั๊กอินจากทรัพยากร Dependency ที่ใช้ exported_plugins ด้วย ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ใน Jar ที่เป็นผลลัพธ์ของกฎนี้
resource_jars

List of labels; optional

เลิกใช้งานแล้ว: ใช้ java_import และ deps หรือ session_deps แทน
resource_strip_prefix

String; optional

คำนำหน้าเส้นทางที่จะตัดจากทรัพยากร Java

หากระบุไว้ ระบบจะตัดคำนำหน้าเส้นทางออกจากทุกไฟล์ในแอตทริบิวต์ resources เกิดข้อผิดพลาดที่ไฟล์ทรัพยากรไม่อยู่ในไดเรกทอรีนี้ หากไม่ได้ระบุไว้ (ค่าเริ่มต้น) ระบบจะกำหนดเส้นทางของไฟล์ทรัพยากรตามตรรกะเดียวกันกับแพ็กเกจ Java ของไฟล์ต้นฉบับ เช่น ไฟล์ต้นฉบับที่ stuff/java/foo/bar/a.txt จะอยู่ที่ foo/bar/a.txt

runtime_deps

List of labels; optional

ไลบรารีให้พร้อมใช้งานสำหรับไบนารีสุดท้ายหรือทดสอบที่รันไทม์เท่านั้น คลาสพาธของรันไทม์เหมือนกับ deps ทั่วไป แต่จะไม่ปรากฏในคลาสพาธของเวลาคอมไพล์ ไม่เหมือนกับ deps ทรัพยากร Dependency ที่จำเป็นเฉพาะรันไทม์ควรแสดงรายการที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรไม่สนใจเป้าหมายที่ปรากฏในทั้ง runtime_deps และ deps
stamp

Integer; optional; default is -1

จะเข้ารหัสข้อมูลของบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับข้อมูลบิลด์ลงในไบนารีเสมอ แม้กระทั่งในบิลด์ --nostamp ควรหลีกเลี่ยงการตั้งค่านี้ เนื่องจากอาจกำจัดการแคชระยะไกลสำหรับไบนารีและการดำเนินการดาวน์สตรีมที่ต้องใช้การตั้งค่าดังกล่าว
  • stamp = 0: แทนที่ข้อมูลของบิลด์ด้วยค่าคงที่เสมอ ซึ่งทำให้มีการแคชผลลัพธ์ของบิลด์ที่ดี
  • stamp = -1: การฝังข้อมูลของบิลด์จะควบคุมโดยแฟล็ก --[no]stamp

ระบบจะไม่สร้างไบนารีที่ประทับตราขึ้นมาใหม่เว้นแต่มีการเปลี่ยนแปลงทรัพยากร Dependency

use_launcher

Boolean; optional; default is True

ไบนารีควรใช้ Launcher ที่กำหนดเองหรือไม่

หากตั้งค่าแอตทริบิวต์นี้เป็น "เท็จ" ระบบจะละเว้นแอตทริบิวต์ Launcher และแฟล็ก --java_launcher ที่เกี่ยวข้องสำหรับเป้าหมายนี้

use_testrunner

Boolean; optional; default is False

ใช้คลาสตัวดำเนินการทดสอบ (โดยค่าเริ่มต้น com.google.testing.junit.runner.BazelTestRunner) เป็นจุดแรกเข้าหลักสำหรับโปรแกรม Java และระบุคลาสการทดสอบให้กับตัวดำเนินการทดสอบเป็นค่าของพร็อพเพอร์ตี้ระบบ bazel.test_suite คุณใช้ตัวเลือกนี้เพื่อลบล้างลักษณะการทำงานเริ่มต้นได้ ซึ่งก็คือการใช้ตัวดำเนินการทดสอบสำหรับกฎ java_test และไม่ใช้กับกฎ java_binary คุณไม่น่าจะต้องการดำเนินการนี้ การใช้งานแบบหนึ่งมีไว้สำหรับกฎ AllTest ที่จะเรียกใช้โดยกฎอื่น (เช่น เพื่อตั้งค่าฐานข้อมูลก่อนเรียกใช้การทดสอบ) คุณต้องประกาศกฎ AllTest เป็น java_binary แต่ยังคงใช้ตัวดำเนินการทดสอบเป็นจุดแรกเข้าหลัก คุณลบล้างชื่อของคลาสตัวดำเนินการทดสอบได้ด้วยแอตทริบิวต์ 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)

กฎนี้อนุญาตให้ใช้ไฟล์ .jar ที่คอมไพล์ไว้ล่วงหน้าเป็นไลบรารีสำหรับกฎ java_library และ java_binary

ตัวอย่าง

    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",
        ],
    )

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมาย โปรดดู java_library.deps
constraints

List of strings; optional; nonconfigurable

ข้อจำกัดเพิ่มเติมที่กำหนดไว้ในกฎนี้ในฐานะไลบรารี Java
exports

List of labels; optional

เป้าหมายเพื่อให้ผู้ใช้ของกฎนี้ใช้ได้ โปรดดู java_library.exports
jars

List of labels; required

รายการไฟล์ JAR ที่ระบุให้กับเป้าหมาย Java ที่อ้างอิงเป้าหมายนี้

Boolean; optional; default is False

ใช้ไลบรารีนี้สำหรับการคอมไพล์เท่านั้น ไม่ใช่ระหว่างรันไทม์ มีประโยชน์หากสภาพแวดล้อมรันไทม์จะจัดเตรียมไลบรารีไว้ให้ระหว่างการดำเนินการ ตัวอย่างของไลบรารีลักษณะนี้คือ IDE API สำหรับปลั๊กอิน IDE หรือ tools.jar สำหรับอะไรก็ตามที่ทำงานบน JDK มาตรฐาน
proguard_specs

List of labels; optional

ไฟล์ที่จะใช้เป็นข้อมูลจำเพาะของ Proguard ซึ่งจะอธิบายถึงชุดข้อกำหนดที่ Proguard ใช้งาน หากระบุ ระบบจะเพิ่มกลุ่มเป้าหมายนี้ลงในเป้าหมาย android_binary ใดก็ตาม ทั้งนี้ขึ้นอยู่กับไลบรารีนี้ ไฟล์ที่ระบุไว้ที่นี่ต้องมีเฉพาะกฎแบบ ID เท่านั้น ได้แก่ -dontnote, -dontwarn, summarynosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏใน Proguard_specs ของ android_binary เท่านั้นเพื่อให้แน่ใจว่ามีการผสานที่ไม่ใช่แบบโทโลจี
runtime_deps

List of labels; optional

ไลบรารีให้พร้อมใช้งานสำหรับไบนารีสุดท้ายหรือทดสอบที่รันไทม์เท่านั้น โปรดดู java_library.runtime_deps
srcjar

Label; optional

ไฟล์ JAR ที่มีซอร์สโค้ดสำหรับไฟล์ JAR ที่คอมไพล์แล้ว

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)

กฎนี้จะรวบรวมและลิงก์แหล่งที่มากับไฟล์ .jar

เป้าหมายเอาต์พุตโดยนัย

  • libname.jar: ที่เก็บถาวรของ Java ที่มีไฟล์คลาส
  • libname-src.jar: ที่เก็บถาวรที่มีแหล่งที่มา ("jar แหล่งที่มา")

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายชื่อไลบรารีที่จะลิงก์เข้าสู่ไลบรารีนี้ ดูความคิดเห็นทั่วไปเกี่ยวกับ deps ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่

Jars ที่สร้างขึ้นโดยกฎ java_library ที่แสดงอยู่ใน deps จะอยู่ใน คลาสพาธเวลาคอมไพล์ของกฎนี้ นอกจากนี้ การปิดชั่วคราวของ deps, runtime_deps และ exports จะอยู่ในคลาสพาธรันไทม์

ในทางตรงกันข้าม เป้าหมายในแอตทริบิวต์ data จะรวมอยู่ใน Runfiles แต่ไม่อยู่ในคลาสพาธเวลาคอมไพล์หรือคลาสรันไทม์

srcs

List of labels; optional

รายการไฟล์ต้นฉบับที่ประมวลผลเพื่อสร้างเป้าหมาย แอตทริบิวต์นี้จำเป็นเกือบทุกครั้ง โปรดดูข้อยกเว้นด้านล่าง

ไฟล์ต้นฉบับประเภท .java จะได้รับการคอมไพล์ ในกรณีของไฟล์ .java ที่สร้างขึ้น โดยทั่วไปแล้ว เราขอแนะนำให้ใส่ชื่อของกฎที่สร้างที่นี่แทนชื่อของไฟล์ การทำเช่นนี้ไม่เพียงช่วยให้อ่านง่ายขึ้นเท่านั้น แต่ยังทำให้กฎมีความยืดหยุ่นมากขึ้นต่อการเปลี่ยนแปลงในอนาคตด้วย หากกฎที่สร้างสร้างไฟล์อื่นในอนาคต คุณจะต้องแก้ไขเพียงที่เดียว นั่นคือ outs ของกฎที่สร้างขึ้น คุณไม่ควรแสดงรายการกฎที่สร้างใน deps เนื่องจากเป็นกฎที่ไม่มีการดำเนินการ

ไฟล์ต้นฉบับประเภท .srcjar จะถูกคลายการแพคและคอมไพล์แล้ว (ซึ่งจะเป็นประโยชน์หากต้องการสร้างชุดไฟล์ .java ที่มีกฎเกณฑ์)

กฎ: หากกฎ (โดยทั่วไปคือ genrule หรือ filegroup) สร้างไฟล์ใดๆ ที่ระบุไว้ด้านบน ระบบจะใช้ไฟล์ในลักษณะเดียวกับที่อธิบายไว้สำหรับไฟล์ต้นฉบับ

ระบบจำเป็นต้องใช้อาร์กิวเมนต์นี้เกือบทุกครั้ง ยกเว้นในกรณีที่แอตทริบิวต์ main_class ระบุคลาสในคลาสพาธรันไทม์หรือคุณระบุอาร์กิวเมนต์ runtime_deps

data

List of labels; optional

รายการไฟล์ที่ไลบรารีนี้ต้องการในระหว่างรันไทม์ ดูความคิดเห็นทั่วไปเกี่ยวกับ data ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่

เมื่อสร้าง java_library Bazel จะไม่วางไฟล์เหล่านี้ไว้ที่ใดที่หนึ่ง หากสร้างไฟล์ data ไฟล์ไว้ Bazel จะสร้างไฟล์เหล่านั้น เมื่อสร้างการทดสอบที่ขึ้นอยู่กับ java_library Bazel นี้คัดลอกหรือลิงก์ไฟล์ data กับพื้นที่ Runfiles

resources

List of labels; optional

รายการไฟล์ข้อมูลที่จะรวมใน Java jar

หากระบุทรัพยากรแล้ว ระบบจะรวมทรัพยากรเหล่านั้นไว้ใน Jar พร้อมกับไฟล์ .class ปกติที่สร้างจากการคอมไพล์ ตำแหน่งของทรัพยากรภายในไฟล์ Jar จะกำหนดโดยโครงสร้างโปรเจ็กต์ ก่อนอื่น Bazel จะมองหาเลย์เอาต์ไดเรกทอรีมาตรฐานของ Maven (ไดเรกทอรี "src" ตามด้วยไดเรกทอรี "resources" ย่อย) หากไม่พบค่านี้ Bazel จะมองหาไดเรกทอรีระดับบนสุดที่ชื่อ "java" หรือ "javatests" (เช่น หากทรัพยากรอยู่ที่ <workspace root>/x/java/y/java/z เส้นทางของทรัพยากรจะเป็น y/java/z ลบล้างฮิวริสติกนี้ไม่ได้ แต่จะใช้แอตทริบิวต์ resource_strip_prefix เพื่อระบุไดเรกทอรีทางเลือกที่เจาะจงสำหรับไฟล์ทรัพยากรได้

ทรัพยากรอาจเป็นไฟล์ต้นฉบับหรือไฟล์ที่สร้างขึ้น

exported_plugins

List of labels; optional

รายการของ java_plugin (เช่น ตัวประมวลผลคำอธิบายประกอบ) ที่จะส่งออกไปยังไลบรารีที่ขึ้นอยู่กับไลบรารีนี้โดยตรง

ระบบจะใช้รายการ java_plugin ที่ระบุกับไลบรารีใดก็ตามที่ขึ้นอยู่กับไลบรารีนี้โดยตรง เหมือนกับว่าไลบรารีได้ประกาศป้ายกำกับเหล่านี้อย่างชัดเจนใน plugins

exports

List of labels; optional

ไลบรารีที่ส่งออก

กฎข้อมูลที่นี่จะทำให้กฎระดับบนสุดใช้งานได้ เหมือนกับว่ากฎระดับบนสุดนั้นจะขึ้นอยู่กับกฎเหล่านี้อย่างชัดแจ้ง กรณีนี้ไม่จริงสําหรับ deps ปกติ (ไม่ได้ส่งออก)

สรุป: กฎ X จะเข้าถึงโค้ดใน Y ได้หากมีเส้นทางทรัพยากร Dependency ระหว่างเส้นทางเหล่านั้นที่เริ่มต้นด้วยขอบ deps ตามด้วยขอบ exports 0 รายการขึ้นไป ลองดูตัวอย่างเพื่อแสดงให้เห็นสิ่งนี้

สมมติว่า A ขึ้นอยู่กับ B และ B ขึ้นอยู่กับ C ในกรณีนี้ C เป็นทรัพยากร Dependency แบบสกรรมของ A ดังนั้นการเปลี่ยนแหล่งที่มาของ C และการสร้าง A ใหม่จะเป็นการสร้างทุกสิ่งขึ้นใหม่อย่างถูกต้อง แต่ A จะใช้คลาสใน C ไม่ได้ หากต้องการให้เป็นเช่นนั้น A ต้องประกาศ C ใน deps หรือ B จะช่วยให้ A (และทุกอย่างที่อาจขึ้นอยู่กับ A) ง่ายขึ้นด้วยการประกาศ C ในแอตทริบิวต์ exports (B)

การปิดไลบรารีที่ส่งออกจะใช้ได้กับกฎระดับบนสุดโดยตรงทั้งหมด ใช้ตัวอย่างที่แตกต่างเล็กน้อย: A ขึ้นอยู่กับ B ส่วน B ขึ้นอยู่กับ C และ D รวมถึงส่งออก C ด้วย แต่ไม่ใช่ D ตอนนี้ A มีสิทธิ์เข้าถึง C แต่ไม่มีสิทธิ์เข้าถึง D ตอนนี้หาก C และ D ส่งออกไลบรารีบางรายการ C' และ D' ตามลำดับ A จะเข้าถึงได้เฉพาะ C' แต่จะไม่เข้าถึง D'

สำคัญ: กฎที่ส่งออกไม่ใช่ทรัพยากร Dependency ปกติ ตามตัวอย่างก่อนหน้านี้ หาก B ส่งออก C และต้องการใช้ C ด้วย ก็จะต้องระบุ deps ของตัวเองด้วย

javacopts

List of strings; optional

ตัวเลือกคอมไพเลอร์เพิ่มเติมสำหรับไลบรารีนี้ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง

Boolean; optional; default is False

ควรใช้ไลบรารีนี้สำหรับการคอมไพล์เท่านั้นและไม่ใช่ระหว่างรันไทม์หรือไม่ มีประโยชน์หากสภาพแวดล้อมรันไทม์จะจัดเตรียมไลบรารีไว้ให้ระหว่างการดำเนินการ ตัวอย่างของไลบรารีดังกล่าว ได้แก่ IDE API สำหรับปลั๊กอิน IDE หรือ tools.jar สำหรับอะไรก็ตามที่ทำงานบน JDK มาตรฐาน

โปรดทราบว่า neverlink = 1 ไม่ได้ป้องกันไม่ให้คอมไพเลอร์แทรกเนื้อหาจากไลบรารีนี้เป็นเป้าหมายการคอมไพล์ที่อ้างอิงเนื้อหา ตามที่ข้อกำหนดภาษาของ Java อนุญาต (เช่น ค่าคงที่ static final ของ String หรือของประเภทพื้นฐาน) ดังนั้นกรณีการใช้งานที่เหมาะสมจึงเป็นกรณีที่ไลบรารีรันไทม์เหมือนกับไลบรารีการคอมไพล์ทุกประการ

หากไลบรารีรันไทม์แตกต่างจากไลบรารีการคอมไพล์ คุณต้องตรวจสอบว่าไลบรารีนี้แตกต่างเฉพาะในตำแหน่งที่ JLS กำหนดให้คอมไพเลอร์ไม่สามารถแทรกในบรรทัด (และที่ต้องระงับสำหรับ JLS เวอร์ชันในอนาคตทั้งหมด)

plugins

List of labels; optional

ปลั๊กอินของคอมไพเลอร์ Java ที่จะเรียกใช้ในเวลาคอมไพล์ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์นี้จะทำงานเมื่อมีการสร้างกฎนี้ ไลบรารีอาจรับค่าปลั๊กอินจากทรัพยากร Dependency ที่ใช้ exported_plugins ด้วย ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ใน Jar ที่เป็นผลลัพธ์ของกฎนี้
proguard_specs

List of labels; optional

ไฟล์ที่จะใช้เป็นข้อมูลจำเพาะของ Proguard ซึ่งจะอธิบายถึงชุดข้อกำหนดที่ Proguard ใช้งาน หากระบุ ระบบจะเพิ่มกลุ่มเป้าหมายนี้ลงในเป้าหมาย android_binary ใดก็ตาม ทั้งนี้ขึ้นอยู่กับไลบรารีนี้ ไฟล์ที่ระบุไว้ที่นี่ต้องมีเฉพาะกฎแบบ ID เท่านั้น ได้แก่ -dontnote, -dontwarn, summarynosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏใน Proguard_specs ของ android_binary เท่านั้นเพื่อให้แน่ใจว่ามีการผสานที่ไม่ใช่แบบโทโลจี
resource_jars

List of labels; optional

เลิกใช้งานแล้ว: ใช้ java_import และ deps หรือ session_deps แทน
resource_strip_prefix

String; optional

คำนำหน้าเส้นทางที่จะตัดจากทรัพยากร Java

หากระบุไว้ ระบบจะตัดคำนำหน้าเส้นทางออกจากทุกไฟล์ในแอตทริบิวต์ resources เกิดข้อผิดพลาดที่ไฟล์ทรัพยากรไม่อยู่ในไดเรกทอรีนี้ หากไม่ได้ระบุไว้ (ค่าเริ่มต้น) ระบบจะกำหนดเส้นทางของไฟล์ทรัพยากรตามตรรกะเดียวกันกับแพ็กเกจ Java ของไฟล์ต้นฉบับ เช่น ไฟล์ต้นฉบับที่ stuff/java/foo/bar/a.txt จะอยู่ที่ foo/bar/a.txt

runtime_deps

List of labels; optional

ไลบรารีให้พร้อมใช้งานสำหรับไบนารีสุดท้ายหรือทดสอบที่รันไทม์เท่านั้น คลาสพาธของรันไทม์เหมือนกับ deps ทั่วไป แต่จะไม่ปรากฏในคลาสพาธของเวลาคอมไพล์ ไม่เหมือนกับ deps ทรัพยากร Dependency ที่จำเป็นเฉพาะรันไทม์ควรแสดงรายการที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรไม่สนใจเป้าหมายที่ปรากฏในทั้ง runtime_deps และ deps

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 สร้างโค้ด Java จากไฟล์ .proto ไฟล์

deps ต้องชี้ไปที่กฎ proto_library

ตัวอย่าง

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

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

proto_library(
    name = "bar",
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการกฎ proto_library สำหรับสร้างโค้ด 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 สร้างโค้ด Java จากไฟล์ .proto ไฟล์

deps ต้องชี้ไปที่กฎ proto_library

ตัวอย่าง

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

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

proto_library(
    name = "foo_proto",
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการกฎ proto_library สำหรับสร้างโค้ด 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)

กฎ java_test() จะรวบรวมการทดสอบ Java การทดสอบคือ Wrapper แบบไบนารีรอบโค้ดทดสอบ ระบบจะเรียกใช้วิธีหลักของตัวดำเนินการทดสอบแทนคลาสหลักที่คอมไพล์

เป้าหมายเอาต์พุตโดยนัย

  • name.jar: ที่เก็บถาวรสำหรับ Java
  • name_deploy.jar: ที่เก็บถาวรของ Java ที่เหมาะสำหรับการทำให้ใช้งานได้ (สร้างเมื่อมีการขออย่างชัดแจ้งเท่านั้น) ดูรายละเอียดเพิ่มเติมได้จากคำอธิบายของเอาต์พุต name_deploy.jar จาก java_binary

ดูหัวข้อเกี่ยวกับอาร์กิวเมนต์ java_binary() กฎนี้ยังรองรับแอตทริบิวต์ทั้งหมดที่พบบ่อย สำหรับกฎการทดสอบทั้งหมด (*_test) ด้วย

ตัวอย่าง

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",
    ],
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมาย ดูความคิดเห็นทั่วไปเกี่ยวกับ deps ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่
srcs

List of labels; optional

รายการไฟล์ต้นฉบับที่ประมวลผลเพื่อสร้างเป้าหมาย แอตทริบิวต์นี้จำเป็นเกือบทุกครั้ง โปรดดูข้อยกเว้นด้านล่าง

ไฟล์ต้นฉบับประเภท .java จะได้รับการคอมไพล์ ในกรณีของไฟล์ .java ที่สร้างขึ้น โดยทั่วไปแล้ว เราขอแนะนำให้ใส่ชื่อของกฎที่สร้างที่นี่แทนชื่อของไฟล์ การทำเช่นนี้ไม่เพียงช่วยให้อ่านง่ายขึ้นเท่านั้น แต่ยังทำให้กฎมีความยืดหยุ่นมากขึ้นต่อการเปลี่ยนแปลงในอนาคตด้วย หากกฎที่สร้างสร้างไฟล์อื่นในอนาคต คุณจะต้องแก้ไขเพียงที่เดียว นั่นคือ outs ของกฎที่สร้างขึ้น คุณไม่ควรแสดงรายการกฎที่สร้างใน deps เนื่องจากเป็นกฎที่ไม่มีการดำเนินการ

ไฟล์ต้นฉบับประเภท .srcjar จะถูกคลายการแพคและคอมไพล์แล้ว (ซึ่งจะเป็นประโยชน์หากต้องการสร้างชุดไฟล์ .java ที่มีกฎเกณฑ์)

กฎ: หากกฎ (โดยทั่วไปคือ genrule หรือ filegroup) สร้างไฟล์ใดๆ ที่ระบุไว้ด้านบน ระบบจะใช้ไฟล์ในลักษณะเดียวกับที่อธิบายไว้สำหรับไฟล์ต้นฉบับ

ระบบจำเป็นต้องใช้อาร์กิวเมนต์นี้เกือบทุกครั้ง ยกเว้นในกรณีที่แอตทริบิวต์ main_class ระบุคลาสในคลาสพาธรันไทม์หรือคุณระบุอาร์กิวเมนต์ runtime_deps

resources

List of labels; optional

รายการไฟล์ข้อมูลที่จะรวมใน Java jar

หากระบุทรัพยากรแล้ว ระบบจะรวมทรัพยากรเหล่านั้นไว้ใน Jar พร้อมกับไฟล์ .class ปกติที่สร้างจากการคอมไพล์ ตำแหน่งของทรัพยากรภายในไฟล์ Jar จะกำหนดโดยโครงสร้างโปรเจ็กต์ ก่อนอื่น Bazel จะมองหาเลย์เอาต์ไดเรกทอรีมาตรฐานของ Maven (ไดเรกทอรี "src" ตามด้วยไดเรกทอรี "resources" ย่อย) หากไม่พบค่านี้ Bazel จะมองหาไดเรกทอรีระดับบนสุดที่ชื่อ "java" หรือ "javatests" (เช่น หากทรัพยากรอยู่ที่ <workspace root>/x/java/y/java/z เส้นทางของทรัพยากรจะเป็น y/java/z ลบล้างฮิวริสติกนี้ไม่ได้ แต่จะใช้แอตทริบิวต์ resource_strip_prefix เพื่อระบุไดเรกทอรีทางเลือกที่เจาะจงสำหรับไฟล์ทรัพยากรได้

ทรัพยากรอาจเป็นไฟล์ต้นฉบับหรือไฟล์ที่สร้างขึ้น

classpath_resources

List of labels; optional

อย่าใช้ตัวเลือกนี้หากไม่มีวิธีอื่น)

รายการทรัพยากรที่ต้องอยู่ที่รากของแผนผัง Java แอตทริบิวต์นี้มีไว้เพื่อรองรับไลบรารีของบุคคลที่สามที่กำหนดให้ต้องค้นหาทรัพยากรในคลาสพาธให้เหมือนกับ "myconfig.xml" ทุกประการ แต่อนุญาตให้ใช้ในไบนารีเท่านั้น ไม่ใช่ไลบรารี เนื่องจากอันตรายจากข้อขัดแย้งของเนมสเปซ

create_executable

Boolean; optional; nonconfigurable; default is True

ไบนารีนี้สั่งการได้หรือไม่ ไบนารีที่เรียกใช้ไม่ได้จะรวบรวมทรัพยากร Dependency ของ Java สำหรับรันไทม์แบบทรานซิทีฟลงใน Jar การทำให้ใช้งานได้ แต่จะดำเนินการโดยตรงไม่ได้ ระบบจะไม่สร้างสคริปต์ Wrapper หากตั้งค่าแอตทริบิวต์นี้ไว้ หากตั้งค่าแอตทริบิวต์ launcher หรือ main_class ไว้ ข้อผิดพลาดจะต้องกำหนดค่าเป็น 0
deploy_manifest_lines

List of strings; optional

รายการบรรทัดที่จะเพิ่มลงในไฟล์ META-INF/manifest.mf ที่สร้างขึ้นสำหรับเป้าหมาย *_deploy.jar เนื้อหาของแอตทริบิวต์นี้ไม่อยู่ภายใต้การแทนที่ "สร้างตัวแปร"
javacopts

List of strings; optional

ตัวเลือกคอมไพเลอร์เพิ่มเติมสำหรับไลบรารีนี้ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง

jvm_flags

List of strings; optional

รายการแฟล็กที่จะฝังในสคริปต์ Wrapper ที่สร้างขึ้นสำหรับการเรียกใช้ไบนารีนี้ ขึ้นอยู่กับการแทนที่ $(location) และ "MakeVariable" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

สคริปต์ Wrapper สำหรับไบนารีของ Java มีคําจํากัดความ CLASSPATH (เพื่อค้นหา Jars ที่ขึ้นต่อกันทั้งหมด) และเรียกใช้อินเทอร์พรีเตอร์ Java ที่ถูกต้อง บรรทัดคำสั่งที่สร้างโดยสคริปต์ Wrapper จะมีชื่อของคลาสหลักตามด้วย "$@" เพื่อให้คุณส่งผ่านอาร์กิวเมนต์อื่นๆ หลังชื่อคลาสได้ อย่างไรก็ตาม คุณต้องระบุอาร์กิวเมนต์ที่มีไว้สำหรับการแยกวิเคราะห์โดย JVM ก่อนชื่อคลาสในบรรทัดคำสั่ง เนื้อหาของ jvm_flags จะเพิ่มไปยังสคริปต์ Wrapper ก่อนที่ชื่อคลาสจะแสดง

โปรดทราบว่าแอตทริบิวต์นี้ไม่มีผลกับเอาต์พุต *_deploy.jar

launcher

Label; optional

ระบุไบนารีที่จะใช้ในการเรียกใช้โปรแกรม Java แทนโปรแกรม bin/java ปกติที่รวมอยู่ใน JDK เป้าหมายต้องเป็น cc_binary คุณระบุ cc_binary ที่ใช้ Ja Invocation API เป็นค่าสำหรับแอตทริบิวต์นี้ได้

โดยค่าเริ่มต้น Bazel จะใช้ JDK Launcher ปกติ (bin/java หรือ java.exe)

แฟล็ก --java_launcher Bazel ที่เกี่ยวข้องจะมีผลเฉพาะกับเป้าหมาย java_binary และ java_test ที่ไม่ระบุแอตทริบิวต์ launcher

โปรดทราบว่าระบบจะสร้างทรัพยากร Dependency แบบเนทีฟ (C++, SWIG, JNI) ในลักษณะต่างๆ โดยขึ้นอยู่กับว่าคุณใช้ Launcher ของ JDK หรือ Launcher อื่นอยู่

  • หากคุณใช้ Launcher ของ JDK ปกติ (ค่าเริ่มต้น) ทรัพยากร Dependency แบบเนทีฟจะสร้างขึ้นเป็นไลบรารีที่ใช้ร่วมกันชื่อ {name}_nativedeps.so โดยที่ {name} คือแอตทริบิวต์ name ของกฎ java_binary นี้ ตัวลิงก์จะไม่นำโค้ดที่ไม่ได้ใช้ออกในการกำหนดค่านี้
  • หากคุณใช้ Launcher อื่นๆ ทรัพยากร Dependency แบบเนทีฟ (C++) จะลิงก์แบบคงที่กับไบนารีชื่อ {name}_nativedeps โดยที่ {name} คือแอตทริบิวต์ name ของกฎ java_binary นี้ ในกรณีนี้ Linker จะนำโค้ดที่คิดว่าไม่ได้ใช้จากไบนารีผลลัพธ์ออก ซึ่งหมายความว่าจะไม่มีการลิงก์โค้ด C++ ที่เข้าถึงผ่าน JNI เท่านั้นเว้นแต่เป้าหมาย cc_library จะระบุ alwayslink = 1

เมื่อใช้ Launcher อื่นๆ นอกเหนือจาก Launcher เริ่มต้น JDK รูปแบบของเอาต์พุต *_deploy.jar จะเปลี่ยนไป ดูรายละเอียดในเอกสาร java_binary หลัก

main_class

String; optional

ชื่อคลาสที่มีเมธอด main() เพื่อใช้เป็นจุดแรกเข้า หากกฎใช้ตัวเลือกนี้ กฎนั้นจะไม่จำเป็นต้องมีรายการ srcs=[...] ดังนั้นแอตทริบิวต์นี้จึงสร้างไฟล์สั่งการจากไลบรารี Java ที่มีเมธอด main() อย่างน้อย 1 รายการอยู่แล้วได้

ค่าของแอตทริบิวต์นี้เป็นชื่อคลาส ไม่ใช่ไฟล์ต้นฉบับ คลาสต้องพร้อมใช้งานขณะรันไทม์: อาจคอมไพล์โดยกฎนี้ (จาก srcs) หรือจัดเตรียมโดยทรัพยากร Dependency โดยตรงหรือแบบผกผัน (ผ่าน runtime_deps หรือ deps) หากคลาสไม่พร้อมใช้งาน ไบนารีจะล้มเหลวขณะรันไทม์ และไม่มีการตรวจสอบเวลาบิลด์

plugins

List of labels; optional

ปลั๊กอินของคอมไพเลอร์ Java ที่จะเรียกใช้ในเวลาคอมไพล์ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์นี้จะทำงานเมื่อมีการสร้างกฎนี้ ไลบรารีอาจรับค่าปลั๊กอินจากทรัพยากร Dependency ที่ใช้ exported_plugins ด้วย ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ใน Jar ที่เป็นผลลัพธ์ของกฎนี้
resource_jars

List of labels; optional

เลิกใช้งานแล้ว: ใช้ java_import และ deps หรือ session_deps แทน
resource_strip_prefix

String; optional

คำนำหน้าเส้นทางที่จะตัดจากทรัพยากร Java

หากระบุไว้ ระบบจะตัดคำนำหน้าเส้นทางออกจากทุกไฟล์ในแอตทริบิวต์ resources เกิดข้อผิดพลาดที่ไฟล์ทรัพยากรไม่อยู่ในไดเรกทอรีนี้ หากไม่ได้ระบุไว้ (ค่าเริ่มต้น) ระบบจะกำหนดเส้นทางของไฟล์ทรัพยากรตามตรรกะเดียวกันกับแพ็กเกจ Java ของไฟล์ต้นฉบับ เช่น ไฟล์ต้นฉบับที่ stuff/java/foo/bar/a.txt จะอยู่ที่ foo/bar/a.txt

runtime_deps

List of labels; optional

ไลบรารีให้พร้อมใช้งานสำหรับไบนารีสุดท้ายหรือทดสอบที่รันไทม์เท่านั้น คลาสพาธของรันไทม์เหมือนกับ deps ทั่วไป แต่จะไม่ปรากฏในคลาสพาธของเวลาคอมไพล์ ไม่เหมือนกับ deps ทรัพยากร Dependency ที่จำเป็นเฉพาะรันไทม์ควรแสดงรายการที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรไม่สนใจเป้าหมายที่ปรากฏในทั้ง runtime_deps และ deps
stamp

Integer; optional; default is 0

จะเข้ารหัสข้อมูลของบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับข้อมูลบิลด์ลงในไบนารีเสมอ แม้กระทั่งในบิลด์ --nostamp ควรหลีกเลี่ยงการตั้งค่านี้ เนื่องจากอาจกำจัดการแคชระยะไกลสำหรับไบนารีและการดำเนินการดาวน์สตรีมที่ต้องใช้การตั้งค่าดังกล่าว
  • stamp = 0: แทนที่ข้อมูลของบิลด์ด้วยค่าคงที่เสมอ ซึ่งทำให้มีการแคชผลลัพธ์ของบิลด์ที่ดี
  • stamp = -1: การฝังข้อมูลของบิลด์จะควบคุมโดยแฟล็ก --[no]stamp

ระบบจะไม่สร้างไบนารีที่ประทับตราขึ้นมาใหม่เว้นแต่มีการเปลี่ยนแปลงทรัพยากร Dependency

test_class

String; optional

คลาส Java ที่ตัวดำเนินการโหลดจะโหลด

โดยค่าเริ่มต้น หากไม่ได้กำหนดอาร์กิวเมนต์นี้ ระบบจะใช้โหมดเดิมและจะใช้อาร์กิวเมนต์ทดสอบแทน ตั้งค่าแฟล็ก --nolegacy_bazel_java_test เป็นไม่ให้สำรองในอาร์กิวเมนต์แรก

แอตทริบิวต์นี้ระบุชื่อของคลาส Java ที่จะเรียกใช้โดยการทดสอบนี้ ไม่ค่อยต้องตั้งค่า หากละเว้นอาร์กิวเมนต์นี้ ระบบจะอนุมานโดยใช้ name ของเป้าหมายและเส้นทางที่เกี่ยวข้องกับรูทของต้นทาง หากการทดสอบอยู่นอกรูทต้นทางที่รู้จัก Bazel จะรายงานข้อผิดพลาดหากไม่ได้ตั้งค่า test_class

สำหรับ JUnit3 คลาสการทดสอบต้องเป็นคลาสย่อยของ junit.framework.TestCase หรือต้องมีเมธอด suite() แบบสาธารณะแบบคงที่ซึ่งแสดงผล junit.framework.Test (หรือคลาสย่อย Test) สำหรับ JUnit4 คลาสจะต้องใส่คำอธิบายประกอบด้วย org.junit.runner.RunWith

แอตทริบิวต์นี้ช่วยให้กฎ java_test หลายข้อแชร์ Test เดียวกันได้ (TestCase, TestSuite, ...) โดยปกติแล้วจะมีการส่งข้อมูลเพิ่มเติมให้แอตทริบิวต์ดังกล่าว (เช่น ผ่าน jvm_flags=['-Dkey=value']) เพื่อให้การทำงานของแอตทริบิวต์แตกต่างกันไปในแต่ละกรณี เช่น การเรียกใช้การทดสอบชุดย่อยที่แตกต่างกัน แอตทริบิวต์นี้ยังทำให้ใช้การทดสอบ Java นอกโครงสร้าง javatests ได้ด้วย

use_launcher

Boolean; optional; default is True

ไบนารีควรใช้ Launcher ที่กำหนดเองหรือไม่

หากตั้งค่าแอตทริบิวต์นี้เป็น "เท็จ" ระบบจะละเว้นแอตทริบิวต์ Launcher และแฟล็ก --java_launcher ที่เกี่ยวข้องสำหรับเป้าหมายนี้

use_testrunner

Boolean; optional; default is True

ใช้คลาสตัวดำเนินการทดสอบ (โดยค่าเริ่มต้น com.google.testing.junit.runner.BazelTestRunner) เป็นจุดแรกเข้าหลักสำหรับโปรแกรม Java และระบุคลาสการทดสอบให้กับตัวดำเนินการทดสอบเป็นค่าของพร็อพเพอร์ตี้ระบบ bazel.test_suite คุณใช้ตัวเลือกนี้เพื่อลบล้างลักษณะการทำงานเริ่มต้นได้ ซึ่งก็คือการใช้ตัวดำเนินการทดสอบสำหรับกฎ java_test และไม่ใช้กับกฎ java_binary คุณไม่น่าจะต้องการดำเนินการนี้ การใช้งานแบบหนึ่งมีไว้สำหรับกฎ AllTest ที่จะเรียกใช้โดยกฎอื่น (เช่น เพื่อตั้งค่าฐานข้อมูลก่อนเรียกใช้การทดสอบ) คุณต้องประกาศกฎ AllTest เป็น java_binary แต่ยังคงใช้ตัวดำเนินการทดสอบเป็นจุดแรกเข้าหลัก คุณลบล้างชื่อของคลาสตัวดำเนินการทดสอบได้ด้วยแอตทริบิวต์ 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)

การกำหนดค่าเพื่อใช้กับชุดแพ็กเกจ คุณจะเพิ่มการกำหนดค่าไปยัง java_toolchain.javacopts ได้

ตัวอย่าง

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",
    ]
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

data

List of labels; optional

รายการไฟล์ที่การกำหนดค่านี้ต้องการขณะรันไทม์
javacopts

List of strings; optional

แฟล็กคอมไพเลอร์ Java
packages

List of labels; optional

ชุดของ package_group ควรใช้การกำหนดค่า

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 กำหนดปลั๊กอินสำหรับคอมไพเลอร์ Java ที่ Bazel เรียกใช้ ขณะนี้ปลั๊กอินที่รองรับมีเพียงตัวประมวลผลคำอธิบายประกอบ กฎ java_library หรือ java_binary จะเรียกใช้ปลั๊กอินได้โดยขึ้นอยู่กับปลั๊กอินเหล่านั้นผ่านแอตทริบิวต์ plugins java_library ยังส่งออกปลั๊กอินไปยังไลบรารีที่อาศัยปลั๊กอินดังกล่าวโดยตรงโดยอัตโนมัติได้โดยใช้ exported_plugins

เป้าหมายเอาต์พุตโดยนัย

  • libname.jar: ที่เก็บถาวรสำหรับ Java

อาร์กิวเมนต์เหมือนกับ java_library ยกเว้นการเพิ่มอาร์กิวเมนต์ processor_class

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายชื่อไลบรารีที่จะลิงก์เข้าสู่ไลบรารีนี้ ดูความคิดเห็นทั่วไปเกี่ยวกับ deps ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่

Jars ที่สร้างขึ้นโดยกฎ java_library ที่แสดงอยู่ใน deps จะอยู่ใน คลาสพาธเวลาคอมไพล์ของกฎนี้ นอกจากนี้ การปิดชั่วคราวของ deps, runtime_deps และ exports จะอยู่ในคลาสพาธรันไทม์

ในทางตรงกันข้าม เป้าหมายในแอตทริบิวต์ data จะรวมอยู่ใน Runfiles แต่ไม่อยู่ในคลาสพาธเวลาคอมไพล์หรือคลาสรันไทม์

srcs

List of labels; optional

รายการไฟล์ต้นฉบับที่ประมวลผลเพื่อสร้างเป้าหมาย แอตทริบิวต์นี้จำเป็นเกือบทุกครั้ง โปรดดูข้อยกเว้นด้านล่าง

ไฟล์ต้นฉบับประเภท .java จะได้รับการคอมไพล์ ในกรณีของไฟล์ .java ที่สร้างขึ้น โดยทั่วไปแล้ว เราขอแนะนำให้ใส่ชื่อของกฎที่สร้างที่นี่แทนชื่อของไฟล์ การทำเช่นนี้ไม่เพียงช่วยให้อ่านง่ายขึ้นเท่านั้น แต่ยังทำให้กฎมีความยืดหยุ่นมากขึ้นต่อการเปลี่ยนแปลงในอนาคตด้วย หากกฎที่สร้างสร้างไฟล์อื่นในอนาคต คุณจะต้องแก้ไขเพียงที่เดียว นั่นคือ outs ของกฎที่สร้างขึ้น คุณไม่ควรแสดงรายการกฎที่สร้างใน deps เนื่องจากเป็นกฎที่ไม่มีการดำเนินการ

ไฟล์ต้นฉบับประเภท .srcjar จะถูกคลายการแพคและคอมไพล์แล้ว (ซึ่งจะเป็นประโยชน์หากต้องการสร้างชุดไฟล์ .java ที่มีกฎเกณฑ์)

กฎ: หากกฎ (โดยทั่วไปคือ genrule หรือ filegroup) สร้างไฟล์ใดๆ ที่ระบุไว้ด้านบน ระบบจะใช้ไฟล์ในลักษณะเดียวกับที่อธิบายไว้สำหรับไฟล์ต้นฉบับ

ระบบจำเป็นต้องใช้อาร์กิวเมนต์นี้เกือบทุกครั้ง ยกเว้นในกรณีที่แอตทริบิวต์ main_class ระบุคลาสในคลาสพาธรันไทม์หรือคุณระบุอาร์กิวเมนต์ runtime_deps

data

List of labels; optional

รายการไฟล์ที่ไลบรารีนี้ต้องการในระหว่างรันไทม์ ดูความคิดเห็นทั่วไปเกี่ยวกับ data ที่แอตทริบิวต์ทั่วไปที่กำหนดโดยกฎการสร้างส่วนใหญ่

เมื่อสร้าง java_library Bazel จะไม่วางไฟล์เหล่านี้ไว้ที่ใดที่หนึ่ง หากสร้างไฟล์ data ไฟล์ไว้ Bazel จะสร้างไฟล์เหล่านั้น เมื่อสร้างการทดสอบที่ขึ้นอยู่กับ java_library Bazel นี้คัดลอกหรือลิงก์ไฟล์ data กับพื้นที่ Runfiles

resources

List of labels; optional

รายการไฟล์ข้อมูลที่จะรวมใน Java jar

หากระบุทรัพยากรแล้ว ระบบจะรวมทรัพยากรเหล่านั้นไว้ใน Jar พร้อมกับไฟล์ .class ปกติที่สร้างจากการคอมไพล์ ตำแหน่งของทรัพยากรภายในไฟล์ Jar จะกำหนดโดยโครงสร้างโปรเจ็กต์ ก่อนอื่น Bazel จะมองหาเลย์เอาต์ไดเรกทอรีมาตรฐานของ Maven (ไดเรกทอรี "src" ตามด้วยไดเรกทอรี "resources" ย่อย) หากไม่พบค่านี้ Bazel จะมองหาไดเรกทอรีระดับบนสุดที่ชื่อ "java" หรือ "javatests" (เช่น หากทรัพยากรอยู่ที่ <workspace root>/x/java/y/java/z เส้นทางของทรัพยากรจะเป็น y/java/z ลบล้างฮิวริสติกนี้ไม่ได้ แต่จะใช้แอตทริบิวต์ resource_strip_prefix เพื่อระบุไดเรกทอรีทางเลือกที่เจาะจงสำหรับไฟล์ทรัพยากรได้

ทรัพยากรอาจเป็นไฟล์ต้นฉบับหรือไฟล์ที่สร้างขึ้น

generates_api

Boolean; optional; default is False

แอตทริบิวต์นี้ทำเครื่องหมายตัวประมวลผลคำอธิบายประกอบที่สร้างโค้ด API

หากกฎใช้ตัวประมวลผลคำอธิบายประกอบที่สร้าง API กฎอื่นๆ ที่ขึ้นอยู่กับกฎจะอ้างอิงโค้ดที่สร้างขึ้นก็ต่อเมื่อมีการกำหนดเวลาการดำเนินการคอมไพล์หลังกฎที่สร้างขึ้นเท่านั้น แอตทริบิวต์นี้สั่งให้ Bazel แนะนำข้อจำกัดการกำหนดเวลาเมื่อเปิดใช้ --java_header_compilation

คำเตือน: แอตทริบิวต์นี้มีผลต่อประสิทธิภาพของบิลด์ โปรดใช้เมื่อจำเป็นเท่านั้น

javacopts

List of strings; optional

ตัวเลือกคอมไพเลอร์เพิ่มเติมสำหรับไลบรารีนี้ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง

Boolean; optional; default is False

ควรใช้ไลบรารีนี้สำหรับการคอมไพล์เท่านั้นและไม่ใช่ระหว่างรันไทม์หรือไม่ มีประโยชน์หากสภาพแวดล้อมรันไทม์จะจัดเตรียมไลบรารีไว้ให้ระหว่างการดำเนินการ ตัวอย่างของไลบรารีดังกล่าว ได้แก่ IDE API สำหรับปลั๊กอิน IDE หรือ tools.jar สำหรับอะไรก็ตามที่ทำงานบน JDK มาตรฐาน

โปรดทราบว่า neverlink = 1 ไม่ได้ป้องกันไม่ให้คอมไพเลอร์แทรกเนื้อหาจากไลบรารีนี้เป็นเป้าหมายการคอมไพล์ที่อ้างอิงเนื้อหา ตามที่ข้อกำหนดภาษาของ Java อนุญาต (เช่น ค่าคงที่ static final ของ String หรือของประเภทพื้นฐาน) ดังนั้นกรณีการใช้งานที่เหมาะสมจึงเป็นกรณีที่ไลบรารีรันไทม์เหมือนกับไลบรารีการคอมไพล์ทุกประการ

หากไลบรารีรันไทม์แตกต่างจากไลบรารีการคอมไพล์ คุณต้องตรวจสอบว่าไลบรารีนี้แตกต่างเฉพาะในตำแหน่งที่ JLS กำหนดให้คอมไพเลอร์ไม่สามารถแทรกในบรรทัด (และที่ต้องระงับสำหรับ JLS เวอร์ชันในอนาคตทั้งหมด)

output_licenses

Licence type; optional

โปรดดู common attributes
plugins

List of labels; optional

ปลั๊กอินของคอมไพเลอร์ Java ที่จะเรียกใช้ในเวลาคอมไพล์ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์นี้จะทำงานเมื่อมีการสร้างกฎนี้ ไลบรารีอาจรับค่าปลั๊กอินจากทรัพยากร Dependency ที่ใช้ exported_plugins ด้วย ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ใน Jar ที่เป็นผลลัพธ์ของกฎนี้
processor_class

String; optional

คลาสตัวประมวลผลเป็นประเภทที่มีคุณสมบัติครบถ้วนของคลาสที่คอมไพเลอร์ Java ควรใช้เป็นจุดแรกเข้าของตัวประมวลผลคำอธิบายประกอบ หากไม่ระบุ กฎนี้จะไม่ใช้ตัวประมวลผลคำอธิบายประกอบในการประมวลผลคำอธิบายประกอบของคอมไพเลอร์ Java แต่คลาสพาธรันไทม์จะยังคงรวมอยู่ในเส้นทางตัวประมวลผลคำอธิบายประกอบของคอมไพเลอร์ (มีจุดประสงค์หลักเพื่อการใช้งานโดยปลั๊กอิน Error Prone ซึ่งโหลดจากเส้นทางตัวประมวลผลคำอธิบายประกอบโดยใช้ java.util.ServiceLoader)
proguard_specs

List of labels; optional

ไฟล์ที่จะใช้เป็นข้อมูลจำเพาะของ Proguard ซึ่งจะอธิบายถึงชุดข้อกำหนดที่ Proguard ใช้งาน หากระบุ ระบบจะเพิ่มกลุ่มเป้าหมายนี้ลงในเป้าหมาย android_binary ใดก็ตาม ทั้งนี้ขึ้นอยู่กับไลบรารีนี้ ไฟล์ที่ระบุไว้ที่นี่ต้องมีเฉพาะกฎแบบ ID เท่านั้น ได้แก่ -dontnote, -dontwarn, summarynosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏใน Proguard_specs ของ android_binary เท่านั้นเพื่อให้แน่ใจว่ามีการผสานที่ไม่ใช่แบบโทโลจี
resource_jars

List of labels; optional

เลิกใช้งานแล้ว: ใช้ java_import และ deps หรือ session_deps แทน
resource_strip_prefix

String; optional

คำนำหน้าเส้นทางที่จะตัดจากทรัพยากร Java

หากระบุไว้ ระบบจะตัดคำนำหน้าเส้นทางออกจากทุกไฟล์ในแอตทริบิวต์ resources เกิดข้อผิดพลาดที่ไฟล์ทรัพยากรไม่อยู่ในไดเรกทอรีนี้ หากไม่ได้ระบุไว้ (ค่าเริ่มต้น) ระบบจะกำหนดเส้นทางของไฟล์ทรัพยากรตามตรรกะเดียวกันกับแพ็กเกจ Java ของไฟล์ต้นฉบับ เช่น ไฟล์ต้นฉบับที่ stuff/java/foo/bar/a.txt จะอยู่ที่ 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)

ระบุการกําหนดค่าสําหรับรันไทม์ของ Java

ตัวอย่าง

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

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

srcs

List of labels; optional

ไฟล์ทั้งหมดในรันไทม์
hermetic_srcs

List of labels; optional

ไฟล์ในรันไทม์ที่จำเป็นสำหรับการทำให้ใช้งานได้ที่แนบเนียน
java

Label; optional

เส้นทางไปยังไฟล์ปฏิบัติการ Java
java_home

String; optional

เส้นทางไปยังรูทของรันไทม์ ขึ้นอยู่กับการแทนที่ตัวแปร"ผู้ผลิต" หากเส้นทางนี้สมบูรณ์ กฎจะหมายถึงรันไทม์ของ Java ที่ไม่ใช่แบบ Hermetic กับเส้นทางที่รู้จักกันดี ในกรณีนี้ แอตทริบิวต์ srcs และ java ต้องว่างเปล่า
lib_modules

Label; optional

ไฟล์ lib/modules ที่จำเป็นสำหรับการติดตั้งใช้งานแบบ Hermetic

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)

ระบุการกำหนดค่าสำหรับคอมไพเลอร์ Java เชนเครื่องมือที่จะใช้สามารถเปลี่ยนแปลงผ่านอาร์กิวเมนต์ --java_toolchain โดยปกติคุณไม่ควรเขียนกฎประเภทนี้เว้นแต่ต้องการปรับแต่งคอมไพเลอร์ Java

ตัวอย่าง

ตัวอย่างง่ายๆ เช่น

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",
)

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

android_lint_data

List of labels; optional

ป้ายกำกับของเครื่องมือที่ใช้กับการขยายป้ายกำกับได้ใน android_lint_jvm_opts
android_lint_jvm_opts

List of strings; optional

รายการอาร์กิวเมนต์สำหรับ JVM เมื่อเรียกใช้ Android Lint
android_lint_opts

List of strings; optional

รายการอาร์กิวเมนต์ Android Lint
android_lint_package_configuration

List of labels; optional

การกำหนดค่า Android Lint ที่ควรใช้กับกลุ่มแพ็กเกจที่ระบุ
android_lint_runner

Label; optional

ป้ายกำกับตัวเรียกใช้ Android Lint (หากมี)
bootclasspath

List of labels; optional

รายการ Bootclasspath เป้าหมายใน Java ตรงกับแฟล็ก -bootclasspath ของ javac
deps_checker

List of labels; optional

ป้ายกำกับของ Jar การทำให้ใช้งานได้ของ ImportDepsChecker
forcibly_disable_header_compilation

Boolean; optional; default is False

ลบล้าง --java_header_compilation เพื่อปิดใช้การคอมไพล์ส่วนหัวบนแพลตฟอร์มที่ไม่รองรับ เช่น JDK 7 Bazel
genclass

List of labels; required

ป้ายกำกับของ Jar การทำให้ใช้งานได้ของ GenClass
header_compiler

List of labels; optional

ป้ายกำกับของคอมไพเลอร์ส่วนหัว ต้องระบุหากเปิดใช้ --java_header_compilation
header_compiler_direct

List of labels; optional

ป้ายกำกับที่ไม่บังคับของคอมไพเลอร์ส่วนหัวที่ใช้สำหรับการดำเนินการของคลาสพาธโดยตรงที่ไม่รวมตัวประมวลผลคำอธิบายประกอบที่สร้าง API

เครื่องมือนี้ไม่รองรับการประมวลผลคำอธิบายประกอบ

ijar

List of labels; required

ป้ายกำกับไฟล์ปฏิบัติการ Ijar
jacocorunner

Label; optional

ป้ายกำกับของ JacocoCoverageRunner สำหรับติดตั้งใช้งาน
java_runtime

Label; required

java_runtime ที่จะใช้กับ Toolchain นี้ โดยมีค่าเริ่มต้นเป็น java_runtime ในการกำหนดค่าการดำเนินการ
javabuilder

List of labels; required

ป้ายกำกับของ Jar ที่ติดตั้งใช้งาน JavaBuilder
javabuilder_data

List of labels; optional

ป้ายกำกับของข้อมูลที่พร้อมใช้งานสำหรับการขยายป้ายกำกับใน javabuilder_jvm_opts
javabuilder_jvm_opts

List of strings; optional

รายการอาร์กิวเมนต์สำหรับ JVM เมื่อเรียกใช้ JavaBuilder
javac_supports_multiplex_workers

Boolean; optional; default is True

เป็นจริงหาก JavaBuilder รองรับการทำงานเป็นผู้ปฏิบัติงานถาวรแบบมัลติเพล็กซ์ เท็จหากไม่รองรับ
javac_supports_workers

Boolean; optional; default is True

เป็นจริงหาก JavaBuilder รองรับการทำงานเป็นผู้ปฏิบัติงานถาวร และเป็นเท็จหากไม่รองรับ
javacopts

List of strings; optional

รายการอาร์กิวเมนต์เพิ่มเติมสำหรับคอมไพเลอร์ Java โปรดดูเอกสารของคอมไพเลอร์ Java เพื่อดูรายการแฟล็กคอมไพเลอร์ Java ที่เป็นไปได้ทั้งหมด
jvm_opts

List of strings; optional

รายการอาร์กิวเมนต์สำหรับ JVM เมื่อเรียกใช้คอมไพเลอร์ Java โปรดดูเอกสารเกี่ยวกับเครื่องเสมือนของ Java เพื่อดูรายการแฟล็กที่เป็นไปได้ทั้งหมดสำหรับตัวเลือกนี้
oneversion

Label; optional

ป้ายกำกับของไบนารีการบังคับใช้เวอร์ชันเดียว
oneversion_whitelist

Label; optional

ป้ายกำกับรายการที่อนุญาตพิเศษเวอร์ชันเดียว
package_configuration

List of labels; optional

การกำหนดค่าที่ควรนำไปใช้กับกลุ่มแพ็กเกจที่ระบุ
proguard_allowlister

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

ป้ายกำกับรายการที่อนุญาตของ Proguard
resourcejar

List of labels; optional

ป้ายกำกับของไฟล์ปฏิบัติการของเครื่องมือสร้าง Jar ทรัพยากร
singlejar

List of labels; required

ป้ายกำกับของโหลที่ติดตั้งใช้งาน SingleJar
source_version

String; optional

เวอร์ชันซอร์สของ Java (เช่น "6" หรือ "7") ซึ่งจะระบุชุดโครงสร้างโค้ดที่อนุญาตให้ใช้ในซอร์สโค้ดของ Java
target_version

String; optional

เวอร์ชันเป้าหมาย Java (เช่น "6" หรือ "7") โดยระบุว่าคลาสควรเป็นรันไทม์ของ Java ใด
timezone_data

Label; optional

ป้ายกำกับของ Jar ทรัพยากรที่มีข้อมูลเขตเวลา หากตั้งค่าไว้ ระบบจะเพิ่มข้อมูลเขตเวลาเป็นทรัพยากร Dependency รันไทม์โดยนัยของกฎ java_binary ทั้งหมด
tools

List of labels; optional

ป้ายกำกับของเครื่องมือที่ใช้กับการขยายป้ายกำกับใน jvm_opts
turbine_data

List of labels; optional

ป้ายกำกับข้อมูลที่ใช้ได้สำหรับการขยายป้ายกำกับใน turbine_jvm_opts
turbine_jvm_opts

List of strings; optional

รายการอาร์กิวเมนต์สำหรับ JVM เมื่อเรียกใช้ Turbine
xlint

List of strings; optional

รายการคําเตือนให้เพิ่มหรือนำออกจากรายการเริ่มต้น มีเครื่องหมายขีดกลางอยู่ด้านหน้าเพื่อนำออก โปรดดูข้อมูลเพิ่มเติมจากเอกสารประกอบของ Javac ในตัวเลือก -Xlint