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

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

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

  • name.jar: ไฟล์เก็บถาวร Java ที่มีไฟล์คลาสและทรัพยากรอื่นๆ ที่สอดคล้องกับทรัพยากรที่ต้องพึ่งพาโดยตรงของไบนารี
  • name-src.jar: ไฟล์เก็บถาวรที่มีแหล่งที่มา ("source 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: ที่เก็บถาวรที่มีแหล่งที่มาซึ่งรวบรวมจาก 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 จุดประสงค์เพียงอย่างเดียวของแอตทริบิวต์นี้คือเพื่อรองรับไลบรารีของบุคคลที่สามที่กำหนดให้พบทรัพยากรบนคลาสพาธให้เหมือนกับ "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ตัวแปร" และการแปลงเป็นโทเค็น Shell เบิร์น

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

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

launcher

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

ระบุไบนารีที่จะใช้เพื่อเรียกใช้โปรแกรม Java แทนโปรแกรม bin/java ปกติที่รวมอยู่ใน JDK เป้าหมายต้องเป็น cc_binary คุณระบุ cc_binary ที่ใช้ Java 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 นี้ Linker ในการกำหนดค่านี้ไม่นำโค้ดที่ไม่ได้ใช้งานออก
  • หากคุณใช้ Launcher อื่น ไลบรารีที่ใช้ร่วมกันแบบเนทีฟ (C++) จะลิงก์แบบคงที่ไปยังไบนารีชื่อ {name}_nativedeps โดยที่ {name} เป็นแอตทริบิวต์ name ของกฎ java_binary นี้ ในกรณีนี้ Linker จะนำโค้ดที่คิดว่าไม่ได้ใช้ออกจากไบนารีที่ได้ ซึ่งหมายความว่าระบบอาจไม่ลิงก์โค้ด C++ ที่เข้าถึงผ่าน JNI เท่านั้น เว้นแต่เป้าหมาย cc_library นั้นระบุ alwayslink = 1

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

main_class

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

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

ค่าของแอตทริบิวต์นี้คือชื่อคลาส ไม่ใช่ไฟล์ต้นทาง คลาสต้องพร้อมใช้งานในรันไทม์ โดยอาจได้รับการคอมไพล์โดยกฎนี้ (จาก srcs) หรือจัดเตรียมโดยทรัพยากร Dependency โดยตรงหรือแบบทรานซิทีฟ (ผ่าน 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 ขณะคอมไพล์ ทรัพยากร Dependency ที่จำเป็นขณะรันไทม์เท่านั้นควรระบุไว้ที่นี่ เครื่องมือวิเคราะห์ 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 จะยังคงอยู่ในคลาสพาธรันไทม์

ในทางตรงกันข้าม เป้าหมายในแอตทริบิวต์ 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 ได้หากมีเส้นทางทรัพยากร Dependency ระหว่างกฎที่เริ่มต้นด้วยเส้นขอบ deps ตามด้วยเส้นขอบ exports อย่างน้อย 0 ขอบ มาดูตัวอย่างที่แสดงให้เห็นเรื่องนี้กัน

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

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

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

javacopts

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

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

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

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

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

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

หากไลบรารีรันไทม์ต่างจากไลบรารีการคอมไพล์ คุณต้องตรวจสอบว่าไลบรารีดังกล่าวแตกต่างกันเฉพาะตำแหน่งที่ 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 หรือรันไทม์_deps แทน
resource_strip_prefix

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

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

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

runtime_deps

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

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

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

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

deps

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

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

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

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

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

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

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

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

resources

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

รายการไฟล์ข้อมูลที่จะรวมไว้ใน 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

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

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

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

create_executable

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

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

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

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

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

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

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

jvm_flags

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

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

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

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

launcher

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

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

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

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

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

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

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

main_class

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

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

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

plugins

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

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

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

เลิกใช้งานแล้ว: ใช้ java_import และ deps หรือรันไทม์_deps แทน
resource_strip_prefix

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

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

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

runtime_deps

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

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

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

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

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

test_class

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

คลาส 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

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

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

หากตั้งค่าแอตทริบิวต์นี้เป็น "เท็จ" ระบบจะละเว้นแอตทริบิวต์ launcher และแฟล็ก --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 จะยังคงอยู่ในคลาสพาธรันไทม์

ในทางตรงกันข้าม เป้าหมายในแอตทริบิวต์ 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

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

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

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

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

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

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

หากไลบรารีรันไทม์แตกต่างจากไลบรารีการคอมไพล์ คุณต้องตรวจสอบว่าไลบรารีดังกล่าวแตกต่างกันเฉพาะในส่วนที่ 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 หรือรันไทม์_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 แบบปิด เมื่อเปิดใช้ Hermetic สำหรับเป้าหมาย 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_worker_multiplex_sandboxing, 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 Runner (หากมี)
bootclasspath

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

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

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

ป้ายกำกับของ ImportDepsChecker ให้ติดตั้งใช้งาน jar
forcibly_disable_header_compilation

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

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

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

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

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

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

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

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

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

ijar

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

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

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

ป้ายกำกับของ JacococoverRunner แบบทำให้ใช้งานได้
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_worker_multiplex_sandboxing

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

จริงหาก JavaBuilder รองรับแซนด์บ็อกซ์แบบหลายช่อง เท็จหากไม่รองรับ
javac_supports_workers

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

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

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

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

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

รายการอาร์กิวเมนต์สําหรับ JVM เมื่อเรียกใช้คอมไพเลอร์ Java โปรดอ่านเอกสารประกอบของ Java Virtual Machine เพื่อดูรายการแฟล็กที่เป็นไปได้สำหรับตัวเลือกนี้
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 แหล่งข้อมูลที่มีข้อมูลเขตเวลา หากตั้งค่าไว้ ระบบจะเพิ่มข้อมูลเขตเวลาเป็นทรัพยากร Dependency แบบโดยนัยของกฎ java_binary ทั้งหมด
tools

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

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

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

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

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

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

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

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