কয়েক ডজন জেআর ফাইলের ভিতরে কোথাও একটি ক্লাস সন্ধান করবেন?


249

প্রচুর জার ফাইলের মধ্যে আপনি একটি নির্দিষ্ট শ্রেণীর নাম কীভাবে খুঁজে পাবেন?

(প্রকৃত শ্রেণীর নাম সন্ধান করছেন, এটি উল্লেখ করা ক্লাসগুলি নয়))


1
আমি এইগুলির কোনও উত্তর সম্পর্কে জানি না, তবে আপনি যদি জেআর ফাইলের অসংখ্য সহ একটি ওয়ার্কিং প্রজেক্টে ক্লাসটি ব্যবহার করে ক্লাসের নামটিতে আপনার কার্সারটি চাপান, তার উপর ডান ক্লিক করুন এবং ডিক্লারেশন ওপেন ক্লিক করুন (তবে ক্লিক করুন) আমার জন্য কী কাজ করে? F3) শুরু; তারপরে এটি নতুন ট্যাবের শীর্ষে JAR ফাইলটি তালিকাভুক্ত করা উচিত।
এন্ড্রু

উত্তর:


59

গ্রহনটি এটি করতে পারে, কেবল একটি (অস্থায়ী) প্রকল্প তৈরি করতে পারে এবং আপনার লাইব্রেরিগুলি প্রকল্পের ক্লাসপথে রেখে দেয়। তারপরে আপনি ক্লাসগুলি সহজেই খুঁজে পেতে পারেন।

আর একটি সরঞ্জাম, যা আমার মনে আসে, তা হল জাভা ডেকম্পিলার। এটি একবারে প্রচুর জার খুলতে পারে এবং পাশাপাশি ক্লাসগুলি সন্ধান করতে সহায়তা করে।


22
এবং Ctrl + শিফট + টি এর
সহায়তায়

408

ইউনিক্স

লিনাক্সে, অন্যান্য ইউনিক্স ভেরিয়েন্টগুলি, উইন্ডোজে গিট বাশ, বা সাইগউইন, jar(বা unzip -v) grep, এবং findআদেশগুলি ব্যবহার করে।

নিম্নলিখিত দেওয়া সমস্ত নামের সাথে মেলে এমন সমস্ত শ্রেণীর ফাইলের তালিকা:

for i in *.jar; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done

আপনি যে জাভা সংরক্ষণাগারগুলি অনুসন্ধান করতে চান তার পুরো তালিকাটি যদি আপনি জানেন তবে আপনি সেগুলিকে (প্রতীকী) লিঙ্কগুলি ব্যবহার করে একই ডিরেক্টরিতে রাখতে পারেন।

অথবা findপ্রদত্ত শ্রেণীর নাম রয়েছে এমন জেআর ফাইলটি খুঁজে পেতে (সংবেদনশীলভাবে কেস) ব্যবহার করুন :

find path/to/libs -name '*.jar' -exec grep -Hls ClassName {} \;

উদাহরণস্বরূপ, সংরক্ষণাগারটির সমন্বিত নামটির সন্ধান করতে IdentityHashingStrategy:

$ find . -name '*.jar' -exec grep -Hsli IdentityHashingStrategy {} \;
./trove-3.0.3.jar

JAR যদি সিস্টেমের যে কোনও জায়গায় থাকতে পারে এবং locateকমান্ডটি উপলব্ধ থাকে:

for i in $(locate "*.jar");
  do echo "$i"; jar -tvf "$i" | grep -Hsi ClassName;
done

একটি বাক্য গঠন বৈচিত্র:

find path/to/libs -name '*.jar' -print | \
  while read i; do jar -tvf "$i" | grep -Hsi ClassName && echo "$i"; done 

উইন্ডোজ

একটি কমান্ড প্রম্পট খুলুন , জেআর ফাইলযুক্ত ডিরেক্টরিতে (বা পূর্বপুরুষের ডিরেক্টরিতে) পরিবর্তন করুন, তারপরে:

for /R %G in (*.jar) do @jar -tvf "%G" | find "ClassName" > NUL && echo %G

