জাভা এবং বেজেল

এই পৃষ্ঠাটিতে সম্পদ রয়েছে যা আপনাকে জাভা প্রকল্পগুলির সাথে বেজেল ব্যবহার করতে সহায়তা করে। এটি একটি টিউটোরিয়াল, বিল্ড নিয়ম এবং অন্যান্য তথ্যের সাথে সংযুক্ত করে যা বেজেলের সাথে জাভা প্রকল্পগুলি তৈরি করার জন্য নির্দিষ্ট করে।

Bazel সঙ্গে কাজ

নিম্নলিখিত সংস্থানগুলি আপনাকে জাভা প্রকল্পগুলিতে বেজেলের সাথে কাজ করতে সহায়তা করবে:

Bazel অভিবাসন

আপনি যদি বর্তমানে Maven এর সাথে আপনার জাভা প্রকল্পগুলি তৈরি করেন, তাহলে Bazel এর সাথে আপনার Maven প্রকল্পগুলি তৈরি করতে মাইগ্রেশন গাইডের ধাপগুলি অনুসরণ করুন:

জাভা সংস্করণ

জাভার দুটি প্রাসঙ্গিক সংস্করণ রয়েছে যা কনফিগারেশন ফ্ল্যাগের সাথে সেট করা আছে:

  • রিপোজিটরিতে সোর্স ফাইলের সংস্করণ
  • জাভা রানটাইমের সংস্করণ যা কোডটি কার্যকর করতে এবং এটি পরীক্ষা করতে ব্যবহৃত হয়

আপনার সংগ্রহস্থলে সোর্স কোডের সংস্করণ কনফিগার করা হচ্ছে

একটি অতিরিক্ত কনফিগারেশন ছাড়া, Bazel অনুমান করে যে সংগ্রহস্থলের সমস্ত জাভা সোর্স ফাইল একটি একক জাভা সংস্করণে লেখা হয়েছে। রিপোজিটরিতে উত্সগুলির সংস্করণ নির্দিষ্ট করতে .bazelrc ফাইলে build --java_language_version={ver} যোগ করুন, যেখানে {ver} উদাহরণ 11 । Bazel সংগ্রহস্থলের মালিকদের এই পতাকা সেট করা উচিত যাতে Bazel এবং এর ব্যবহারকারীরা সোর্স কোডের Java সংস্করণ নম্বর উল্লেখ করতে পারে। আরো বিস্তারিত জানার জন্য, জাভা ভাষার সংস্করণ পতাকা দেখুন।

কোড চালানো এবং পরীক্ষা করতে ব্যবহৃত JVM কনফিগার করা

Bazel সংকলনের জন্য একটি JDK এবং কোড চালানো এবং পরীক্ষা করার জন্য অন্য JVM ব্যবহার করে।

ডিফল্টরূপে Bazel একটি JDK ব্যবহার করে কোডটি কম্পাইল করে এটি ডাউনলোড করে এবং এটি স্থানীয় মেশিনে ইনস্টল করা JVM দিয়ে কোডটি কার্যকর করে এবং পরীক্ষা করে। JAVA_HOME বা পথ ব্যবহার করে JVM অনুসন্ধান করে।

ফলস্বরূপ বাইনারিগুলি সিস্টেম লাইব্রেরিতে স্থানীয়ভাবে ইনস্টল করা JVM-এর সাথে সামঞ্জস্যপূর্ণ, যার মানে ফলস্বরূপ বাইনারিগুলি মেশিনে কী ইনস্টল করা আছে তার উপর নির্ভর করে।

নির্বাহ এবং পরীক্ষার জন্য ব্যবহৃত JVM কনফিগার করতে --java_runtime_version পতাকা ব্যবহার করুন। ডিফল্ট মান হল local_jdk

হারমেটিক পরীক্ষা এবং সংকলন

একটি হারমেটিক কম্পাইল তৈরি করতে, আপনি কমান্ড লাইন পতাকা ব্যবহার করতে পারেন --java_runtime_version=remotejdk_11 । কোডটি রিমোট রিপোজিটরি থেকে ডাউনলোড করা JVM-এর জন্য সংকলিত, কার্যকর করা এবং পরীক্ষা করা হয়েছে। আরো বিস্তারিত জানার জন্য, Java রানটাইম সংস্করণ পতাকা দেখুন।

