هل هناك أداة لاكتشاف ما إذا كان نفس الفئة موجودة في العديد من الجرار في classpath?

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

  •  02-07-2019
  •  | 
  •  

سؤال

إذا كان لديك اثنين من الجرار في classpath التي تحتوي على إصدارات مختلفة من نفس الفئة ، classpath لكي يصبح حاسما.

أنا أبحث عن أداة التي يمكن الكشف عن و العلم مثل هذه الصراعات المحتملة في classpath أو مجموعة من المجلدات.

بالتأكيد السيناريو الذي يبدأ:

classes=`mktemp`
for i in `find . -name "*.jar"`
do
    echo "File: $i" > $classes
    jar tf $i > $classes
    ...
done

مع بعض ذكية نوعا ما/uniq/مهرجان دبي السينمائي الدولي/grep/awk في وقت لاحق المحتملة ، ولكن أنا أتساءل عما إذا كان أي شخص يعرف أي الحلول القائمة.

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

المحلول

على الفتان أداة من جبوس هو مرشح آخر:"بقعة إذا كان الصف/حزمة يقع في عدة ملفات JAR"

نصائح أخرى

يبدو jarfish سوف تفعل ما تريد مع "المغفلين" الأمر.

أعتقد أنه لن يكون من الصعب جدا أن أكتب أداة الذاتية الخاصة بك.

يمكنك الحصول على classpath إدخالات مع النظام.getProperty("جافا.فئة.مسار");

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

هذه المهمة سوف تأخذ 1 أو 2 أيام على الأكثر.ثم يمكنك تحميل هذه الفئة مباشرة في التطبيق الخاص بك و إنشاء تقرير.

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

هيريس أداة قد تجد من المفيد ، لم يسبق لي استخدامه نفسي ، ولكن يعطي هو محاولة واسمحوا لنا أن نعرف النتيجة.

http://www.jgoodies.com/freeware/jpathreport/features.html

إذا كنت تنوي إنشاء الخاصة بك أداة, هنا هو رمز تستخدم نفس شيل نشرت من قبل ، ولكن هذا أنا استخدامها على بلدي ويندوز آلة.أنه يعمل بشكل أسرع عندما يكون هناك طن من ملفات jar.

يمكنك استخدامه وتعديله وذلك بدلا من المشي بشكل متكرر دليل قراءة المسار الفئة ومقارنة .الدرجة الوقت المحدد السمة.

هناك أمر الدرجة يمكنك فرعية إذا لزم الأمر, لقد كنت أفكر في تنفيذ خيار "البحث"

هذا كود بلدي, لذلك كان لا يقصد بها أن تكون "إنتاج جاهزة" فقط للقيام بهذا العمل.

import java.io.*;
import java.util.zip.*;


public class ListZipContent{
    public static void main( String [] args ) throws IOException {
        System.out.println( "start " + new java.util.Date() );
        String pattern = args.length == 1 ? args[0] : "OracleDriver.class";// Guess which class I was looking for :) 
        File file = new File(".");
        FileFilter fileFilter = new FileFilter(){
            public boolean accept( File file ){
                return file.isDirectory() || file.getName().endsWith( "jar" );
            }
        };
        Command command = new Command( pattern );
        executeRecursively( command, file, fileFilter );
        System.out.println( "finish  " + new java.util.Date() );
    }
    private static void executeRecursively( Command command, File dir , FileFilter filter ) throws IOException {
        if( !dir.isDirectory() ){
            System.out.println( "not a directory " + dir );
            return;
        }
        for( File file : dir.listFiles( filter ) ){
            if( file.isDirectory()){
                executeRecursively( command,file , filter );
            }else{
                command.executeOn( file );
            }
        }
    }
}
class Command {

    private String pattern;
    public Command( String pattern ){
        this.pattern = pattern;
    }

    public void executeOn( File file ) throws IOException {
        if( pattern == null ) { 
            System.out.println( "Pattern is null ");
            return;
        }

        String fileName = file.getName();
        boolean jarNameAlreadyPrinted = false;

        ZipInputStream zis = null;
        try{
            zis = new ZipInputStream( new FileInputStream( file ) );

            ZipEntry ze;
            while(( ze = zis.getNextEntry() ) != null ) {
                if( ze.getName().endsWith( pattern )){
                    if( !jarNameAlreadyPrinted ){
                        System.out.println("Contents of: " + file.getCanonicalPath()  );
                        jarNameAlreadyPrinted = true;
                    }
                    System.out.println( "    " + ze.getName() );
                }
                zis.closeEntry();
            }
        }finally{
            if( zis != null ) try {
                zis.close();
            }catch( Throwable t ){}
        }
    }
}

آمل أن يساعد هذا.

Classpath مساعد هو الكسوف في المكونات التي تساعد قليلا.

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

ls *.jar | xargs -n1 -iFILE unzip -l FILE | grep class | sed "s,.* ,," | tr "/" "." | sort | uniq -d | xargs -n1 -iCLASS grep -l CLASS *.jar | sort -u

(هو بطيئة بعض الشيء على المدى إذا كان لديك الكثير من الجرار)

التفسير:وهو يسرد كافة الملفات في كل الجرار ، greps لفئة ملفات يجد المغفلين, ثم greps الأصلي الجرار أن نرى فيها أنها ظهرت.أنها يمكن أن تكون أكثر كفاءة مع أكثر تعقيدا النصي.

jarclassfinder آخر كسوف المساعد الخيار

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