หน้านี้อธิบายวิธีย้ายข้อมูลจาก Maven ไปยัง Bazel รวมถึง ข้อกำหนดเบื้องต้นและขั้นตอนการติดตั้ง ซึ่งจะอธิบายความแตกต่าง ระหว่าง Maven และ Bazel และแสดงตัวอย่างการย้ายข้อมูลโดยใช้ Guava Project
เมื่อย้ายข้อมูลจากเครื่องมือสร้างใดก็ตามไปยัง Bazel วิธีที่ดีที่สุดคือมีบิลด์ทั้ง 2 แบบ เครื่องมือที่ทำงานพร้อมกันจนกว่าคุณจะย้ายข้อมูลทีมพัฒนาของคุณอย่างสมบูรณ์ ระบบ 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. สร้างไฟล์ WORKSPACE
สร้างไฟล์ชื่อ WORKSPACE
ที่รูทของโปรเจ็กต์ หากโปรเจ็กต์ของคุณ
ไม่มีทรัพยากร Dependency ภายนอก ไฟล์พื้นที่ทำงานอาจว่างเปล่า
หากโปรเจ็กต์ของคุณต้องใช้ไฟล์หรือแพ็กเกจที่ไม่ได้อยู่ในหนึ่งใน
ไดเรกทอรีของโปรเจ็กต์ ให้ระบุทรัพยากร Dependency ภายนอกเหล่านี้ในพื้นที่ทำงาน
หากต้องการให้แสดงรายการทรัพยากร Dependency ภายนอกสำหรับไฟล์พื้นที่ทำงานโดยอัตโนมัติ
ใช้ rules_jvm_external
สำหรับคำแนะนำเกี่ยวกับการใช้ชุดกฎนี้ โปรดดู
README
ตัวอย่างโปรเจ็กต์ Guava: ทรัพยากร Dependency ภายนอก
คุณสามารถระบุรายการทรัพยากร Dependency ภายนอกของ
โปรเจ็กต์ Guava ที่มี
rules_jvm_external
เพิ่มข้อมูลโค้ดต่อไปนี้ลงในไฟล์ WORKSPACE
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
RULES_JVM_EXTERNAL_TAG = "4.3"
RULES_JVM_EXTERNAL_SHA = "6274687f6fc5783b589f56a2f1ed60de3ce1f99bc4e8f9edef3de43bdf7c6e74"
http_archive(
name = "rules_jvm_external",
sha256 = RULES_JVM_EXTERNAL_SHA,
strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,
url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)
load("@rules_jvm_external//:defs.bzl", "maven_install")
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",
],
)
2. สร้างไฟล์ BUILD ไฟล์เดียว
ตอนนี้คุณมีพื้นที่ทำงานที่กำหนดไว้และทรัพยากร Dependency ภายนอกแล้ว (หาก
(ที่เกี่ยวข้อง) คุณต้องสร้างไฟล์ BUILD
ไฟล์เพื่ออธิบายวิธีโปรเจ็กต์
ควรสร้างขึ้นมา Bazel สามารถใช้ไฟล์ pom.xml
ซึ่งต่างจาก Maven
BUILD
ไฟล์เพื่อสร้างโครงการ ไฟล์เหล่านี้ระบุหลายเป้าหมายบิลด์
ซึ่งทำให้ Bazel ผลิตงานสร้างเพิ่มขึ้นได้
เพิ่ม BUILD
ไฟล์ทีละไฟล์ เริ่มต้นด้วยการเพิ่มไฟล์ BUILD
1 ไฟล์
ที่รูทของโปรเจ็กต์และใช้เพื่อสร้างบิลด์เริ่มต้นโดยใช้ Bazel
จากนั้นปรับแต่งบิลด์โดยเพิ่มไฟล์ BUILD
ที่มีความละเอียดมากขึ้น
เป้าหมาย
ในไดเรกทอรีเดียวกับไฟล์
WORKSPACE
ให้สร้างไฟล์ข้อความและ ตั้งชื่อว่า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 ภายนอกใด ความต้องการของโครงการ ตัวอย่างเช่น หากคุณสร้างรายการภายนอก ทรัพยากร Dependency ที่ใช้เครื่องมือgenerate_workspace
, ทรัพยากร Dependency สำหรับjava_library
คือไลบรารีที่แสดงในgenerated_java_libraries
ดูที่ ตัวอย่างด้านล่างของไฟล์ BUILD ระดับบนสุดนี้จาก การย้ายข้อมูลของโปรเจ็กต์ Guava
ตอนนี้คุณมีไฟล์
BUILD
ที่รูทของโปรเจ็กต์แล้ว ให้สร้าง เพื่อให้แน่ใจว่าทุกอย่างทำงานได้ ในบรรทัดคำสั่งจาก ของ Google Workspace ให้ใช้bazel build //:everything
เพื่อสร้าง กับ Bazelตอนนี้โปรเจ็กต์ได้สร้างด้วย Bazel เสร็จสมบูรณ์แล้ว คุณจะต้องมี เพิ่มไฟล์
BUILD
รายการเพื่อให้มีการสร้างโปรเจ็กต์เพิ่มขึ้น
ตัวอย่างโปรเจ็กต์ Guava: เริ่มต้นด้วยไฟล์ BUILD ไฟล์เดียว
เมื่อย้ายข้อมูลโปรเจ็กต์ Guava ไปยัง Bazel ระบบจะใช้ไฟล์ BUILD
เพียงไฟล์แรก
เพื่อสร้างทั้งโปรเจ็กต์ เนื้อหาของBUILD
เริ่มต้นนี้มีดังนี้
ไฟล์ในไดเรกทอรีพื้นที่ทำงาน
java_library(
name = "everything",
srcs = glob([
"guava/src/**/*.java",
"futures/failureaccess/src/**/*.java",
]),
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 ได้
ในการผลิตงานสร้างทั้งหมดของคุณ