กฎของ Java

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

กฎ

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 ใช้ classpath ที่มีไฟล์ jar สำหรับแต่ละไลบรารีที่ไบนารีนั้นใช้อยู่ เมื่อเรียกใช้สคริปต์เชลล์ของ Wrapper ตัวแปรสภาพแวดล้อม JAVABIN ที่ไม่ใช่ค่าว่างจะมีลำดับความสำคัญเหนือกว่าเวอร์ชันที่ระบุผ่าน Flag --java_runtime_version ของ Bazel

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

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

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

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

    JAR ที่ใช้ติดตั้งประกอบด้วยคลาสทั้งหมดที่ Class Loader จะพบซึ่งค้นหา Classpath จากสคริปต์ Wrapper ของไบนารีตั้งแต่ต้นจนจบ รวมถึงมีไลบรารีเนทีฟที่จําเป็นสําหรับทรัพยากร Dependency ด้วย ระบบจะโหลดไฟล์เหล่านี้ลงใน JVM โดยอัตโนมัติเมื่อรันไทม์

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

  • name_deploy-src.jar: ที่เก็บถาวรที่มีแหล่งที่มาซึ่งรวบรวมจาก Closure แบบทรานซิทีฟของเป้าหมาย ซึ่งจะจับคู่กับคลาสใน deploy.jar ยกเว้นในกรณีที่ Jar ไม่มี 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

ชื่อ ต้องระบุ

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


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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

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

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

resources

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

หากระบุทรัพยากร ระบบจะรวมทรัพยากรไว้ในไฟล์ 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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

create_executable

บูลีน ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ True

เลิกใช้งานแล้ว โปรดใช้ java_single_jar แทน
deploy_env

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

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

jvm_flags

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

launcher

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

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

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

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

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

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

main_class

สตริง ค่าเริ่มต้นคือ ""

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

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

plugins

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

สตริง ค่าเริ่มต้นคือ ""

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

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

runtime_deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

จํานวนเต็ม ค่าเริ่มต้นคือ -1

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

ระบบจะไม่สร้างไฟล์ไบนารีที่มีตราประทับอีกครั้ง เว้นแต่จะมีการเปลี่ยนแปลงทรัพยากร Dependency

use_launcher

บูลีน ค่าเริ่มต้นคือ True

ระบุว่าไบนารีควรใช้ตัวเปิดที่กำหนดเองหรือไม่

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

use_testrunner

บูลีน ค่าเริ่มต้นคือ 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการสตริง ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

เป้าหมายที่จะทําให้พร้อมใช้งานสําหรับผู้ใช้กฎนี้ โปรดดู java_library.exports
jars

รายการป้ายกำกับ (ต้องระบุ)

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

บูลีน ค่าเริ่มต้นคือ False

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ 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: ไฟล์เก็บถาวรที่มีแหล่งที่มา ("source jar")

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

Attributes
name

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

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

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

data

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

resources

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

หากระบุทรัพยากร ระบบจะรวมทรัพยากรไว้ในไฟล์ 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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

exports

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

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

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

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

javacopts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

บูลีน ค่าเริ่มต้นคือ False

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

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

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

plugins

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

สตริง ค่าเริ่มต้นคือ ""

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

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

runtime_deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ไลบรารีที่จะทําให้พร้อมใช้งานในไบนารีขั้นสุดท้ายหรือทดสอบที่รันไทม์เท่านั้น เช่นเดียวกับ deps ทั่วไป รายการเหล่านี้จะปรากฏใน classpath รันไทม์ แต่จะไม่ปรากฏใน classpath ขณะคอมไพล์ รายการต่อไปนี้ควรระบุไว้สำหรับทรัพยากร Dependencies ที่จำเป็นเฉพาะในรันไทม์ เครื่องมือวิเคราะห์ 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการกฎ 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการกฎ 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 การทดสอบคือไฟล์กลุ่มไบนารีรอบโค้ดทดสอบ ระบบจะเรียกใช้เมธอดหลักของโปรแกรมรันทดสอบแทนการคอมไพล์คลาสหลัก

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

  • 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

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

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

resources

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

หากระบุทรัพยากร ระบบจะรวมทรัพยากรไว้ในไฟล์ 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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

create_executable

บูลีน ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ True

เลิกใช้งานแล้ว โปรดใช้ java_single_jar แทน
deploy_manifest_lines

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

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

jvm_flags

รายการสตริง ค่าเริ่มต้นคือ []

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

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

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

launcher

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

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

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

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

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

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

main_class

สตริง ค่าเริ่มต้นคือ ""

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

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

plugins

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

สตริง ค่าเริ่มต้นคือ ""

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

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

runtime_deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

จํานวนเต็ม ค่าเริ่มต้นคือ 0

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

ระบบจะไม่สร้างไฟล์ไบนารีที่มีตราประทับอีกครั้ง เว้นแต่จะมีการเปลี่ยนแปลงทรัพยากร Dependency

test_class

สตริง ค่าเริ่มต้นคือ ""

คลาส Java ที่โปรแกรมรันทดสอบจะโหลด

โดยค่าเริ่มต้น หากไม่ได้กําหนดอาร์กิวเมนต์นี้ ระบบจะใช้โหมดเดิมและใช้อาร์กิวเมนต์ทดสอบแทน ตั้งค่า Flag --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

บูลีน ค่าเริ่มต้นคือ True

ระบุว่าไบนารีควรใช้ตัวเปิดที่กำหนดเองหรือไม่

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

use_testrunner

บูลีน ค่าเริ่มต้นคือ 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

