หน้านี้อธิบายวิธีย้ายข้อมูลจาก Maven ไปยัง Bazel รวมถึง ข้อกำหนดเบื้องต้นและขั้นตอนการติดตั้ง ซึ่งอธิบายความแตกต่างระหว่าง Maven และ Bazel และให้ตัวอย่างการย้ายข้อมูลโดยใช้โปรเจ็กต์ Guava
เมื่อย้ายข้อมูลจากเครื่องมือบิลด์ใดก็ตามไปยัง Bazel ควรมีเครื่องมือบิลด์ทั้งคู่ พร้อมกันจนกว่าคุณจะย้ายทีมพัฒนาโดยสมบูรณ์ หรือ CI และระบบอื่นๆ ที่เกี่ยวข้อง คุณสามารถเรียกใช้ Maven และ Bazel ได้ ที่เก็บได้
ก่อนเริ่มต้น
- ติดตั้ง Bazel หากยังไม่ได้ติดตั้ง
- หากคุณยังไม่เคยใช้ Bazel มาก่อน โปรดดูบทแนะนำข้อมูลเบื้องต้นเกี่ยวกับ Bazel: สร้าง Java ก่อนเริ่มย้ายข้อมูล บทแนะนำจะอธิบาย แนวคิด โครงสร้าง และไวยากรณ์ของป้ายกำกับของ Bazel
ความแตกต่างระหว่าง Maven และ Bazel
- Maven ใช้ไฟล์
pom.xml
ระดับบนสุด Bazel รองรับไฟล์บิลด์หลายไฟล์ และหลายเป้าหมายต่อBUILD
ไฟล์ ทำให้สามารถสร้างบิลด์ที่มี ซึ่งเพิ่มขึ้นกว่าของ Maven - Maven จะดูแลขั้นตอนต่างๆ ในกระบวนการทำให้ใช้งานได้ Bazel ไม่ การทำให้ใช้งานได้โดยอัตโนมัติ
- Bazel ให้คุณแสดงทรัพยากร Dependency ระหว่างภาษาได้
- เมื่อเพิ่มส่วนใหม่ให้กับโปรเจ็กต์ คุณอาจต้องเพิ่มส่วนใหม่ด้วย Bazel
BUILD
ไฟล์ แนวทางปฏิบัติแนะนำคือเพิ่มไฟล์BUILD
ลงใน Java ใหม่แต่ละรายการ ใหม่
ย้ายข้อมูลจาก Maven ไปยัง Bazel
ขั้นตอนด้านล่างอธิบายวิธีย้ายข้อมูลโปรเจ็กต์ไปยัง Bazel
ตัวอย่างด้านล่างมาจากการย้ายข้อมูลของ Guava
โปรเจ็กต์ จาก Maven ไปยัง Bazel
โปรเจ็กต์ Guava ที่ใช้คือรุ่น v31.1
ตัวอย่างที่ใช้ Guava ไม่ได้เดิน
ผ่านแต่ละขั้นตอนในการย้ายข้อมูล แต่จะแสดงไฟล์และเนื้อหาที่
สร้างหรือเพิ่มด้วยตนเองสำหรับการย้ายข้อมูล
$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1
1. สร้างไฟล์ MODULE.bazel
สร้างไฟล์ชื่อ MODULE.bazel
ที่รูทของโปรเจ็กต์ หากโปรเจ็กต์ของคุณ
ไม่มีทรัพยากร Dependency ภายนอก ไฟล์นี้จึงอาจว่างเปล่า
หากโปรเจ็กต์ของคุณต้องใช้ไฟล์หรือแพ็กเกจที่ไม่ได้อยู่ในหนึ่งใน
ไดเรกทอรีของโปรเจ็กต์ ให้ระบุทรัพยากร Dependency ภายนอกเหล่านี้ใน MODULE.bazel
คุณใช้ rules_jvm_external
เพื่อจัดการทรัพยากร Dependency จาก Maven ได้ สำหรับ
คำแนะนำเกี่ยวกับการใช้ชุดกฎนี้ โปรดดู
README
ที่ใช้เวลาเพียง 2 นาที
ตัวอย่างโปรเจ็กต์ Guava: ทรัพยากร Dependency ภายนอก
คุณสามารถระบุรายการทรัพยากร Dependency ภายนอกของ Guava ได้
โปรเจ็กต์ที่มี
rules_jvm_external
เพิ่มข้อมูลโค้ดต่อไปนี้ลงในไฟล์ MODULE.bazel
bazel_dep(name = "rules_jvm_external", version = "6.2")
maven = use_extension("@rules_jvm_external//:extensions.bzl", "maven")
maven.install(
artifacts = [
"com.google.code.findbugs:jsr305:3.0.2",
"com.google.errorprone:error_prone_annotations:2.11.0",
"com.google.j2objc:j2objc-annotations:1.3",
"org.codehaus.mojo:animal-sniffer-annotations:1.20",
"org.checkerframework:checker-qual:3.12.0",
],
repositories = [
"https://repo1.maven.org/maven2",
],
)
use_repo(maven, "maven")
2. สร้างไฟล์ BUILD ไฟล์เดียว
ตอนนี้คุณมีพื้นที่ทำงานที่กำหนดไว้และทรัพยากร Dependency ภายนอกแล้ว (หาก
(หากมี) คุณต้องสร้างไฟล์ BUILD
ไฟล์เพื่ออธิบายวิธี
ควรสร้าง Bazel สามารถใช้ไฟล์ที่แตกต่างจาก Maven ที่มีไฟล์ pom.xml
เพียงไฟล์เดียว
ไฟล์ BUILD
หลายไฟล์เพื่อสร้างโปรเจ็กต์ ไฟล์เหล่านี้ระบุหลายบิลด์
ซึ่งทำให้ Bazel ผลิตงานสร้างเพิ่มขึ้นได้
เพิ่ม BUILD
ไฟล์ทีละไฟล์ เริ่มต้นด้วยการเพิ่มไฟล์ BUILD
หนึ่งไฟล์ที่รูทของ
โปรเจ็กต์ของคุณและใช้เพื่อสร้างงานสร้างเริ่มต้นโดยใช้ Bazel จากนั้นปรับแต่ง
ด้วยการเพิ่มไฟล์ BUILD
ที่มีเป้าหมายละเอียดยิ่งขึ้น
ในไดเรกทอรีเดียวกับไฟล์
MODULE.bazel
ให้สร้างไฟล์ข้อความและ ตั้งชื่อว่าBUILD
ในไฟล์
BUILD
นี้ ให้ใช้กฎที่เหมาะสมเพื่อสร้างเป้าหมาย 1 รายการที่จะสร้าง โปรเจ็กต์ของคุณ มาดูเคล็ดลับบางส่วนกันใช้กฎที่เหมาะสมดังนี้
หากต้องการสร้างโปรเจ็กต์ด้วยโมดูล Maven เดี่ยว ให้ใช้
java_library
กฎต่อไปนี้java_library( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], )
หากต้องการสร้างโปรเจ็กต์ที่มีโมดูล Maven หลายรายการ ให้ใช้
java_library
กฎต่อไปนี้java_library( name = "everything", srcs = glob([ "Module1/src/main/java/**/*.java", "Module2/src/main/java/**/*.java", ... ]), resources = glob([ "Module1/src/main/resources/**", "Module2/src/main/resources/**", ... ]), deps = ["//:all-external-targets"], )
หากต้องการสร้างไบนารี ให้ใช้กฎ
java_binary
:java_binary( name = "everything", srcs = glob(["src/main/java/**/*.java"]), resources = glob(["src/main/resources/**"]), deps = ["//:all-external-targets"], main_class = "com.example.Main" )
ระบุแอตทริบิวต์ต่อไปนี้
name
: ตั้งชื่อที่สื่อความหมายให้เป้าหมาย ในตัวอย่าง ด้านบน เป้าหมายจะเรียกว่า "ทุกอย่าง"srcs
: ใช้ globbing เพื่อแสดงไฟล์ .java ทั้งหมดในโปรเจ็กต์ของคุณresources
: ใช้เสียงเพื่อแสดงทรัพยากรทั้งหมดในโปรเจ็กต์deps
: คุณต้องกำหนดว่าทรัพยากร Dependency ภายนอกใด ความต้องการของโครงการ
ลองดูตัวอย่างด้านล่างของ BUILD ระดับบนสุดนี้ จากการย้ายข้อมูลของโปรเจ็กต์ Guava
ตอนนี้คุณมีไฟล์
BUILD
ที่รูทของโปรเจ็กต์แล้ว ให้สร้างไฟล์ เพื่อให้แน่ใจว่าใช้งานได้ ในบรรทัดคำสั่ง จากพื้นที่ทำงาน ให้ใช้bazel build //:everything
เพื่อสร้างโปรเจ็กต์ด้วย Bazelตอนนี้โปรเจ็กต์ได้สร้างด้วย Bazel เสร็จสมบูรณ์แล้ว คุณจะต้องเพิ่ม ไฟล์
BUILD
เพิ่มเติมเพื่ออนุญาตให้มีบิลด์ของโปรเจ็กต์ที่เพิ่มขึ้น
ตัวอย่างโปรเจ็กต์ Guava: เริ่มต้นด้วยไฟล์ BUILD ไฟล์เดียว
เมื่อย้ายข้อมูลโปรเจ็กต์ Guava ไปยัง Bazel ในตอนแรกจะมีการใช้ไฟล์ BUILD
1 ไฟล์เพื่อ
สร้างทั้งโปรเจ็กต์ เนื้อหาของไฟล์ BUILD
เริ่มต้นนี้ใน
ไดเรกทอรีพื้นที่ทำงาน
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
javacopts = ["-XepDisableAllChecks"],
deps = [
"@maven//:com_google_code_findbugs_jsr305",
"@maven//:com_google_errorprone_error_prone_annotations",
"@maven//:com_google_j2objc_j2objc_annotations",
"@maven//:org_checkerframework_checker_qual",
"@maven//:org_codehaus_mojo_animal_sniffer_annotations",
],
)
3. สร้างไฟล์ BUILD เพิ่มเติม (ไม่บังคับ)
Bazel ทำงานกับ BUILD file
เพียงรายการเดียว ตามที่คุณเห็นหลังจากทำ
บิลด์แรก คุณควรพิจารณาแบ่งบิลด์ออกเป็นส่วนย่อยๆ
กำลังเพิ่มไฟล์อีก BUILD
ไฟล์ที่มีเป้าหมายแบบละเอียด
ไฟล์ BUILD
หลายไฟล์ที่มีหลายเป้าหมายจะทำให้บิลด์เพิ่มขึ้น
ที่ละเอียดขึ้น ซึ่งทำให้:
- ได้งานสร้างของโปรเจ็กต์เพิ่มขึ้น
- เพิ่มการดำเนินการพร้อมกันของบิลด์
- ความสามารถในการบำรุงรักษาบิลด์สำหรับผู้ใช้ในอนาคตได้ดีขึ้น และ
- ควบคุมการมองเห็นเป้าหมายระหว่างแพ็กเกจได้ ซึ่งจะป้องกัน เช่น ไลบรารีที่มีรายละเอียดการใช้งานที่รั่วไหล API สาธารณะ
เคล็ดลับในการเพิ่มไฟล์ BUILD
เพิ่มเติม
- คุณสามารถเริ่มต้นด้วยการเพิ่มไฟล์
BUILD
ลงในแพ็กเกจ Java แต่ละแพ็กเกจ เริ่มต้นด้วย Java แพ็กเกจที่มีทรัพยากร Dependency น้อยที่สุดและทำงานจนถึงแพ็กเกจนั้นๆ ที่มีทรัพยากร Dependency มากที่สุด - เมื่อเพิ่มไฟล์
BUILD
รายการและระบุเป้าหมายแล้ว ให้เพิ่มเป้าหมายใหม่เหล่านี้ลงในไฟล์deps
ส่วนของเป้าหมายที่เกี่ยวข้อง โปรดทราบว่าglob()
ไม่ข้ามขอบเขตของแพ็กเกจ ดังนั้นเมื่อจำนวนแพ็กเกจ การขยายไฟล์ที่ตรงกันโดยglob()
จะลดขนาดลง - ทุกครั้งที่คุณเพิ่มไฟล์
BUILD
ในไดเรกทอรีmain
โปรดตรวจสอบว่าคุณได้เพิ่มBUILD
ไปยังไดเรกทอรีtest
ที่ตรงกัน - ตรวจสอบการจำกัดระดับการเข้าถึงระหว่างแพ็กเกจอย่างเหมาะสม
- หากต้องการให้แก้ปัญหาข้อผิดพลาดในการตั้งค่าไฟล์
BUILD
รายการได้ง่ายขึ้น โปรด ที่โปรเจ็กต์จะสร้างขึ้นต่อไปด้วย Bazel เมื่อคุณเพิ่มไฟล์บิลด์แต่ละรายการ เรียกใช้bazel build //...
เพื่อให้แน่ใจว่าเป้าหมายทั้งหมดยังคงสร้างได้
4. สร้างโดยใช้ Bazel
คุณได้ดำเนินการสร้างโดยใช้ Bazel โดยการเพิ่มไฟล์ BUILD
ไฟล์เพื่อตรวจสอบการตั้งค่า
ของบิลด์
เมื่อมีไฟล์ BUILD
ตามรายละเอียดที่ต้องการ คุณสามารถใช้ Bazel เพื่อ
จะผลิตงานสร้างทั้งหมดของคุณขึ้นมา