سؤال

هل من الممكن تحديد جافا classpath يتضمن ملف جرة موجود في ملف جرة آخر؟

هل كانت مفيدة؟

المحلول

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

أود أن أذكر أيضًا أن Uberjar و Shade هما مكونات إضافية لـ Maven1 و Maven2 على التوالي. كما هو مذكور أدناه ، يمكنك أيضًا استخدام المكون الإضافي للتجميع (والذي في الواقع أكثر قوة ، ولكنه أصعب بكثير للتكوين بشكل صحيح).

نصائح أخرى

أنت لا تريد استخدام حلول "expr jar contents". إنها بالتأكيد تجعل من الصعب رؤية الأشياء (نظرًا لأن كل شيء ينفجر في نفس المستوى). علاوة على ذلك ، يمكن أن يكون هناك تعارضات تسمية (لا ينبغي أن يحدث إذا كان الناس يستخدمون الحزم المناسبة ، لكن لا يمكنك دائمًا التحكم في هذا).

الميزة التي تريدها هي واحدة من أعلى 25 شمس RFES: RFE 4648386, التي تم تعيينها ، في حكمتها اللانهائية ، على أنها ذات أولوية منخفضة. لا يمكننا إلا أن نأمل أن تستيقظ الشمس ...

في غضون ذلك ، فإن أفضل حل صادفته (والذي أتمنى أن تنسخه الشمس في JDK) هو استخدام محمل الفئة المخصصة Jarclassloader.

بعد بعض الأبحاث ، وجدت طريقة لا تتطلب Maven أو أي تمديد/برنامج طرف ثالث.

يمكنك استخدام "Class-Path" في ملف الخاص بك.

فمثلا:

إنشاء ملف واضح

Manifest-Version: 1.0
Created-By: Bundle
Class-Path: ./custom_lib.jar
Main-Class: YourMainClass

قم بتجميع جميع الفصول الدراسية وتشغيلها jar cfm Testing.jar MANIFEST.MF *.class custom_lib.jar

c يرمز إلى إنشاء أرشيفf يشير إلى أنك تريد تحديد الملفv هو للإدخال المطولm يعني أننا سنمرر ملفًا واضحًا مخصصًا

تأكد من تضمين lib في حزمة جرة. يجب أن تكون قادرًا على تشغيل الجرة بالطريقة العادية.

مرتكز على: http://www.ibm.com/developerworks/library/j-5things6/

جميع المعلومات الأخرى التي تحتاجها حول المسار الصفي الذي تجده هنا

استخدم ال Zipgroupfileset العلامة (يستخدم نفس السمات مثل أ ملفات بطاقة شعار)؛ سوف يفصل جميع الملفات في الدليل ويضيف إلى ملف الأرشيف الجديد. معلومات اكثر: http://ant.apache.org/manual/tasks/zip.html

هذه طريقة مفيدة للغاية للالتفاف على مشكلة الجرة في الجار-وأنا أعلم لأنني قد غوغل هذا السؤال الدقيق Stackoverflow أثناء محاولة معرفة ما يجب القيام به. إذا كنت ترغب في حزم جرة أو مجلد من الجرار في جرة واحدة مبنية مع النمل ، فنسى كل هذه الأشياء المكوّنة الإضافية أو الطرف الثالث ، كل ما يجب عليك فعله هو (في النمل):

<jar destfile="your.jar" basedir="java/dir">
  ...
  <zipgroupfileset dir="dir/of/jars" />
</jar>

إذا كنت تقوم ببناء ANT (أنا أستخدم ANT من Eclipse) ، يمكنك فقط إضافة ملفات JAR الإضافية بقول Ant لإضافتها ... ليس بالضرورة أفضل طريقة إذا كان لديك مشروع يحتفظ به العديد من الأشخاص ولكنه يعمل لمشروع شخص واحد وسهلة.

على سبيل المثال ، كان هدفي الذي كان يقوم ببناء ملف .jar:

<jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
    <manifest>
        <attribute name="Author" value="ntg"/>
        ................................
        <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
    </manifest>
</jar>

لقد أضفت للتو سطرًا واحدًا لجعله:

<jar ....">
    <zipgroupfileset dir="${external-lib-dir}" includes="*.jar"/>
    <manifest>
        ................................
    </manifest>
</jar>

أين

<property name="external-lib-dir" 
          value="C:\...\eclipseWorkspace\Filter\external\...\lib" />

كان دير مع الجرار الخارجية. وهذا كل شيء...

ليس من دون كتابة محمل الفصل الخاص بك. يمكنك إضافة الجرار إلى Classpath في الجرة ، ولكن يجب أن تكون متورطة ، غير موجودة في الجرة الرئيسية.

تحتاج إلى إنشاء محمل فئة مخصص للقيام بذلك أو مكتبة طرف ثالث تدعم هذا. أفضل رهان لك هو استخراج الجرة من وقت التشغيل وإضافتها إلى classpath (أو إضافةها بالفعل إلى classpath).

أستخدم Maven لبناء Java الخاص بي والذي يحتوي على مكون إضافي يسمى مافن تجميع البرنامج المساعد.

إنه يفعل ما تسألك ، ولكن كما تصف بعض الاقتراحات الأخرى - تنفجر بشكل أساسي جميع الجرار التابعة وإعادة تجميعها في جرة واحدة

إذا كان لديك ECLPISE IDE ، فأنت بحاجة فقط إلى تصدير الجرة الخاصة بك واختيار "حزمة المكتبات المطلوبة في جرة تم إنشاؤها". سيقوم Eclipse تلقائيًا بإضافة الجرار المطلوبة المعتمدة في الجرة التي تم إنشاؤها وكذلك إنشاء بعض محمل الفئة المخصصة Eclipse التي تقوم بتحميل هذه الجرار تلقائيًا.

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

وينستون جيد جدا http://blog.jayway.com/2008/11/28/executable-wart-withstone-maven-plugin/. ولكن ليس للمواقع المعقدة. وهذا عار لأن كل ما يتطلبه الأمر هو تضمين البرنامج المساعد.

حسنًا ، هناك طريقة سهلة للغاية إذا كنت تستخدم Eclipse.

قم بتصدير مشروعك كملف جرة "Runnable" (انقر بزر الماوس الأيمن فوق مجلد المشروع من داخل Eclipse ، حدد "تصدير ..."). عند تكوين إعدادات التصدير ، تأكد من تحديد "استخراج المكتبات المطلوبة في جرة تم إنشاؤها". ضع في اعتبارك ، حدد "استخراج ..." و ليس "الحزمة المطلوبة المكتبات ...".

بالإضافة إلى ذلك: يجب عليك تحديد تكوين التشغيل في إعدادات التصدير الخاصة بك. لذلك ، يمكنك دائمًا إنشاء Main () فارغ () في بعض الفصول واستخدامه لتكوين التشغيل الخاص بك.

على أي حال ، ليس كذلك مضمون للعمل بنسبة 100 ٪ من الوقت - حيث ستلاحظ رسالة منبثقة تخبرك بالتأكد من التحقق من تراخيص ملفات JAR التي تضمنها وشيء حول عدم نسخ ملفات التوقيع. ومع ذلك ، لقد كنت أفعل هذا من أجل سنوات ولم يواجه مشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top