প্রচুর জার ফাইলের মধ্যে আপনি একটি নির্দিষ্ট শ্রেণীর নাম কীভাবে খুঁজে পাবেন?
(প্রকৃত শ্রেণীর নাম সন্ধান করছেন, এটি উল্লেখ করা ক্লাসগুলি নয়))
প্রচুর জার ফাইলের মধ্যে আপনি একটি নির্দিষ্ট শ্রেণীর নাম কীভাবে খুঁজে পাবেন?
(প্রকৃত শ্রেণীর নাম সন্ধান করছেন, এটি উল্লেখ করা ক্লাসগুলি নয়))
উত্তর:
গ্রহনটি এটি করতে পারে, কেবল একটি (অস্থায়ী) প্রকল্প তৈরি করতে পারে এবং আপনার লাইব্রেরিগুলি প্রকল্পের ক্লাসপথে রেখে দেয়। তারপরে আপনি ক্লাসগুলি সহজেই খুঁজে পেতে পারেন।
আর একটি সরঞ্জাম, যা আমার মনে আসে, তা হল জাভা ডেকম্পিলার। এটি একবারে প্রচুর জার খুলতে পারে এবং পাশাপাশি ক্লাসগুলি সন্ধান করতে সহায়তা করে।
লিনাক্সে, অন্যান্য ইউনিক্স ভেরিয়েন্টগুলি, উইন্ডোজে গিট বাশ, বা সাইগউইন, 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
এখানে কিভাবে এটা কাজ করে:
for /R %G in (*.jar) do
- সমস্ত জেআর ফাইলের উপর লুপ, পুনরাবৃত্তভাবে ডিরেক্টরিগুলি অনুসরণ করে; ফাইল নাম সংরক্ষণ করুন %G
।@jar -tvf "%G" |
- প্রদত্ত সংরক্ষণাগারটির মধ্যে সমস্ত ফাইলের নাম তালিকাভুক্ত করতে জাভা সংরক্ষণাগার কমান্ডটি চালান, এবং ফলাফলগুলি স্ট্যান্ডার্ড আউটপুটে লিখুন; @
প্রতীক শুষে কমান্ডের আবাহন মুদ্রণ।find "ClassName" > NUL
- প্রদত্ত শ্রেণীর নামের জন্য জার কমান্ডের আউটপুট থেকে পাইপযুক্ত স্ট্যান্ডার্ড ইনপুট; এটি ERRORLEVEL
মিললে 1 তে সেট হবে যদি কোনও মিল থাকে (অন্যথায় 0)।&& echo %G
- iff ERRORLEVEL
শূন্য-না হলে, জাভা সংরক্ষণাগার ফাইলের নামটি স্ট্যান্ডার্ড আউটপুটে (কনসোল) লিখুন।JAR ফাইলগুলি স্ক্যান করে এমন একটি অনুসন্ধান ইঞ্জিন ব্যবহার করুন ।
কিছু সময় আগে, আমি ঠিক তার জন্য একটি প্রোগ্রাম লিখেছিলাম: https://github.com/javalite/jar-explorer
grep -l "classname" *.jar
আপনি জার নাম দেয়
find . -name "*.jar" -exec jar -t -f {} \; | grep "classname"
আপনাকে ক্লাসের প্যাকেজ দেয়
#!/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
।
প্রদত্ত স্ট্রিংয়ের সাথে মেলে এমন জারগুলি সনাক্ত করতে:
find . -name \*.jar -exec grep -l YOUR_CLASSNAME {} \;
আমি যখন এই সমস্যাটি পেলাম তখন এটি করার কোনও ইউটিলিটি সম্পর্কে জানতাম না, তাই আমি নিম্নলিখিতটি লিখেছিলাম:
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();
}
}
}
"জারস্ক্যান" নামে দুটি পৃথক ইউটিলিটি রয়েছে যা আপনি যা চেয়েছিলেন ঠিক তা করে: জারস্ক্যান (inetfeedback.com.com) এবং জারস্ক্যান (java.net)
user1207523 এর স্ক্রিপ্টটি আমার পক্ষে ভাল কাজ করে। এখানে একটি বৈকল্পিক যা জার ফাইলগুলির জন্য সাধারণ প্রসারণের পরিবর্তে পুনরুক্তিভাবে অনুসন্ধান ব্যবহার করে অনুসন্ধান করে;
#!/bin/bash
for i in `find . -name '*.jar'`; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
আমি সর্বদা এটি উইন্ডোজে ব্যবহার করেছি এবং এর ব্যতিক্রমীভাবে খুব ভালভাবে কাজ করেছে।
findstr /s /m /c:"package/classname" *.jar, where
Findstr.exe উইন্ডোজ এবং প্যারামগুলির সাথে আদর্শ আসে:
আশা করি এটি কাউকে সাহায্য করবে।
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
নির্দিষ্ট শ্রেণীর জন্য একটি প্রদত্ত ডিরেক্টরিতে সমস্ত জার ফাইলগুলি অনুসন্ধান করতে, আপনি এটি করতে পারেন:
ls *.jar | xargs grep -F MyClass
বা, এমনকি সহজ,
grep -F MyClass *.jar
আউটপুট এর মতো দেখাচ্ছে:
Binary file foo.jar matches
এটি খুব দ্রুত কারণ -F বিকল্পের অর্থ স্থির স্ট্রিং অনুসন্ধান করা, সুতরাং এটি প্রতিটি গ্রেপ অনুরোধের জন্য রেজেক্স ইঞ্জিন লোড করে না। আপনার যদি প্রয়োজন হয় তবে আপনি সর্বদা -F বিকল্পটি বাদ দিতে পারেন এবং রেজিজেসগুলি ব্যবহার করতে পারেন।
আমি এই নতুন উপায় খুঁজে পেয়েছি
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 এ।
ক্লাসফাইন্ডার এমন একটি প্রোগ্রাম যা এই সমস্যাটি সমাধানের জন্য ডিজাইন করা হয়েছে। কোনও প্যাটার্নের সাথে মেলে এমন কোনও ক্লাসের সমস্ত উদাহরণ খুঁজে পেতে এটি আপনাকে ডিরেক্টরি এবং জার ফাইলগুলির মাধ্যমে পুনরাবৃত্ত অনুসন্ধান করতে দেয়। এটি জাভাতে লেখা হয়েছে, অজগর নয়। এটির একটি দুর্দান্ত জিইউআই রয়েছে যা এটি ব্যবহার করা সহজ করে তোলে। এবং এটি দ্রুত সঞ্চালিত হয়। এই রিলিজটি চলমানযোগ্য জারে পূর্বরূপযুক্ত তাই আপনাকে উত্স থেকে এটি তৈরি করতে হবে না।
এটি এখানে ডাউনলোড করুন: ClassFinder 1.0
জেবস ট্যাটলেটলে চেক করুন ; যদিও আমি এটি ব্যক্তিগতভাবে কখনও ব্যবহার করি নি, এটি আপনার প্রয়োজনীয় সরঞ্জাম বলে মনে হচ্ছে।
স্রেফ FindClassInJars ব্যবহার করুন, এটি একটি সাধারণ সুইং প্রোগ্রাম, তবে দরকারী। আপনি সোর্স কোড যাচাই করতে পারেন বা জার ফাইলটি http://code.google.com/p/find-class-in-jars/ এ ডাউনলোড করতে পারেন
নিশ্চিত না কেন এখানে স্ক্রিপ্টগুলি সত্যই আমার পক্ষে কাজ করে নি। এইটা কাজ করে:
#!/bin/bash
for i in *.jar; do jar -tf "$i" | grep $1 | xargs -I{} echo -e "$i : {}" ; done
জার ফাইলটি সন্ধানের জন্য স্ক্রিপ্ট: 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
আরও একটি সরঞ্জাম যুক্ত করতে ... এটি উইন্ডোজের জন্য খুব সাধারণ এবং দরকারী সরঞ্জাম। একটি সাধারণ এক্সেপ ফাইল আপনি ক্লিক করেছেন, এটি অনুসন্ধানের জন্য একটি ডিরেক্টরি দিন, একটি শ্রেণীর নাম এবং এটি সেই বর্গযুক্ত জার ফাইলটি আবিষ্কার করবে। হ্যাঁ, এটি পুনরাবৃত্তি।
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
নির্লজ্জ স্ব প্রচার, কিন্তু আপনি লিখে একটি ইউটিলিটি চেষ্টা করতে পারেন: http://sourceforge.net/projects/zfind
এটি সর্বাধিক প্রচলিত সংরক্ষণাগার / সংকুচিত ফাইলগুলি (জার, জিপ, টার, টর.gz ইত্যাদি) সমর্থন করে এবং অন্যান্য অনেক জার / জিপ সন্ধানকারীদের বিপরীতে, নেস্টেড জিপ ফাইলগুলি (জিপের মধ্যে জিপ, জারের মধ্যে জার ইত্যাদি) সীমাহীন গভীরতা পর্যন্ত সমর্থন করে।
নিম্নলিখিত স্ক্রিপ্ট আপনাকে সাহায্য করবে
for file in *.jar
do
# do something on "$file"
echo "$file"
/usr/local/jdk/bin/jar -tvf "$file" | grep '$CLASSNAME'
done
এটি একটি মিনিজিডাব্লু (উইন্ডোজ ব্যাশ পরিবেশ) 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
}
জারপ ফাইলগুলির মধ্যে শ্রেণিগুলি অনুসন্ধানের জন্য গ্রেপজ হ'ল একটি কমান্ড লাইন ইউটিলিটি। আমি ইউটিলিটির লেখক।
আপনি ইউটিলিটি চালাতে পারেন grepj package.Class my1.jar my2.war my3.ear
একাধিক জার, কান, যুদ্ধ ফাইল সরবরাহ করা যেতে পারে। উন্নত ব্যবহারের জন্য অনুসন্ধান করা জারের একটি তালিকা সরবরাহ করতে ব্যবহার করুন।
গ্রহনের জন্য এই প্লাগিনটি পরীক্ষা করুন যা আপনার সন্ধানের কাজটি করতে পারে।
আপনি ব্যবহার করতে পারেন locate
এবং grep
:
locate jar | xargs grep 'my.class'
updatedb
ব্যবহারের আগে আপনি চালাচ্ছেন তা নিশ্চিত করুন locate
।