জাভাতে বিল্ড টুলের কম্পাইলেশন এবং এক্সিকিউশন কনফিগার করা

সরঞ্জামগুলি তৈরি এবং কার্যকর করতে ব্যবহৃত JDK এবং JVM-এর দ্বিতীয় জোড়া রয়েছে, যা বিল্ড প্রক্রিয়াতে ব্যবহৃত হয়, কিন্তু বিল্ড ফলাফলে নয়। যে JDK এবং JVM --tool_java_language_version এবং --tool_java_runtime_version ব্যবহার করে নিয়ন্ত্রিত হয়। ডিফল্ট মান যথাক্রমে 11 এবং remotejdk_11

স্থানীয়ভাবে ইনস্টল করা JDK ব্যবহার করে কম্পাইল করা হচ্ছে

ডিফল্টভাবে Bazel দূরবর্তী JDK ব্যবহার করে কম্পাইল করে, কারণ এটি JDK এর অভ্যন্তরীণকে ওভাররাইড করছে। স্থানীয়ভাবে ইনস্টল করা JDK ব্যবহার করে কম্পাইলেশন টুলচেইনগুলি কনফিগার করা হয়েছে, তবে ব্যবহার করা হয় না।

স্থানীয়ভাবে ইনস্টল করা JDK ব্যবহার করে কম্পাইল করতে, অর্থাৎ স্থানীয় JDK-এর জন্য কম্পাইলেশন টুলচেইন ব্যবহার করুন, অতিরিক্ত ফ্ল্যাগ ব্যবহার --extra_toolchains=@local_jdk//:all , তবে, মনে রাখবেন যে এটি নির্বিচারে বিক্রেতাদের JDK-এ কাজ নাও করতে পারে।

আরও বিস্তারিত জানার জন্য, Java টুলচেইন কনফিগার করা দেখুন।

সেরা অনুশীলন

সাধারণ Bazel সেরা অনুশীলনগুলি ছাড়াও, নীচে জাভা প্রকল্পগুলির জন্য নির্দিষ্ট সেরা অনুশীলনগুলি রয়েছে৷

ডিরেক্টরি গঠন

মাভেনের স্ট্যান্ডার্ড ডিরেক্টরি বিন্যাস পছন্দ করুন ( src/main/java এর অধীনে উত্স, src/test/java এর অধীনে পরীক্ষা)।

ফাইল তৈরি করুন

আপনার BUILD ফাইল তৈরি করার সময় এই নির্দেশিকাগুলি অনুসরণ করুন:

  • জাভা উত্স ধারণকারী ডিরেক্টরি প্রতি একটি BUILD ফাইল ব্যবহার করুন, কারণ এটি বিল্ড কর্মক্ষমতা উন্নত করে।

  • প্রতিটি BUILD ফাইলে একটি java_library নিয়ম থাকা উচিত যা দেখতে এইরকম:

    java_library(
        name = "directory-name",
        srcs = glob(["*.java"]),
        deps = [...],
    )
    
  • লাইব্রেরির নামটি BUILD ফাইল ধারণকারী ডিরেক্টরির নাম হওয়া উচিত। এটি লাইব্রেরির লেবেলটিকে ছোট করে তোলে, যা "//package:package" এর পরিবর্তে "//package" ব্যবহার করে।

  • উত্সগুলি ডিরেক্টরির সমস্ত জাভা ফাইলগুলির একটি নন-রিকারসিভ glob হওয়া উচিত।

  • টেস্টগুলি src/test এর অধীনে একটি ম্যাচিং ডিরেক্টরিতে হওয়া উচিত এবং এই লাইব্রেরির উপর নির্ভর করে৷

উন্নত জাভা বিল্ডের জন্য নতুন নিয়ম তৈরি করা হচ্ছে

দ্রষ্টব্য : নতুন নিয়ম তৈরি করা উন্নত বিল্ড এবং পরীক্ষার পরিস্থিতির জন্য। Bazel দিয়ে শুরু করার সময় আপনার এটির প্রয়োজন নেই।