এখানে কিভাবে এটা কাজ করে:

  1. for /R %G in (*.jar) do- সমস্ত জেআর ফাইলের উপর লুপ, পুনরাবৃত্তভাবে ডিরেক্টরিগুলি অনুসরণ করে; ফাইল নাম সংরক্ষণ করুন %G
  2. @jar -tvf "%G" |- প্রদত্ত সংরক্ষণাগারটির মধ্যে সমস্ত ফাইলের নাম তালিকাভুক্ত করতে জাভা সংরক্ষণাগার কমান্ডটি চালান, এবং ফলাফলগুলি স্ট্যান্ডার্ড আউটপুটে লিখুন; @প্রতীক শুষে কমান্ডের আবাহন মুদ্রণ।
  3. find "ClassName" > NUL- প্রদত্ত শ্রেণীর নামের জন্য জার কমান্ডের আউটপুট থেকে পাইপযুক্ত স্ট্যান্ডার্ড ইনপুট; এটি ERRORLEVELমিললে 1 তে সেট হবে যদি কোনও মিল থাকে (অন্যথায় 0)।
  4. && echo %G- iff ERRORLEVELশূন্য-না হলে, জাভা সংরক্ষণাগার ফাইলের নামটি স্ট্যান্ডার্ড আউটপুটে (কনসোল) লিখুন।

ওয়েব

JAR ফাইলগুলি স্ক্যান করে এমন একটি অনুসন্ধান ইঞ্জিন ব্যবহার করুন ।


3
হ্যাঁ-এল আপনাকে এটি দেবে, তবে স্টিডিনের কাছ থেকে এর ইনপুট পাওয়ার সময় খুব কার্যকর নয়।
জর্জ আর্মহোল্ড

60

কিছু সময় আগে, আমি ঠিক তার জন্য একটি প্রোগ্রাম লিখেছিলাম: https://github.com/javalite/jar-explorer


4
শুধু ক্লাস নয়, যে কোনও ধরণের ফাইল সন্ধান করে। ফাইলের সামগ্রীগুলি দেখতে ডাবল-ক্লিক করুন। হ্যাঁ, এখন আমি আমার সমস্ত বসন্ত-স্কিমার সন্ধান করতে পারি।
ক্রিস নয়ে

অসাধারণ. ধন্যবাদ;)
LppEdd

27
grep -l "classname" *.jar

আপনি জার নাম দেয়

find . -name "*.jar" -exec jar -t -f {} \; | grep  "classname"

আপনাকে ক্লাসের প্যাকেজ দেয়


5
এটা তোলে * জার, grep -lir "classname" হওয়া উচিত
লিওনার্ড Saers

12
#!/bin/bash

pattern=$1
shift

for jar in $(find $* -type f -name "*.jar")
do
  match=`jar -tvf $jar | grep $pattern`
  if [ ! -z "$match" ]
  then
    echo "Found in: $jar"
    echo "$match"
  fi
done

দুর্দান্ত! আমাকে এটিকে এমন সিস্টেমে ব্যবহার করতে হয়েছিল যার জার ছিল না (পথে নয়, যা), তাই আমি এর সাথে প্রতিস্থাপন jar -tvfকরেছি unzip -l
ixe013

9

প্রদত্ত স্ট্রিংয়ের সাথে মেলে এমন জারগুলি সনাক্ত করতে:

find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;


এটি ক্লাসের পাশাপাশি রেফারেন্সগুলি খুঁজে পায়, কেবল ক্লাস নিজেই নয়।
ট্রেভর রবিনসন

8

আমি যখন এই সমস্যাটি পেলাম তখন এটি করার কোনও ইউটিলিটি সম্পর্কে জানতাম না, তাই আমি নিম্নলিখিতটি লিখেছিলাম:

public class Main {

    /**
     * 
     */
    private static String CLASS_FILE_TO_FIND =
            "class.to.find.Here";
    private static List<String> foundIn = new LinkedList<String>();

    /**
     * @param args the first argument is the path of the file to search in. The second may be the
     *        class file to find.
     */
    public static void main(String[] args) {
        if (!CLASS_FILE_TO_FIND.endsWith(".class")) {
            CLASS_FILE_TO_FIND = CLASS_FILE_TO_FIND.replace('.', '/') + ".class";
        }
        File start = new File(args[0]);
        if (args.length > 1) {
            CLASS_FILE_TO_FIND = args[1];
        }
        search(start);
        System.out.println("------RESULTS------");
        for (String s : foundIn) {
            System.out.println(s);
        }
    }

