أداة ⁦JAR⁩

يُوفِّر ⁦Elide⁩ أداة jar مترجمة إلى صورة أصلية — نفس التطبيق الموجود في ⁦JDK⁩، لكنه مترجم مسبقاً باستخدام ⁦GraalVM⁩. هذا يُزيل عبء بدء تشغيل ⁦JVM⁩ بالكامل، مما يجعل تجميع ⁦JAR⁩ شبه فوري حتى في سكريبتات وخطوط أنابيب ⁦CI⁩ حيث كانت تكلفة البدء البارد لـ ⁦JVM⁩ ستهيمن على الوقت. يتم الكشف عنه بطريقتين:

  1. بديل مباشر — يمرر ⁦elide jar -- [OPTION...]⁩ الوسائط مباشرة إلى أداة ⁦jar⁩ المدمجة بدون تكلفة بدء تشغيل ⁦JVM⁩.
  2. التكامل مع نظام البناء — يجمّع ⁦elide build⁩ ملفات ⁦JAR⁩ تلقائياً بناءً على تصريحات القطع الأثرية في ⁦elide.pkl⁩.

هناك اختصار ثالث — ⁦elide javac --jar⁩ — يترجم شيفرة ⁦Java⁩ المصدرية ويُحزِّم النتيجة في ملف ⁦JAR⁩ في خطوة واحدة.

---

الاستخدام كبديل مباشر

يكشف ⁦elide jar⁩ عن تطبيق ⁦sun.tools.jar.JarToolProvider⁩ المدمج — المترجم إلى صورة أصلية، لذا يبدأ فوراً بدون ⁦JVM⁩. يتم تمرير جميع الوسائط بعد ⁦--⁩ إلى الأداة الأساسية كما هي، مما يمنحك توافقاً كاملاً مع استدعاءات ⁦jar⁩ الحالية بجزء بسيط من وقت البدء.

elide jar -- [OPTION...] [ [--release VERSION] [-C dir] files] ...
ملاحظة

لا توجد خيارات خاصة بـ ⁦Elide⁩ قبل ⁦--⁩ في الوقت الحالي. لا يزال فاصل ⁦--⁩ مطلوباً.

تنسيق المسار

يجب تحديد وسائط الملفات والمجلدات كمسارات، وليس كأسماء ملفات مجردة. استخدم ⁦./Foo.class⁩ أو ⁦./classes.jar⁩ أو مسارات مطلقة مثل ⁦/path/to/file⁩. الأسماء المجردة بدون بادئة مسار (مثل ⁦Foo.class⁩) ستُنتج خطأ.

العمليات الرئيسية

العلَمالمختصرالوصف
—create-cإنشاء أرشيف
—extract-xاستخراج ملفات من أرشيف
—list-tعرض جدول المحتويات
—update-uتحديث أرشيف موجود
—describe-module-dطباعة واصف الوحدة أو اسم الوحدة التلقائي
—validateالتحقق من اتساق واجهة ⁦API⁩ عبر الإصدارات في ⁦JAR⁩ متعدد الإصدارات

المُعدِّلات الشائعة

العلَمالوصف
-f FILE، —file=FILEاسم ملف الأرشيف (حذفه لاستخدام ⁦stdin/stdout⁩)
-C DIR .التبديل إلى المجلد المحدد وتضمين جميع ملفاته
-m FILE، —manifest=FILEتضمين البيان من الملف المحدد
-M، —no-manifestعدم إنشاء بيان
-e CLASS، —main-class=CLASSنقطة دخول التطبيق لملفات ⁦JAR⁩ القابلة للتنفيذ
—release VERSIONوضع الملفات التالية تحت ⁦META-INF/versions/VERSION/
—module-version=VERSIONتعيين إصدار الوحدة
—module-pathموقع تبعيات الوحدة لحساب التجزئة
—hash-modules=PATTERNحساب وتسجيل تجزئات الوحدات المطابقة
-0، —no-compressتخزين فقط؛ بدون ضغط ⁦ZIP⁩
—date=TIMESTAMPطابع زمني بتنسيق ⁦ISO-8601⁩ لبيانات المدخلات الوصفية
-k، —keep-old-filesعدم الكتابة فوق الملفات الموجودة أثناء الاستخراج
—dirالمجلد الذي يتم الاستخراج إليه
-v، —verboseإخراج مفصّل