নিম্নলিখিত মডিউল, কনফিগারেশন টুকরো এবং প্রদানকারীরা আপনাকে আপনার জাভা প্রকল্পগুলি তৈরি করার সময় Bazel এর ক্ষমতা প্রসারিত করতে সহায়তা করবে:

জাভা টুলচেইন কনফিগার করা হচ্ছে

ব্যাজেল দুই ধরনের জাভা টুলচেইন ব্যবহার করে: - এক্সিকিউশন, জাভা বাইনারি চালানো এবং পরীক্ষা করার জন্য ব্যবহৃত হয়, --java_runtime_version ফ্ল্যাগ দ্বারা নিয়ন্ত্রিত - সংকলন, জাভা সোর্স কম্পাইল করতে ব্যবহৃত, --java_language_version পতাকা দ্বারা নিয়ন্ত্রিত

অতিরিক্ত এক্সিকিউশন টুলচেইন কনফিগার করা হচ্ছে

এক্সিকিউশন টুলচেন হল JVM, হয় স্থানীয় বা একটি সংগ্রহস্থল থেকে, এর সংস্করণ, অপারেটিং সিস্টেম এবং CPU আর্কিটেকচার সম্পর্কে কিছু অতিরিক্ত তথ্য সহ।

জাভা এক্সিকিউশন টুলচেইনগুলি WORKSPACE ফাইলে local_java_repository বা remote_java_repository নিয়ম ব্যবহার করে যোগ করা যেতে পারে। নিয়ম যোগ করা একটি পতাকা ব্যবহার করে JVM উপলব্ধ করে। যখন একই অপারেটিং সিস্টেম এবং CPU আর্কিটেকচারের একাধিক সংজ্ঞা দেওয়া হয়, প্রথমটি ব্যবহার করা হয়।

স্থানীয় JVM এর উদাহরণ কনফিগারেশন:

load("@bazel_tools//tools/jdk:local_java_repository.bzl", "local_java_repository")

local_java_repository(
  name = "additionaljdk",          # Can be used with --java_runtime_version=additionaljdk, --java_runtime_version=11 or --java_runtime_version=additionaljdk_11
  version = 11,                    # Optional, if not set it is autodetected
  java_home = "/usr/lib/jdk-15/",  # Path to directory containing bin/java
)

দূরবর্তী JVM এর উদাহরণ কনফিগারেশন:

load("@bazel_tools//tools/jdk:remote_java_repository.bzl", "remote_java_repository")

remote_java_repository(
  name = "openjdk_canary_linux_arm",
  prefix = "openjdk_canary", # Can be used with --java_runtime_version=openjdk_canary_11
  version = "11",            # or --java_runtime_version=11
  target_compatible_with = [   # Specifies constraints this JVM is compatible with "@platforms//cpu:arm",
    "@platforms//os:linux",
  ],
  urls = ...,               # Other parameters are from http_repository rule.
  sha256 = ...,
  strip_prefix = ...
)

অতিরিক্ত কম্পাইলেশন টুলচেইন কনফিগার করা হচ্ছে

কম্পাইলেশন টুলচেন JDK এবং একাধিক টুলের সমন্বয়ে গঠিত যা Bazel সংকলনের সময় ব্যবহার করে এবং যেগুলি অতিরিক্ত বৈশিষ্ট্য প্রদান করে, যেমন: ত্রুটি প্রবণ, কঠোর জাভা নির্ভরতা, হেডার সংকলন, অ্যান্ড্রয়েড ডিসুগারিং, কভারেজ ইনস্ট্রুমেন্টেশন এবং IDE-এর জন্য জেনক্লাস হ্যান্ডলিং।

JavaBuilder হল একটি Bazel-bundled টুল যা সংকলন সম্পাদন করে এবং পূর্বোক্ত বৈশিষ্ট্য প্রদান করে। প্রকৃত সংকলন JDK দ্বারা অভ্যন্তরীণ কম্পাইলার ব্যবহার করে নির্বাহ করা হয়। কম্পাইলেশনের জন্য ব্যবহৃত JDK java_runtime বৈশিষ্ট্য দ্বারা নির্দিষ্ট করা হয়।

