Determine which JAR file a class is from
Yes. It works for all classes except classes loaded by bootstrap classloader. The other way to determine is:
Class klass = String.class;
URL location = klass.getResource('/' + klass.getName().replace('.', '/') + ".class");
As notnoop pointed out klass.getResource()
method returns the location of the class file itself. For example:
jar:file:/jdk/jre/lib/rt.jar!/java/lang/String.class
file:/projects/classes/pkg/MyClass$1.class
The getProtectionDomain().getCodeSource().getLocation()
method returns the location of the jar file or CLASSPATH
file:/Users/home/java/libs/ejb3-persistence-1.0.2.GA.jar
file:/projects/classes
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.
Find a class somewhere inside dozens of JAR files?
Eclipse can do it, just create a (temporary) project and put your libraries on the projects classpath. Then you can easily find the classes.
Another tool, that comes to my mind, is Java Decompiler. It can open a lot of jars at once and helps to find classes as well.
Determining which jar did the .class come from in Eclipse IDE
Activate "Link with editor" in the Package Explorer (the double arrow) and press F3. Eclipse expands the class in a library. (Make sure, that the editor, that shows Persistence.class
has the focus).
For the next step, assuming you use m2eclipse, open the pom editor and look at the Dependency Hierarchy Tab. That gives a first hint where the dependency comes from. It may be transitive.
How to get names of classes inside a jar file?
Unfortunately, Java doesn't provide an easy way to list classes in the "native" JRE. That leaves you with a couple of options: (a) for any given JAR file, you can list the entries inside that JAR file, find the .class
files, and then determine which Java class each .class
file represents; or (b) you can use a library that does this for you.
Option (a): Scanning JAR files manually
In this option, we'll fill classNames
with the list of all Java classes contained inside a jar file at /path/to/jar/file.jar
.
List<String> classNames = new ArrayList<String>();
ZipInputStream zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar"));
for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) {
if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
// This ZipEntry represents a class. Now, what class does it represent?
String className = entry.getName().replace('/', '.'); // including ".class"
classNames.add(className.substring(0, className.length() - ".class".length()));
}
}
Option (b): Using specialized reflections libraries
Guava
Guava has had ClassPath
since at least 14.0, which I have used and liked. One nice thing about ClassPath
is that it doesn't load the classes it finds, which is important when you're scanning for a large number of classes.
ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader());
for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) {
// Do stuff with classes here...
}
Reflections
I haven't personally used the Reflections library, but it seems well-liked. Some great examples are provided on the website like this quick way to load all the classes in a package provided by any JAR file, which may also be useful for your application.
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);
How to find Jar to which an Java class belongs
You could start by searching for the class on JarFinder.
http://www.findjar.com/
Not perfect as sometimes a class is in more than one JAR. But this may help narrow down the search.
If the link stops working, there are other similar services that can be found using you favourite search engine.
Java - How to find out which Jar file an import comes from?
You can use CodeSource#getLocation()
for this. The CodeSource
is available by ProtectionDomain#getCodeSource()
. The ProtectionDomain
in turn is available by Class#getProtectionDomain()
.
URL location = ObjectMakerFactory.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println(location.getPath());
// ...
Related Topics
How to Choose the Id Generation Strategy When Using JPA and Hibernate
How to Bring a Window to the Front
How to Count Frequency of Characters in a String
Convert String Date to String Date Different Format
Java Null Check Why Use == Instead of .Equals()
How to Make My Arraylist Thread-Safe? Another Approach to Problem in Java
How to Get Out of While Loop in Java with Scanner Method "Hasnext" as Condition
How to Remove the Last Character from a String
How to Change the Intellij Idea Default Jdk
Java.Awt.Eventqueue.Invokelater Explained
Getting Java.Sql.Sqlexception: Operation Not Allowed After Resultset Closed
Get Name of Currently Executing Test in Junit 4
Java Get File Size Efficiently