Java Jar File Find findContainingJar(Class myClass, Map packagedClasses)

Here you can find the source of findContainingJar(Class myClass, Map packagedClasses)

Description

Find a jar that contains a class of the same name, if any.

License

Apache License

Parameter

Parameter Description
myClass the class to find.

Exception

Parameter Description
IOException an exception

Return

a jar file that contains the class, or null.

Declaration

private static String findContainingJar(Class<?> myClass,
        Map<String, String> packagedClasses) throws IOException 

Method Source Code

//package com.java2s;
/**/*from  w w  w.  j  av  a 2 s  .  c  o m*/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. See accompanying LICENSE file.
 */

import java.io.IOException;
import java.net.URL;
import java.net.URLDecoder;

import java.util.Enumeration;

import java.util.Map;

public class Main {
    /**
     * Find a jar that contains a class of the same name, if any. It will return
     * a jar file, even if that is not the first thing on the class path that
     * has a class with the same name. Looks first on the classpath and then in
     * the <code>packagedClasses</code> map.
     * @param myClass the class to find.
     * @return a jar file that contains the class, or null.
     * @throws IOException
     */
    private static String findContainingJar(Class<?> myClass,
            Map<String, String> packagedClasses) throws IOException {
        ClassLoader loader = myClass.getClassLoader();
        String classFile = myClass.getName().replaceAll("\\.", "/")
                + ".class";

        // first search the classpath
        for (Enumeration<URL> itr = loader.getResources(classFile); itr
                .hasMoreElements();) {
            URL url = itr.nextElement();
            if ("jar".equals(url.getProtocol())) {
                String toReturn = url.getPath();
                if (toReturn.startsWith("file:")) {
                    toReturn = toReturn.substring("file:".length());
                }
                // URLDecoder is a misnamed class, since it actually decodes
                // x-www-form-urlencoded MIME type rather than actual
                // URL encoding (which the file path has). Therefore it would
                // decode +s to ' 's which is incorrect (spaces are actually
                // either unencoded or encoded as "%20"). Replace +s first, so
                // that they are kept sacred during the decoding process.
                toReturn = toReturn.replaceAll("\\+", "%2B");
                toReturn = URLDecoder.decode(toReturn, "UTF-8");
                return toReturn.replaceAll("!.*$", "");
            }
        }

        // now look in any jars we've packaged using JarFinder. Returns null when
        // no jar is found.
        return packagedClasses.get(classFile);
    }
}

Related

  1. findClassJar(final Class aClass)
  2. findContainingJar( @SuppressWarnings("rawtypes") Class my_class, ClassLoader loader)
  3. findContainingJar(Class my_class)
  4. findContainingJar(Class clazz)
  5. findContainingJar(Class clazz)
  6. findContainingJar(ClassLoader classLoader, String resourceName)
  7. findJar(Class klass)
  8. findJar(Class my_class)
  9. findJar(File dir)