Bazel কিছু JDK অভ্যন্তরীণ ওভাররাইড করে। JDK সংস্করণ > 9 এর ক্ষেত্রে, java.compiler এবং jdk.compiler মডিউলগুলি JDK-এর পতাকা --patch_module ব্যবহার করে প্যাচ করা হয়। JDK সংস্করণ 8-এর ক্ষেত্রে, জাভা কম্পাইলার -Xbootclasspath পতাকা ব্যবহার করে প্যাচ করা হয়।

VanillaJavaBuilder হল JavaBuilder-এর একটি দ্বিতীয় বাস্তবায়ন, যা JDK-এর অভ্যন্তরীণ কম্পাইলারকে পরিবর্তন করে না এবং এতে কোনো অতিরিক্ত বৈশিষ্ট্য নেই। VanillaJavaBuilder কোনো বিল্ট-ইন টুলচেইন দ্বারা ব্যবহৃত হয় না।

JavaBuilder ছাড়াও, Bazel কম্পাইলেশনের সময় অন্যান্য অনেক টুল ব্যবহার করে।

ijar টুল কল স্বাক্ষর ছাড়া সবকিছু মুছে ফেলার জন্য jar ফাইল প্রক্রিয়া করে। ফলাফল জারগুলিকে হেডার জার বলা হয়। কোনো ফাংশনের বডি পরিবর্তিত হলে শুধুমাত্র ডাউনস্ট্রিম ডিপেন্ডেন্টদের পুনরায় কম্পাইল করে সংকলন বৃদ্ধির উন্নতি করতে ব্যবহার করা হয়।

একক singlejar টুল একাধিক jar ফাইলকে একত্রে প্যাক করে।

genclass টুলটি একটি জাভা সংকলনের আউটপুট পোস্ট-প্রসেস করে এবং টীকা প্রসেসর দ্বারা উত্পন্ন উত্সগুলির জন্য শুধুমাত্র ক্লাস ফাইল ধারণকারী একটি jar তৈরি করে।

JacocoRunner টুল ইনস্ট্রুমেন্টেড ফাইলের উপর Jacoco চালায় এবং LCOV ফর্ম্যাটে ফলাফল আউটপুট করে।

TestRunner টুল নিয়ন্ত্রিত পরিবেশে JUnit 4 পরীক্ষা চালায়।

আপনি একটি BUILD ফাইলে default_java_toolchain ম্যাক্রো যোগ করে এবং WORKSPACE ফাইলে register_toolchains নিয়ম যোগ করে অথবা --extra_toolchains পতাকা ব্যবহার করে সংকলনটি পুনরায় কনফিগার করতে পারেন।

টুলচেনটি শুধুমাত্র তখনই ব্যবহৃত হয় যখন source_version বৈশিষ্ট্যটি --java_language_version ফ্ল্যাগ দ্বারা নির্দিষ্ট করা মানের সাথে মেলে।

টুলচেন কনফিগারেশনের উদাহরণ:

load(
  "@bazel_tools//tools/jdk:default_java_toolchain.bzl",
  "default_java_toolchain", "DEFAULT_TOOLCHAIN_CONFIGURATION", "BASE_JDK9_JVM_OPTS", "DEFAULT_JAVACOPTS"
)

default_java_toolchain(
  name = "repository_default_toolchain",
  configuration = DEFAULT_TOOLCHAIN_CONFIGURATION,        # One of predefined configurations
                                                          # Other parameters are from java_toolchain rule:
  java_runtime = "@bazel_tools//tools/jdk:remote_jdk11", # JDK to use for compilation and toolchain's tools execution
  jvm_opts = BASE_JDK9_JVM_OPTS + ["--enable_preview"],   # Additional JDK options
  javacopts = DEFAULT_JAVACOPTS + ["--enable_preview"],   # Additional javac options
  source_version = "9",
)

যা --extra_toolchains=//:repository_default_toolchain_definition ব্যবহার করে বা কর্মক্ষেত্রে register_toolchains("//:repository_default_toolchain_definition") যোগ করে ব্যবহার করা যেতে পারে।