أمثلة

إنشاء أرشيف من ملفَي فئة:

bash
 elide jar -- --create --file ./classes.jar ./Foo.class ./Bar.class

إنشاء أرشيف من مجلد مع بيان مخصص:

bash
 elide jar -- --create --file ./classes.jar --manifest ./mymanifest -C ./foo/ .

إنشاء ملف ⁦JAR⁩ وحدوي قابل للتنفيذ:

bash
 elide jar -- --create --file ./app.jar --main-class com.example.Main --module-version 1.0 \
 -C ./build/classes .

تحديث ملف ⁦JAR⁩ غير وحدوي إلى ⁦JAR⁩ وحدوي:

bash
 elide jar -- --update --file ./app.jar --main-class com.example.Main --module-version 1.0 \
 -C ./build/classes module-info.class

إنشاء ملف ⁦JAR⁩ متعدد الإصدارات:

bash
 elide jar -- --create --file ./mr.jar -C ./foo classes --release 9 -C ./foo9 classes

عرض محتويات ملف ⁦JAR⁩:

bash
 elide jar -- --list --file ./app.jar

استخراج ملف ⁦JAR⁩ إلى مجلد:

bash
 elide jar -- --extract --file ./app.jar --dir ./extracted

---

التكامل مع نظام البناء

عند استخدام ⁦elide build⁩ مع ملف مشروع ⁦elide.pkl⁩، تتم معالجة تحزيم ⁦JAR⁩ تلقائياً بواسطة رسم مهام البناء. يتم دعم ثلاثة أنواع من القطع الأثرية: ملفات ⁦JAR⁩ للفئات، وملفات ⁦JAR⁩ للمصادر، وملفات ⁦JAR⁩ لـ ⁦Javadoc⁩.

التصريح بالقطع الأثرية

يتم التصريح بالقطع الأثرية تحت تعيين ⁦artifacts⁩ في ⁦elide.pkl⁩. استورد ⁦elide:Jvm.pkl⁩ للوصول إلى أنواع ⁦JAR⁩:

pkl
amends "elide:project.pkl"
import "elide:Jvm.pkl" as Jvm
import "elide:Sources.pkl" as Src

name = "my-library"

sources {
  ["main"] = new Src.SourceSetSpec {
    paths {
      "src/main/java<<>>*.java"
    }
  }
}

artifacts {
  ["app"] = new Jvm.Jar {
    name = "my-library"
    sources { "main" }
  }
  ["sources"] = new Jvm.SourceJar {
    from { "main" }
  }
  ["docs"] = new Jvm.JavadocJar {
    from { "main" }
  }
}

⁦JAR⁩ الفئات (⁦Jvm.Jar⁩)

يُحزِّم ملفات ⁦.class⁩ المترجمة من مهام الترجمة السابقة، مع أي موارد مُصرَّح بها، في ملف ⁦JAR⁩ واحد. يتم توليد البيان تلقائياً ويتضمن ⁦Manifest-Version⁩ و ⁦Created-By⁩ و ⁦Implementation-Title⁩ و ⁦Implementation-Version⁩ و ⁦Main-Class⁩ (إذا تم تكوين نقطة دخول).

مسار الإخراج:artifacts/jar/{name}/{name}.jarالخيارات:
الحقلالنوعالافتراضيالوصف
nameString?مفتاح القطعة الأثريةاسم ملف ⁦JAR⁩ الناتج (بدون ⁦.jar⁩)
sourcesListing<String>{ "main" }مجموعات المصادر التي يتم تضمين فئاتها المترجمة
resourcesMapping<path, path>فارغملفات الموارد المُضمَّنة في ⁦JAR⁩
manifestMapping<String, String>فارغإدخالات بيان إضافية (مفتاح-قيمة)
manifestFileString?لا شيءمسار ملف بيان لاستخدامه
excludesListing<String>فارغأنماط ⁦glob⁩ للملفات المراد استبعادها
options.compressBooleantrueتطبيق ضغط ⁦ZIP⁩ أم لا
options.defaultManifestPropertiesBooleantrueإضافة إدخالات البيان القياسية أم لا
options.entrypointString?لا شيءالفئة الرئيسية لملف ⁦JAR⁩ قابل للتنفيذ
مثال — ⁦JAR⁩ قابل للتنفيذ:
pkl
artifacts {
  ["app"] = new Jvm.Jar {
    name = "my-app"
    sources { "main" }
    options {
      entrypoint = "com.example.Main"
    }
  }
}
مثال — مع إدخالات بيان مخصصة:
pkl
artifacts {
  ["app"] = new Jvm.Jar {
    name = "my-library"
    sources { "main" }
    manifest {
      ["Implementation-Vendor"] = "Acme Corp"
      ["Bundle-SymbolicName"] = "com.example.my-library"
    }
  }
}
مثال — مع موارد مُضمَّنة:
pkl
artifacts {
  ["app"] = new Jvm.Jar {
    name = "my-app"
    sources { "main" }
    resources {
      ["/config/defaults.properties"] = "src/main/resources/defaults.properties"
    }
  }
}

