كيف يمكنني إزالة الزغب من مكتبة تابعة لجهة خارجية؟

StackOverflow https://stackoverflow.com/questions/38305

  •  09-06-2019
  •  | 
  •  

سؤال

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

من الواضح أن هناك مشاكل مع هذا.على وجه التحديد، سيناريو الاستخدام الذي وضعته قد لا يستخدم جميع الفئات طوال الوقت.

لكن هل يمكن إهمال هذه المشاكل من حيث المبدأ؟

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

المحلول

هناك طريقة.

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

التحقق من ذلك في http://code.google.com/p/jarjar/.

وهذا رابط حول تقليص الجرار: http://sixlegs.com/blog/java/jarjar-keep.html

نصائح أخرى

هناك أداة في Ant تسمى classfileset.يمكنك تحديد قائمة الفئات الجذرية التي تعرف أنك بحاجة إليها، ثم تقوم مجموعة ملفات الفئة بتحليل التعليمات البرمجية الخاصة بها بشكل متكرر للعثور على جميع التبعيات.

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

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

في وظيفة سابقة، استخدمت أداة تعتيم Java، بالإضافة إلى تشويش التعليمات البرمجية، وإزالة الفئات والأساليب التي لم يتم استخدامها.إذا كنت تقوم بـ "Class.byName" أو أي نوع آخر من عناصر الانعكاس، فستحتاج إلى إخبار المُعتم لأنه لا يستطيع من خلال فحص الكود معرفة الفئات أو الأساليب التي يطلق عليها الانعكاس.

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

jar هو مجرد ملف مضغوط، لذا أعتقد أنه يمكنك ذلك.إذا تمكنت من الوصول إلى المصدر، فهو أنظف.ربما حاول تفكيك الفصل؟

إضافة إلى هذا السؤال، هل يمكن أن يؤدي ذلك إلى تحسين الأداء؟نظرًا لأن الفئات غير المستخدمة لن يتم تجميعها بواسطة JIT لتحسين وقت بدء التشغيل أو هل تكتشف Java ذلك تلقائيًا أثناء التجميع إلى الرمز الثانوي ولا تتعامل حتى مع الكود غير المستخدم؟

سيكون هذا مشروعًا مثيرًا للاهتمام (هل قام أحد بذلك بالفعل؟)

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

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