Wednesday, April 30, 2014

Finding the JAR files which contain a specific .class file on Linux machine

This program searches through all .jar files in the current directory, and in any sub-directories, looking for the class that you specify. This can be very handy if you need to use a class in a Java program, but aren't sure which .jar file contains it.

Logic of script: The key is to get a list of all the jar files in present directory, open each jar archive and search it with our input classname, and for all positive output, print the name of the jar file on screen.
Sample Usage:
jar -tf rt.jar | grep "Object.class"

Note:

1. After downloading, rename the file to "JarSearch.sh". Transfer the JarSearch.sh file to Linux machine in ASCII mode to the location where you want to search. Give permission:
chmod -x JarSearch.sh
Sometimes, before giving permission, it may be required to convert the file format using below command to UNIX format. This will not affect the functionality.
dos2unix JarSearch.sh

2. Before using the script, verify that the JAVA_HOME environment variable is set correctly on your system.
echo $JAVA_HOME
If not set, set it to JDK installation directory.

3. Information
About: Searches .jar in current path for a specified class file including sub-directories.
Usage: ./JarSearch.sh class_name
Example: ./JarSearch.sh Object
Caution: Give exact class name without .class extension or package inormation. This searches for file name.
Known issue: Can not be used to search inner classes due to $ sign in the name. You can fork the code.
Tested for JDK 1.5 and 1.6 on SUSE Linux in ksh, csh and bash shells.
Download link: http://ideone.com/plain/W7xM03
The script: JarSearch.sh

#!/bin/sh

className=$1
JAR=$JAVA_HOME/bin/jar
JARFILES=`find . -name "*jar"`
found=0
ask=1

#########################################
#Author: Rajdeep Biswas
#Created: 2014-04-30
#Website: www.javabambino.blogspot.com
#Known issue: Not for inner classes
#########################################
echo ""
echo "*****************************************"
echo "About: Searches .jar in current path (sub-directories inclusive) for a specified class file."
echo "Usage: $0 class_name"
echo "Example: $0 HashMap"
echo "Note: Give exact class name without .class extension."
echo "*****************************************"
echo ""

#Error if there is no or multiple arguments
if [ $# -ne 1 ]
then
 echo "ERROR: Wrong number of arguments specified, please check usage above!"
 exit 1;
fi

#Ask how to search
while [ $ask -eq 1 ]
do
 echo "1. Enter '1' to search for exactly $className.class"
 echo "2. Enter '2' to search for *$className.class pattern. For example, Sample$className.class"
 echo "3. Enter '0' to exit this program"
 read temp
 
#validate input is only 1, 2 or 0. If not, take input again.
 if [[ -n ${temp//[0-2]/} ]]; 
 then
  echo -e "Caution: Invalid input!\n"
  continue
 fi

 if [ $temp -eq 0 ]
 then
  echo "Exiting.."
  exit 1
 fi

 if [ $temp -eq 1 -o $temp -eq 2 ]
 then
  searchHow=$temp
  ask=0
 fi
done

#Set the grep pattern accordingly as user input on how to search
if [ $searchHow -eq 1 ]
then
 searchWhat="grep -w $className.class"
elif [ $searchHow -eq 2 ]
then
 searchWhat="grep $className.class"
fi

echo -e "Scanning started...\n"
#Start scan
for JARFILE in $JARFILES
do
 $JAR tvf $JARFILE | $searchWhat  > /dev/null
 
 if [ $? -eq 0 ]
 then
  found=1
  echo "==> Found in $JARFILE"
 fi
done
#End scan

if [ $found -eq 0 ]
then
 echo "$className.class not found in current path: "`pwd`
fi

echo -e "\nScanning over."

No comments:

Post a Comment

Liked or hated the post? Leave your words of wisdom! Thank you :)