Linux cmd to search for a class file among jars irrespective of jar path
Where are you jar files? Is there a pattern to find where they are?
1. Are they all in one directory?
For example, foo/a/a.jar
and foo/b/b.jar
are all under the folder foo/
, in this case, you could use find
with grep
:
find foo/ -name "*.jar" | xargs grep Hello.class
Sure, at least you can search them under the root directory /
, but it will be slow.
As @loganaayahee said, you could also use the command locate
. locate
search the files with an index, so it will be faster. But the command should be:
locate "*.jar" | xargs grep Hello.class
Since you want to search the content of the jar files.
2. Are the paths stored in an environment variable?
Typically, Java will store the paths to find jar files in an environment variable like CLASS_PATH
, I don't know if this is what you want. But if your variable is just like this:CLASS_PATH=/lib:/usr/lib:/bin
, which use a :
to separate the paths, then you could use this commend to search the class:
for P in `echo $CLASS_PATH | sed 's/:/ /g'`; do grep Hello.calss $P/*.jar; done
Java: How do I know which jar file to use given a class name?
You also have this eclipse plugin: jarclassfinder
The user enters the name of the class not found (or the name of the class that the Java project needs to access). The plug-in will search the selected directory (and subdirectories) for JAR files containing that class.
All results are displayed in a table in a custom view. The user can then browse this table and select the JAR file to add to his Java project's build path. The user then right-clicks on the entry in the table and, from the context menu, selects the build path to which to add it.
Update 2013, as I mention in "searching through .jar files eclipse", it is no longer maintained, and the alternatives are sparse.
As sunleo comments below:
with Eclipse, Ctfl+Shift+T remains the easiest alternative to look for a type
(with the jar name displayed in the status bar).
user862268 comments below:
For mac, it is cmd+shift+T in Eclipse to find the class and associated jar.
Execute jar file with multiple classpath libraries from command prompt
Let maven generate a batch file to start your application. This is the simplest way to this.
You can use the appassembler-maven-plugin for such purposes.
Reading a resource file from within jar
Rather than trying to address the resource as a File just ask the ClassLoader to return an InputStream for the resource instead via getResourceAsStream:
try (InputStream in = getClass().getResourceAsStream("/file.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
// Use resource
}
As long as the file.txt
resource is available on the classpath then this approach will work the same way regardless of whether the file.txt
resource is in a classes/
directory or inside a jar
.
The URI is not hierarchical
occurs because the URI for a resource within a jar file is going to look something like this: file:/example.jar!/file.txt
. You cannot read the entries within a jar
(a zip
file) like it was a plain old File.
This is explained well by the answers to:
- How do I read a resource file from a Java jar file?
- Java Jar file: use resource errors: URI is not hierarchical
Reference jars inside a jar
You will need a custom class loader for this, have a look at One Jar.
One-JAR lets you package a Java application together with its dependency Jars into a single executable Jar file.
It has an ant task which can simplify the building of it as well.
REFERENCE (from background)
Most developers reasonably assume that putting a dependency Jar file into their own Jar file, and adding a Class-Path attribute to the META-INF/MANIFEST will do the trick:
jarname.jar
| /META-INF
| | MANIFEST.MF
| | Main-Class: com.mydomain.mypackage.Main
| | Class-Path: commons-logging.jar
| /com/mydomain/mypackage
| | Main.class
| commons-logging.jar
Unfortunately this is does not work. The Java
Launcher$AppClassLoader
does not know how to load classes from a Jar inside a Jar with this kind ofClass-Path
. Trying to usejar:file:jarname.jar!/commons-logging.jar
also leads down a dead-end. This approach will only work if you install (i.e. scatter) the supporting Jar files into the directory where the jarname.jar file is installed.
How do you extract a JAR in a UNIX filesystem with a single command and specify its target directory using the JAR command?
If your jar file already has an absolute pathname as shown, it is particularly easy:
cd /where/you/want/it; jar xf /path/to/jarfile.jar
That is, you have the shell executed by Python change directory for you and then run the extraction.
If your jar file does not already have an absolute pathname, then you have to convert the relative name to absolute (by prefixing it with the path of the current directory) so that jar
can find it after the change of directory.
The only issues left to worry about are things like blanks in the path names.
Run jar with dependencies from the command line
When you use java -jar
, dependencies are not specified on the command line.
You have 2 ways to add jars to the class path:
Call
java
with the main class and add jar files, including yourfoobar.jar
, on the command line:java -cp foobar.jar:baz.jar com.mycompany.MainClass
Include dependencies in
foobar.jar
's manifest file (and then runjava -jar
)Class-Path: baz.jar
Related Topics
Bash Script; How to Use Vars and Funcs Defined After Command
How to Make a Built-In Device Driver in Linux
How to Base64 Encode Image in Linux Bash/Shell
List Files Over a Specific Size in Current Directory and All Subdirectories
How to Convert an Ssl Certificate in Linux
How to Copy File from a Vagrant MAChine to Localhost
Installed Clang++3.6 on Ubuntu, Can't Select as Alternative
Forcing Driver to Device Match
How to Know the Interrupt/Gpio Number for a Specific Pin in Linux
Bash with Aws Cli - Unable to Locate Credentials
How to Group by Column Values into Row and Column Header and Then Sum the Value
Colored Shell Script Output Library
I Want to Contribute to the Linux Kernel
How to Make Vim Play Typewriter Sound When I Write a Letter
Setting Environment Variable Globally Without Restarting Ubuntu