ชื่อ ต้องระบุ

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

data

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการไฟล์ที่จําเป็นสําหรับการกําหนดค่านี้เมื่อรันไทม์
javacopts

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ชุด 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

ชื่อ ต้องระบุ

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

deps

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

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

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

data

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

resources

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

หากระบุทรัพยากร ระบบจะรวมทรัพยากรไว้ในไฟล์ 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

บูลีน ค่าเริ่มต้นคือ False

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

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

คำเตือน: แอตทริบิวต์นี้ส่งผลต่อประสิทธิภาพการสร้าง ให้ใช้เฉพาะในกรณีที่จำเป็น

javacopts

รายการสตริง ค่าเริ่มต้นคือ []

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

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

บูลีน ค่าเริ่มต้นคือ False

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

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

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

output_licenses

ประเภทใบอนุญาต ค่าเริ่มต้นคือ ["none"]

ดู common attributes
plugins

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

สตริง ค่าเริ่มต้นคือ ""

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

สตริง ค่าเริ่มต้นคือ ""

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

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

java_runtime

ดูแหล่งที่มาของกฎ
java_runtime(name, srcs, compatible_with, default_cds, deprecation, distribs, features, hermetic_srcs, java, java_home, lib_ct_sym, lib_modules, licenses, restricted_to, tags, target_compatible_with, testonly, version, visibility)

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

ตัวอย่าง

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

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

Attributes
name

ชื่อ ต้องระบุ

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

srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

ที่เก็บ CDS เริ่มต้นสําหรับ java_runtime แบบปิด เมื่อเปิดใช้การแยกส่วนสำหรับเป้าหมาย java_binary และหากเป้าหมายไม่ได้จัดเตรียมไฟล์เก็บถาวร CDS ของตนเองโดยระบุแอตทริบิวต์ classlist ระบบจะบรรจุ CDS เริ่มต้น java_runtime ไว้ใน JAR การติดตั้งแบบแยกส่วน
hermetic_srcs

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

สตริง ค่าเริ่มต้นคือ ""

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

ไฟล์ lib/ct.sym ที่จําเป็นสําหรับการคอมไพล์ด้วย --release หากไม่ได้ระบุและไฟล์ใน srcs มีเพียงไฟล์เดียวที่มีเส้นทางลงท้ายด้วย /lib/ct.sym ระบบจะใช้ไฟล์นั้น
lib_modules

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

จํานวนเต็ม ค่าเริ่มต้นคือ 0

เวอร์ชันฟีเจอร์ของรันไทม์ Java กล่าวคือ จํานวนเต็มซึ่ง Runtime.version().feature() แสดงผล

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_allowlist_for_tests, oneversion_whitelist, package_configuration, proguard_allowlister, resourcejar, restricted_to, singlejar, source_version, tags, target_compatible_with, target_version, testonly, timezone_data, tools, turbine_data, turbine_jvm_opts, visibility, xlint)

ระบุการกําหนดค่าสําหรับคอมไพเลอร์ 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

ชื่อ ต้องระบุ

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

android_lint_data

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกำกับของเครื่องมือเรียกใช้ Android Lint (หากมี)
bootclasspath

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

รายการบูตแพตธ์เป้าหมาย Java สอดคล้องกับ Flag -bootclasspath ของ javac
deps_checker

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ป้ายกํากับของไฟล์ jar ที่ใช้ติดตั้ง ImportDepsChecker
forcibly_disable_header_compilation

บูลีน ค่าเริ่มต้นคือ False

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

รายการป้ายกำกับ (ต้องระบุ)

ป้ายกำกับของไฟล์ JAR สำหรับติดตั้ง GenClass
header_compiler

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

ijar

รายการป้ายกำกับ (ต้องระบุ)

ป้ายกำกับของไฟล์ปฏิบัติการ ijar
jacocorunner

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกํากับของไฟล์ jar ที่ใช้ติดตั้ง JacocoCoverageRunner
java_runtime

ป้ายกำกับ (ต้องระบุ)

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

รายการป้ายกำกับ (ต้องระบุ)

ป้ายกำกับของไฟล์ jar ที่ใช้ติดตั้ง JavaBuilder
javabuilder_data

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

บูลีน ค่าเริ่มต้นคือ True

จริงหาก JavaBuilder รองรับการทํางานแบบผู้ทํางานแบบคงที่แบบหลายรายการ ไม่จริงหากไม่รองรับ
javac_supports_workers

บูลีน ค่าเริ่มต้นคือ True

จริงหาก JavaBuilder รองรับการทํางานแบบต่อเนื่อง ไม่จริงหากไม่รองรับ
javacopts

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

ป้ายกํากับ ค่าเริ่มต้นคือ None

ป้ายกำกับของรายการที่อนุญาตเวอร์ชันเดียวสำหรับการทดสอบ
oneversion_whitelist

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

ป้ายกํากับ ค่าเริ่มต้นคือ "@bazel_tools//tools/jdk:proguard_whitelister"

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกำกับ (ต้องระบุ)

ป้ายกํากับของไฟล์ JAR ที่ใช้ติดตั้ง SingleJar
source_version

สตริง ค่าเริ่มต้นคือ ""

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

สตริง ค่าเริ่มต้นคือ ""

เวอร์ชันเป้าหมาย Java (เช่น '6' หรือ "7") ซึ่งจะระบุรันไทม์ Java ที่ควรสร้างคลาส
timezone_data

ป้ายกํากับ ค่าเริ่มต้นคือ None

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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

รายการสตริง ค่าเริ่มต้นคือ []

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