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

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

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

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

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

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

    หากเป้าหมายระบุแอตทริบิวต์ launcher แทนที่จะเป็นไฟล์ JAR ปกติ _deploy.jar จะเป็น ไบนารีเนทีฟ ซึ่งจะมีตัวเรียกใช้และทรัพยากร 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

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

รายการไฟล์ข้อมูลที่จะรวมไว้ใน 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 แอตทริบิวต์นี้มีไว้เพื่อรองรับไลบรารีของบุคคลที่สามที่กำหนดให้ต้องค้นหาทรัพยากรใน 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

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

รายการแฟล็กที่จะฝังในสคริปต์ 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 ที่ ใช้ Java Invocation API สามารถระบุเป็นค่าสำหรับแอตทริบิวต์นี้ได้

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

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

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

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

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

main_class

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

ชื่อของคลาสที่มีmain()เมธอดที่จะใช้เป็นจุดแรกเข้า หากกฎใช้ตัวเลือกนี้ ก็ไม่จำเป็นต้องมีsrcs=[...]รายการ ดังนั้น คุณจึงใช้แอตทริบิวต์นี้เพื่อสร้างไฟล์ที่เรียกใช้งานได้จากไลบรารี Java ที่มีmain()เมธอด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 ของเวลาคอมไพล์ ส่วนการขึ้นต่อกันที่จำเป็นเฉพาะในรันไทม์ควร แสดงไว้ที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรละเว้นเป้าหมายที่ปรากฏทั้งใน runtime_deps และ deps
stamp

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

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

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

use_launcher

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

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

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

use_testrunner

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

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

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 ไปยังพื้นที่ไฟล์ที่ใช้ในการเรียกใช้

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 เพื่อระบุ ไดเรกทอรีสำรองที่เฉพาะเจาะจงสำหรับไฟล์ทรัพยากรได้

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

exported_plugins

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

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

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

exports

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

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

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

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

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

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

สำคัญ: กฎที่ส่งออกไม่ใช่การขึ้นต่อกันตามปกติ จากตัวอย่างก่อนหน้า หาก 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 ใดก็ตามโดยขึ้นอยู่กับคลังนี้ ไฟล์ที่รวมไว้ที่นี่ต้องมีเฉพาะกฎที่ไม่มีผลข้างเคียง ได้แก่ -dontnote, -dontwarn, assumenosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏได้เฉพาะใน android_binaryproguard_specs เพื่อให้มั่นใจว่าการผสานจะไม่ซ้ำซ้อน
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 ของเวลาคอมไพล์ ส่วนการขึ้นต่อกันที่จำเป็นเฉพาะในรันไทม์ควร แสดงไว้ที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรละเว้นเป้าหมายที่ปรากฏทั้งใน 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 แอตทริบิวต์นี้มีไว้เพื่อรองรับไลบรารีของบุคคลที่สามที่กำหนดให้ต้องค้นหาทรัพยากรใน 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

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

รายการแฟล็กที่จะฝังในสคริปต์ 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 ที่ ใช้ Java Invocation API สามารถระบุเป็นค่าสำหรับแอตทริบิวต์นี้ได้

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

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

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

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

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

main_class

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

ชื่อของคลาสที่มีmain()เมธอดที่จะใช้เป็นจุดแรกเข้า หากกฎใช้ตัวเลือกนี้ ก็ไม่จำเป็นต้องมีsrcs=[...]รายการ ดังนั้น คุณจึงใช้แอตทริบิวต์นี้เพื่อสร้างไฟล์ที่เรียกใช้งานได้จากไลบรารี Java ที่มีmain()เมธอด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 ของเวลาคอมไพล์ ส่วนการขึ้นต่อกันที่จำเป็นเฉพาะในรันไทม์ควร แสดงไว้ที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรละเว้นเป้าหมายที่ปรากฏทั้งใน runtime_deps และ deps
stamp

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

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

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

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, ...) ได้ โดยปกติ ระบบจะส่งข้อมูลเพิ่มเติมไปยังTest (เช่น ผ่าน jvm_flags=['-Dkey=value']) เพื่อให้ลักษณะการทำงานของTest แตกต่างกันในแต่ละกรณี เช่น การเรียกใช้ชุดย่อยของ การทดสอบที่แตกต่างกัน นอกจากนี้ แอตทริบิวต์นี้ยังช่วยให้ใช้ การทดสอบ 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 แต่ควร ยังคงใช้โปรแกรมเรียกใช้การทดสอบเป็นจุดแรกเข้าหลัก คุณลบล้างชื่อของคลาส Test Runner ได้ด้วยแอตทริบิวต์ 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 เรียกใช้ ขณะนี้ปลั๊กอินที่รองรับมีเพียง Annotation Processor เท่านั้น กฎ 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 จะรวมอยู่ในไฟล์ที่เรียกใช้ แต่ จะไม่อยู่ใน classpath ของเวลาคอมไพล์หรือรันไทม์

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 ไปยังพื้นที่ไฟล์ที่ใช้ในการเรียกใช้

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 เพื่อระบุ ไดเรกทอรีสำรองที่เฉพาะเจาะจงสำหรับไฟล์ทรัพยากรได้

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

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 แต่ Classpath ของรันไทม์จะยังรวมอยู่ในเส้นทางตัวประมวลผลคำอธิบายประกอบของคอมไพเลอร์ (ฟีเจอร์นี้มีไว้สำหรับใช้โดยปลั๊กอิน Error Prone เป็นหลัก ซึ่งโหลดจากเส้นทางโปรเซสเซอร์คำอธิบายประกอบโดยใช้ java.util.ServiceLoader)
proguard_specs

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

ไฟล์ที่จะใช้เป็นข้อกำหนด Proguard ซึ่งจะอธิบายชุดข้อกำหนดที่ Proguard จะใช้ หากระบุไว้ ระบบจะเพิ่มรายการดังกล่าวลงในเป้าหมาย android_binary ใดก็ตามโดยขึ้นอยู่กับคลังนี้ ไฟล์ที่รวมไว้ที่นี่ต้องมีเฉพาะกฎที่ไม่มีผลข้างเคียง ได้แก่ -dontnote, -dontwarn, assumenosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏได้เฉพาะใน android_binaryproguard_specs เพื่อให้มั่นใจว่าการผสานจะไม่ซ้ำซ้อน
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 แบบปิด เมื่อเปิดใช้ hermetic สําหรับเป้าหมาย java_binary และหากเป้าหมายไม่ได้ ระบุที่เก็บ CDS ของตัวเองโดยการระบุแอตทริบิวต์ classlist ระบบจะแพ็กเกจ CDS เริ่มต้นของ java_runtime ไว้ใน JAR การติดตั้งใช้งาน hermetic
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 คุณเปลี่ยน Toolchain ที่จะใช้ได้ผ่านอาร์กิวเมนต์ --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

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

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

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

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

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

ลบล้าง --java_header_compilation เพื่อปิดใช้การคอมไพล์ส่วนหัวในแพลตฟอร์มที่ไม่รองรับ เช่น Bazel JDK 7
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 รองรับการทำงานเป็น Multiplex Persistent Worker เท็จหากไม่รองรับ
javac_supports_worker_multiplex_sandboxing

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

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

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

เป็นจริงหาก JavaBuilder รองรับการทำงานเป็น Worker แบบถาวร เป็นเท็จหากไม่รองรับ
javacopts

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

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

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

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