أداة ⁦JAR⁩

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

  1. بديل مباشر — ⁦elide jar -- [OPTION...]⁩ يمرر الوسائط مباشرةً إلى الأداة المدمجة دون أي تكلفة لتشغيل ⁦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التحقق من اتساق واجهة برمجة التطبيقات في ملفات ⁦JAR⁩ متعددة الإصدارات

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

الخيارالوصف
-f FILE⁩، ⁦—file=FILEاسم ملف الأرشيف (إذا حُذف يُستخدم المدخل/المخرج القياسي)
-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⁩ غير وحداتي إلى وحداتي:

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⁩ للوثائق.

الإعلان عن المخرجات

تُعرَّف المخرجات تحت تعيين ⁦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⁩ للوثائق ⁦(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⁩ ويجب أن تظهر قبل الفاصل ⁦--⁩. تأتي ملفات المصادر بعد ⁦--⁩.