النقل من Maven إلى Bazel

توضّح هذه الصفحة كيفية نقل البيانات من Maven إلى Bazel، بما في ذلك المتطلبات الأساسية وخطوات التثبيت. ويوضّح هذا الاختلاف الاختلافات بين Maven وBazel، ويقدّم مثالاً لنقل البيانات باستخدام مشروع Guava.

عند نقل البيانات من أي أداة إصدار إلى Bazel، من الأفضل أن يتم تشغيل أدوات الإنشاء في الوقت نفسه إلى أن يتم نقل بيانات فريق التطوير ونظام CI وأي أنظمة أخرى ذات صلة. يمكنك تشغيل Maven وBazel في المستودع نفسه.

قبل البدء

  • ثبِّت تطبيق Bazel إذا لم يكن مثبَّتًا بعد.
  • إذا كنت مبتدئًا في استخدام Bazel، يمكنك الاطّلاع على البرنامج التعليمي مقدّمة عن Bazel: Build Java قبل بدء عملية نقل البيانات. يشرح البرنامج التعليمي مفاهيم Bazel وبنيتها وبنيتها وتصنيفها.

أوجه الاختلاف بين Maven وBazel

  • يستخدم Maven ملفات pom.xml ذات المستوى الأعلى. يتوافق Bazel مع ملفات الإصدار المتعددة والاستهدافات المتعددة لكل ملف BUILD، ما يسمح بالإصدارات التي تزيد سرعتها عن Maven'.
  • يتولى Maven مسؤولية تنفيذ خطوات عملية النشر. لا يعمل Bazel على النشر تلقائيًا.
  • يمكنك استخدام Bazel للتعبير عن تبعيتك بين اللغات.
  • أثناء إضافة أقسام جديدة إلى المشروع، قد تحتاج على Bazel إلى إضافة ملفات BUILD جديدة. وتتمثل أفضل ممارسة في إضافة ملف BUILD إلى كل حزمة Java جديدة.

نقل البيانات من Maven إلى Bazel

توضّح الخطوات أدناه كيفية نقل بيانات مشروعك إلى Bazel:

  1. إنشاء ملف WORKSPACE
  2. إنشاء ملف BUILD واحد
  3. إنشاء المزيد من ملفات BUILD
  4. البناء باستخدام Bazel

تأتي الأمثلة أدناه من عملية نقل مشروع Gavaava من Maven إلى Bazel. تمّ إطلاق مشروع Guava المُستخدَم في v31.1. لا تميّز الأمثلة التي تستخدِم GAva في كل خطوة في عملية نقل البيانات، ولكنها تعرض الملفات و المحتوى الذي يتم إنشاؤه أو إضافته يدويًا لعملية نقل البيانات.

$ git clone https://github.com/google/guava.git && cd guava
$ git checkout v31.1

1- إنشاء ملف WORKSPACE

أنشِئ ملفًا باسم WORKSPACE في جذر مشروعك. إذا لم يكن مشروعك يتضمن تبعيات خارجية، يمكن أن يكون ملف مساحة العمل فارغًا.

إذا كان مشروعك يعتمد على ملفات أو حِزم ليست في أحد أدلة المشروع، اختَر هذه التبعيات الخارجية في ملف workspace. لبرمجة بيانات المهام التابعة الخارجية لملف مساحة العمل، استخدِم rules_jvm_external. للحصول على تعليمات عن استخدام هذه القاعدة، يمكنك الاطّلاع على قراءة.

مثال على مشروع GAva: المهام التابعة الخارجية

يمكنك إدراج العناصر التابعة الخارجية لمشروع Gavaava باستخدام قاعدة البيانات 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 واحد

بعد أن تم الآن تحديد المهام التابعة لمساحة العمل والاعتماديات الخارجية (إن أمكن)، عليك إنشاء ملفات BUILD لوصف كيفية إنشاء مشروعك. على عكس Maven باستخدام ملف pom.xml واحد، يستطيع Bazel استخدام العديد من ملفات BUILD لإنشاء مشروع. تحدّد هذه الملفات أهداف إصدار متعدّدة، ما يسمح لتطبيق Bazel بإنشاء إصدارات متزايدة.