    private static void search(File start) {
        try {
            final FileFilter filter = new FileFilter() {

                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(".jar") || pathname.isDirectory();
                }
            };
            for (File f : start.listFiles(filter)) {
                if (f.isDirectory()) {
                    search(f);
                } else {
                    searchJar(f);
                }
            }
        } catch (Exception e) {
            System.err.println("Error at: " + start.getPath() + " " + e.getMessage());
        }
    }

    private static void searchJar(File f) {
        try {
            System.out.println("Searching: " + f.getPath());
            JarFile jar = new JarFile(f);
            ZipEntry e = jar.getEntry(CLASS_FILE_TO_FIND);
            if (e == null) {
                e = jar.getJarEntry(CLASS_FILE_TO_FIND);
                if (e != null) {
                    foundIn.add(f.getPath());
                }
            } else {
                foundIn.add(f.getPath());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}


4

user1207523 এর স্ক্রিপ্টটি আমার পক্ষে ভাল কাজ করে। এখানে একটি বৈকল্পিক যা জার ফাইলগুলির জন্য সাধারণ প্রসারণের পরিবর্তে পুনরুক্তিভাবে অনুসন্ধান ব্যবহার করে অনুসন্ধান করে;

#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done

4

আমি সর্বদা এটি উইন্ডোজে ব্যবহার করেছি এবং এর ব্যতিক্রমীভাবে খুব ভালভাবে কাজ করেছে।

findstr /s /m /c:"package/classname" *.jar, where

Findstr.exe উইন্ডোজ এবং প্যারামগুলির সাথে আদর্শ আসে:

  • / s = পুনরাবৃত্তি
  • / মি = কোনও ফাইল মিললে কেবল ফাইলের নাম মুদ্রণ করুন
  • / সি = আক্ষরিক স্ট্রিং (এই ক্ষেত্রে আপনার প্যাকেজের নাম + শ্রেণীর নামগুলি '/' দ্বারা পৃথক করা হয়েছে)

আশা করি এটি কাউকে সাহায্য করবে।


3

bash scriptব্যবহার করে একটি সমাধান unzip (zipinfo)। পরীক্ষিত Ubuntu 12

#!/bin/bash

# ./jarwalker.sh "/a/Starting/Path" "aClassName"

IFS=$'\n'
jars=( $( find -P "$1" -type f -name "*.jar" ) )

for jar in ${jars[*]}
    do
        classes=( $( zipinfo -1 ${jar} | awk -F '/' '{print $NF}' | grep .class | awk -F '.' '{print $1}' ) )
        if [ ${#classes[*]} -ge 0 ]; then
            for class in ${classes[*]}
                do
                    if [ ${class} == "$2" ]; then
                        echo "Found in ${jar}"
                    fi
                done
        fi
    done

এই স্ক্রিপ্টটি
মিশ্রণযোগ্য

2

নির্দিষ্ট শ্রেণীর জন্য একটি প্রদত্ত ডিরেক্টরিতে সমস্ত জার ফাইলগুলি অনুসন্ধান করতে, আপনি এটি করতে পারেন:

ls *.jar | xargs grep -F MyClass

বা, এমনকি সহজ,

grep -F MyClass *.jar

আউটপুট এর মতো দেখাচ্ছে:

Binary file foo.jar matches

এটি খুব দ্রুত কারণ -F বিকল্পের অর্থ স্থির স্ট্রিং অনুসন্ধান করা, সুতরাং এটি প্রতিটি গ্রেপ অনুরোধের জন্য রেজেক্স ইঞ্জিন লোড করে না। আপনার যদি প্রয়োজন হয় তবে আপনি সর্বদা -F বিকল্পটি বাদ দিতে পারেন এবং রেজিজেসগুলি ব্যবহার করতে পারেন।


2

আমি এই নতুন উপায় খুঁজে পেয়েছি

bash $ ls -1  | xargs -i -t jar -tvf '{}'| grep Abstract
jar -tvf activation-1.1.jar
jar -tvf antisamy-1.4.3.jar
  2263 Thu Jan 13 21:38:10 IST 2011 org/owasp/validator/html/scan/AbstractAntiSamyScanner.class
...

সুতরাং এটি জারটি এবং শ্রেণীর সন্ধান পেলে তালিকাবদ্ধ করে, যদি আপনি চান আপনি ls -1 * .jar বা ইনপুট দিতে পারেন এইচটিএইচ কাউকে কমান্ডের সাহায্যে xargs এ।


ধন্যবাদ, আমি এইভাবে এটি উন্নতি করেছি: ls -1 * .jar | xargs -i -t জার -tvf '{}' | গ্রেপ বিমূর্তি
Jérôme বি

2

ক্লাসফাইন্ডার এমন একটি প্রোগ্রাম যা এই সমস্যাটি সমাধানের জন্য ডিজাইন করা হয়েছে। কোনও প্যাটার্নের সাথে মেলে এমন কোনও ক্লাসের সমস্ত উদাহরণ খুঁজে পেতে এটি আপনাকে ডিরেক্টরি এবং জার ফাইলগুলির মাধ্যমে পুনরাবৃত্ত অনুসন্ধান করতে দেয়। এটি জাভাতে লেখা হয়েছে, অজগর নয়। এটির একটি দুর্দান্ত জিইউআই রয়েছে যা এটি ব্যবহার করা সহজ করে তোলে। এবং এটি দ্রুত সঞ্চালিত হয়। এই রিলিজটি চলমানযোগ্য জারে পূর্বরূপযুক্ত তাই আপনাকে উত্স থেকে এটি তৈরি করতে হবে না।

এটি এখানে ডাউনলোড করুন: ClassFinder 1.0



1

স্রেফ FindClassInJars ব্যবহার করুন, এটি একটি সাধারণ সুইং প্রোগ্রাম, তবে দরকারী। আপনি সোর্স কোড যাচাই করতে পারেন বা জার ফাইলটি http://code.google.com/p/find-class-in-jars/ এ ডাউনলোড করতে পারেন


1

নিশ্চিত না কেন এখানে স্ক্রিপ্টগুলি সত্যই আমার পক্ষে কাজ করে নি। এইটা কাজ করে:

#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done

1

জার ফাইলটি সন্ধানের জন্য স্ক্রিপ্ট: find_jar.sh

IFS=$(echo -en "\n\b") # Set the field separator newline

for f in `find ${1} -iname *.jar`; do
  jar -tf ${f}| grep --color $2
  if [ $? == 0 ]; then
    echo -n "Match found: "
    echo -e "${f}\n"
  fi
done
unset IFS

ব্যবহার: ./find_jar.sh <জার ফাইলযুক্ত শীর্ষ স্তরের ডিরেক্টরি> <সন্ধানের জন্য শ্রেণীর নাম>

এটি এখানে দেওয়া বেশিরভাগ উত্তরের অনুরূপ। গ্রেপ কিছু খুঁজে পেলে এটি কেবল ফাইলের আউটপুট দেয়। আপনি যদি গ্রেপ আউটপুটটি দমন করতে চান তবে আপনি এটিকে / dev / নালটিতে পুনর্নির্দেশ করতে পারেন তবে আমি গ্রেপের আউটপুটটিও দেখতে পছন্দ করি যাতে আমি আংশিক শ্রেণীর নামগুলি ব্যবহার করতে পারি এবং প্রদর্শিত আউটপুটের তালিকা থেকে সঠিকটি বের করতে পারি।

শ্রেণীর নাম দুটি "স্ট্রিং" এর মতো সাধারণ শ্রেণীর নাম বা "জাভা.লং.স্ট্রিং" এর মতো পুরোপুরি যোগ্যতাসম্পন্ন নাম হতে পারে both


1

আরও একটি সরঞ্জাম যুক্ত করতে ... এটি উইন্ডোজের জন্য খুব সাধারণ এবং দরকারী সরঞ্জাম। একটি সাধারণ এক্সেপ ফাইল আপনি ক্লিক করেছেন, এটি অনুসন্ধানের জন্য একটি ডিরেক্টরি দিন, একটি শ্রেণীর নাম এবং এটি সেই বর্গযুক্ত জার ফাইলটি আবিষ্কার করবে। হ্যাঁ, এটি পুনরাবৃত্তি।

http://sourceforge.net/projects/jarfinder/


1

JARs এর গুচ্ছ একটি ফোল্ডারে (এবং সাবফোল্ডার) একটি শ্রেণি সন্ধান করতে: https://jarscan.com/

Usage: java -jar jarscan.jar [-help | /?]
                    [-dir directory name]
                    [-zip]
                    [-showProgress]
                    <-files | -class | -package>
                    <search string 1> [search string 2]
                    [search string n]

Help:
  -help or /?           Displays this message.

  -dir                  The directory to start searching
                        from default is "."

  -zip                  Also search Zip files

  -showProgress         Show a running count of files read in

  -files or -class      Search for a file or Java class
                        contained in some library.
                        i.e. HttpServlet

  -package              Search for a Java package
                        contained in some library.
                        i.e. javax.servlet.http

  search string         The file or package to
                        search for.
                        i.e. see examples above

উদাহরণ:

java -jar jarscan.jar -dir C:\Folder\To\Search -showProgress -class GenericServlet

0

আপনি একটি শেল একটি বিট দিয়ে জারে পূর্ণ ডিরেক্টরিতে একটি ক্লাস খুঁজে পেতে পারেন:

"ফুবার" শ্রেণি খুঁজছেন:

LIB_DIR=/some/dir/full/of/jarfiles
for jarfile in $(find $LIBDIR -name "*.jar"); do
   echo "--------$jarfile---------------"
   jar -tvf $jarfile | grep FooBar
done

0

উপরের সমস্তটি যুক্ত করার জন্য একটি জিনিস: যদি আপনার কাছে জার নির্বাহযোগ্য উপলব্ধ না হয় (এটি জেডিকে দিয়ে আসে তবে জেআরই দিয়ে আসে না), আপনি একই জিনিসটি সম্পাদন করতে আনজিপ (বা উইনজিপ, বা যা কিছু) ব্যবহার করতে পারেন।


0

নির্লজ্জ স্ব প্রচার, কিন্তু আপনি লিখে একটি ইউটিলিটি চেষ্টা করতে পারেন: http://sourceforge.net/projects/zfind

এটি সর্বাধিক প্রচলিত সংরক্ষণাগার / সংকুচিত ফাইলগুলি (জার, জিপ, টার, টর.gz ইত্যাদি) সমর্থন করে এবং অন্যান্য অনেক জার / জিপ সন্ধানকারীদের বিপরীতে, নেস্টেড জিপ ফাইলগুলি (জিপের মধ্যে জিপ, জারের মধ্যে জার ইত্যাদি) সীমাহীন গভীরতা পর্যন্ত সমর্থন করে।


0

পার্টিতে কিছুটা দেরি হলেও তবুও ...

কোন জারটিতে কোন নির্দিষ্ট বর্গ উপস্থিত রয়েছে তা সন্ধান করতে আমি জারব্রোজার ব্যবহার করছি । এটি জিইউআই ব্যবহার করা সহজ হয়েছে যা আপনাকে নির্বাচিত পথে সমস্ত জারের সামগ্রীগুলি ব্রাউজ করার অনুমতি দেয়।


0

নিম্নলিখিত স্ক্রিপ্ট আপনাকে সাহায্য করবে

for file in *.jar
do
  # do something on "$file"
  echo "$file"
  /usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done

0

এটি একটি মিনিজিডাব্লু (উইন্ডোজ ব্যাশ পরিবেশ) it গিটব্যাশগুলিতে ভাল কাজ করে

আপনার হোম ডিরেক্টরি ডিরেক্টরিতে এই ফাংশনটি আপনার .bashrc ফাইলে রাখুন:

# this function helps you to find a jar file for the class
function find_jar_of_class() {
  OLD_IFS=$IFS
  IFS=$'\n'
  jars=( $( find -type f -name "*.jar" ) )
  for i in ${jars[*]} ; do 
    if [ ! -z "$(jar -tvf "$i" | grep -Hsi $1)" ] ; then
      echo "$i"
    fi
   done 
  IFS=$OLD_IFS
}

0

জারপ ফাইলগুলির মধ্যে শ্রেণিগুলি অনুসন্ধানের জন্য গ্রেপজ হ'ল একটি কমান্ড লাইন ইউটিলিটি। আমি ইউটিলিটির লেখক।

আপনি ইউটিলিটি চালাতে পারেন grepj package.Class my1.jar my2.war my3.ear

একাধিক জার, কান, যুদ্ধ ফাইল সরবরাহ করা যেতে পারে। উন্নত ব্যবহারের জন্য অনুসন্ধান করা জারের একটি তালিকা সরবরাহ করতে ব্যবহার করুন।



0

লিনাক্স পরিবেশে আপনি নিম্নলিখিতগুলি করতে পারেন:

$ find <base_dir> -name *.jar -print0 | xargs -0 -l jar tf | grep <name>

কোথায় নাম ক্লাস ফাইলটার নাম যে আপনার বয়াম এ রুট ডিরেক্টরি অনুক্রমের জুড়ে বিতরণ ভিতরে খুঁজছেন base_dir


0

আপনি ব্যবহার করতে পারেন locateএবং grep:

locate jar | xargs grep 'my.class'

updatedbব্যবহারের আগে আপনি চালাচ্ছেন তা নিশ্চিত করুন locate

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.