⁦JAR⁩ المصادر (⁦Jvm.SourceJar⁩)

يُحزِّم الملفات المصدرية من مجموعات المصادر المُصرَّح بها في ملف ⁦JAR⁩ مع مُصنِّف ⁦-sources⁩. يُستخدم عادةً لدعم بيئة التطوير المتكاملة ونشر ⁦Maven⁩.

مسار الإخراج:artifacts/jar/{name}/{name}-sources.jar
الحقلالنوعالافتراضيالوصف
fromListing<String>فارغمجموعات المصادر المراد تحزيمها
classifierString?"sources"مُصنِّف مخصص لاسم ملف الإخراج
excludesListing<String>فارغأنماط ⁦glob⁩ للاستبعاد
includesListing<String>فارغأنماط ⁦glob⁩ للتضمين
مثال:
pkl
artifacts {
  ["sources"] = new Jvm.SourceJar {
    from { "main" }
    excludes { "**/*.generated.java" }
  }
}

⁦JAR⁩ لـ ⁦Javadoc⁩ (⁦Jvm.JavadocJar⁩)

يُشغِّل أداة ⁦javadoc⁩ على ملفات ⁦Java⁩ المصدرية ويُحزِّم وثائق ⁦HTML⁩ الناتجة في ملف ⁦JAR⁩ مع مُصنِّف ⁦-javadoc⁩.

مسار الإخراج:artifacts/jar/{name}/{name}-javadoc.jar
الحقلالنوعالافتراضيالوصف
fromListing<String>فارغمجموعات المصادر التي تحتوي على ملفات ⁦Java⁩ المراد توثيقها
linksListing<String>فارغعناوين وثائق خارجية للربط
excludesListing<String>فارغأنماط حزم للاستبعاد
windowTitleString?"{name} API"عنوان نافذة المتصفح
docTitleString?"{name} API Documentation"عنوان صفحة الوثائق
groupsMapping<String, Listing<String>>فارغتجميعات الحزم (العنوان -> الحزم)
مثال:
pkl
artifacts {
  ["docs"] = new Jvm.JavadocJar {
    from { "main" }
    windowTitle = "My Library API"
    links {
      "https:<<>>
    }
    excludes { "com.example.internal" }
  }
}

---

الترجمة والتحزيم في خطوة واحدة

يقبل ⁦elide javac⁩ علَم ⁦--jar⁩ الذي يترجم ملفات ⁦Java⁩ المصدرية ويُحزِّم الفئات المترجمة فوراً في ملف ⁦JAR⁩، بدون الحاجة إلى استدعاء ⁦elide jar⁩ منفصل.

bash
 elide javac --jar < output.jar> [--manifest < manifest-file>] -- <source files...>

يذهب إخراج الترجمة إلى ⁦target/⁩ في مجلد العمل الحالي. ثم يتم تجميع ملف ⁦JAR⁩ من ذلك المجلد.

مثال — الترجمة والتحزيم:
bash
 elide javac --jar ./target/app.jar -- ./src/Main.java ./src/Util.java
مثال — مع بيان مخصص:
bash
 elide javac --jar ./target/app.jar --manifest ./src/MANIFEST.MF -- ./src/Main.java
ملاحظة

--jar⁩ و ⁦--manifest⁩ هما علامتا ⁦Elide⁩ ويجب أن تظهرا قبل فاصل ⁦--⁩. الملفات المصدرية تأتي بعد ⁦--⁩.