يجب إضافة BUILD ملف على مراحل. ابدأ بإضافة ملف BUILD واحدًا في جذر مشروعك واستخدمه لإجراء بناء مبدئي باستخدام Bazel. بعد ذلك، يتم تحسين الإصدار من خلال إضافة المزيد من ملفات BUILD باستخدام استهدافات أكثر دقة.

  1. في الدليل نفسه لملف WORKSPACE، أنشئ ملفًا نصيًا وامنحه اسمًا BUILD.

  2. في ملف BUILD هذا، استخدِم القاعدة المناسبة لإنشاء هدف واحد لإنشاء مشروعك. وفي ما يلي بعض النصائح:

    • استخدِم القاعدة المناسبة:

      • لإنشاء مشاريع باستخدام وحدة 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: استخدِم globb لإدراج جميع ملفات java .في مشروعك.
      • resources: استخدِم الكرة الأرضية لإدراج جميع الموارد في مشروعك.
      • deps: عليك تحديد المهام التابعة الخارجية التي يحتاج إليها مشروعك. على سبيل المثال، إذا أنشأت قائمة بالارتباطات الخارجية باستخدام الأداة generate_workspace، تكون ارتباطات تبعية java_library هي المكتبات المُدرَجة في وحدة الماكرو generated_java_libraries.
    • اطّلِع على مثال أدناه حول ملف BUILD ذي المستوى الأعلى من نقل بيانات مشروع Guava.

  3. الآن بعد أن أصبح لديك ملف BUILD في جذر مشروعك، يمكنك إنشاء مشروع لضمان عمله. في سطر الأوامر، من دليل مساحة العمل، استخدِم bazel build //:everything لإنشاء مشروعك باستخدام Bazel.

    تم بناء المشروع بنجاح باستخدام Bazel. عليك إضافة المزيد من ملفات BUILD للسماح للإصدارات المتزايدة للمشروع.

مثال على مشروع "جوفا": ابدأ بملف BUILD واحد

عند نقل بيانات مشروع Zava إلى Bazel، يتم في البداية استخدام ملف واحد (BUILD) لإنشاء المشروع بأكمله. في ما يلي محتوى ملف BUILD الأولي هذا في دليل Workspace:

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 المتعددة التي تتضمّن أهدافًا متعددة ستمنح الإصدار مزيدًا من الدقة، ما يسمح بما يلي:

  • زيادة عمليات البناء للمشروع،
  • عملية التنفيذ المتوازية للمبنى،
  • صيانة الإصدار بشكل أفضل للمستخدمين في المستقبل
  • التحكم في ظهور الأهداف بين الحِزم، ما قد يمنع حدوث مشاكل، مثل المكتبات التي تحتوي على تفاصيل التنفيذ التي يتم تسريبها على واجهات برمجة التطبيقات العامة.

نصائح لإضافة المزيد من ملفات BUILD:

  • يمكنك البدء بإضافة ملف BUILD إلى كل حزمة Java. ابدأ باستخدام حِزم Java التي تتضمّن أقل اعتماديات وتعمل على إعداد الحزم التي لها أكبر اعتماديات.
  • وعند إضافة ملفات BUILD وتحديد الأهداف، أضِف هذه الاستهدافات الجديدة إلى قسمَين (deps) من الأهداف التي تعتمد عليها. يُرجى العِلم أنّ الدالة glob() لا تتخطّى حدود الحزمة، لأنّ عدد الحِزم يزيد حجم الملفات المطابقة مع glob().
  • عند إضافة ملف BUILD إلى دليل main، يُرجى التأكّد من إضافة ملف BUILD إلى دليل test المقابل.
  • احرص على الحدّ من ظهور المحتوى بشكل صحيح بين الحِزم.
  • لتبسيط أخطاء تحديد المشاكل وحلّها في إعداد ملفات BUILD، تأكَّد من أنّ المشروع يواصل العمل باستخدام Bazel أثناء إضافة كل ملف إصدار. شغِّل bazel build //... لضمان استمرار إنشاء جميع أهدافك.

4. تصميم باستخدام Bazel

لقد أنشأت تطبيقك باستخدام Bazel أثناء إضافة ملفات BUILD للتحقّق من إعداد الإصدار.

عندما يكون لديك BUILD ملفًا بالدقة المطلوبة، يمكنك استخدام Bazel لإنشاء جميع إصداراتك.