পূর্বনির্ধারিত কনফিগারেশন:

  • DEFAULT_TOOLCHAIN_CONFIGURATION : সমস্ত বৈশিষ্ট্য, JDK সংস্করণ সমর্থন করে >= 9
  • VANILLA_TOOLCHAIN_CONFIGURATION : কোনো অতিরিক্ত বৈশিষ্ট্য নেই, নির্বিচারে বিক্রেতাদের JDK সমর্থন করে৷
  • PREBUILT_TOOLCHAIN_CONFIGURATION : ডিফল্ট হিসাবে একই, কিন্তু শুধুমাত্র পূর্বনির্মাণ সরঞ্জাম ব্যবহার করুন ( ijar , singlejar )
  • NONPREBUILT_TOOLCHAIN_CONFIGURATION : ডিফল্ট হিসাবে একই, তবে সমস্ত সরঞ্জাম উত্স থেকে তৈরি করা হয়েছে (এটি বিভিন্ন libc সহ অপারেটিং সিস্টেমে কার্যকর হতে পারে)

JVM এবং Java কম্পাইলার পতাকা কনফিগার করা হচ্ছে

আপনি JVM এবং javac পতাকাগুলিকে পতাকা সহ বা default_java_toolchain বৈশিষ্ট্যগুলির সাথে কনফিগার করতে পারেন।

প্রাসঙ্গিক পতাকাগুলি হল --jvmopt , --host_jvmopt , --javacopt , এবং --host_javacopt

প্রাসঙ্গিক default_java_toolchain বৈশিষ্ট্যগুলি হল javacopts , jvm_opts , javabuilder_jvm_opts , এবং turbine_jvm_opts

প্যাকেজ নির্দিষ্ট জাভা কম্পাইলার পতাকা কনফিগারেশন

আপনি default_java_toolchain এর package_configuration বৈশিষ্ট্য ব্যবহার করে নির্দিষ্ট উৎস ফাইলের জন্য বিভিন্ন জাভা কম্পাইলার ফ্ল্যাগ কনফিগার করতে পারেন। নীচের উদাহরণ পড়ুন দয়া করে.

load("@bazel_tools//tools/jdk:default_java_toolchain.bzl", "default_java_toolchain")

# This is a convenience macro that inherits values from Bazel's default java_toolchain
default_java_toolchain(
    name = "toolchain",
    package_configuration = [
        ":error_prone",
    ],
    visibility = ["//visibility:public"],
)

# This associates a set of javac flags with a set of packages
java_package_configuration(
    name = "error_prone",
    javacopts = [
        "-Xep:MissingOverride:ERROR",
    ],
    packages = ["error_prone_packages"],
)

# This is a regular package_group, which is used to specify a set of packages to apply flags to
package_group(
    name = "error_prone_packages",
    packages = [
        "//foo/...",
        "-//foo/bar/...", # this is an exclusion
    ],
)

একটি একক সংগ্রহস্থলে জাভা সোর্স কোডের একাধিক সংস্করণ

Bazel শুধুমাত্র একটি বিল্ডে জাভা উৎসের একটি একক সংস্করণ কম্পাইল করা সমর্থন করে। নির্মাণ এর মানে হল যে একটি জাভা পরীক্ষা বা একটি অ্যাপ্লিকেশন তৈরি করার সময়, সমস্ত নির্ভরতা একই জাভা সংস্করণের বিরুদ্ধে তৈরি করা হয়।

যাইহোক, পৃথক বিল্ড বিভিন্ন পতাকা ব্যবহার করে মৃত্যুদন্ড কার্যকর করা যেতে পারে।

বিভিন্ন পতাকা ব্যবহারের কাজটিকে সহজ করার জন্য, একটি নির্দিষ্ট সংস্করণের জন্য পতাকার .bazelrc সাথে গোষ্ঠীভুক্ত করা যেতে পারে":

build:java8 --java_language_version=8
build:java8 --java_runtime_version=localjdk_8
build:java11 --java_language_version=11
build:java11 --java_runtime_version=remotejdk_11

এই কনফিগারগুলি --config পতাকার সাথে ব্যবহার করা যেতে পারে, উদাহরণস্বরূপ bazel test --config=java11 //:java11_test