/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ package com.sun.jini.tool; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.text.MessageFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.StringTokenizer; /** * Class to provide the <code>main</code> method referenced by the * <code>Main-Class</code> entry in the manifest of the <code>classdep</code> * JAR file. <code>ClassDep</code> relies on <code>sun.tools</code> * classes which may not be available in the boot or extension classloader; * this class provides support for finding the JDK <code>tools.jar</code> file * at runtime and running <code>ClassDep</code> from a classloader which * includes that file. */ class ClassDepLoader { /** * Entry point for an executable JAR file for <code>ClassDep</code>. Search * for <code>tools.jar</code> in <code>$java.home/../lib/</code>. If the * file is found, construct a classloader using <code>URL</code>s generated * from the union of the value of <code>java.class.path</code> and the path * to the <code>tools.jar</code> file with the extension classloader as * parent. Then reflectively call the <code>main</code> method of the * <code>ClassDep</code> class obtained from that loader. * <p> * If no <code>tool.jar</code> file is found, <code>ClassDep.main</code> * is called directly. * * @param args the command line arguments */ public static void main(String[] args) { File javaHome = new File(System.getProperty("java.home")); String jarPath = "lib" + File.separator + "tools.jar"; File toolsJar = new File(javaHome.getParent(), jarPath); if (!toolsJar.exists()) { try { Class.forName("sun.tools.java.Constants"); } catch (ClassNotFoundException e) { print("classdep.notools", toolsJar.toString()); return; } ClassDep.main(args); } else { try { String classpath = System.getProperty("java.class.path"); classpath += File.pathSeparator + toolsJar; StringTokenizer st = new StringTokenizer(classpath, File.pathSeparator); URL[] urls = new URL[st.countTokens()]; for (int i=0; st.hasMoreTokens(); i++) { urls[i] = new File(st.nextToken()).toURI().toURL(); } ClassLoader cl = ClassLoader.getSystemClassLoader(); if (cl != null) { cl = cl.getParent(); } ClassLoader loader = new URLClassLoader(urls, cl); Class classdepClass = Class.forName("com.sun.jini.tool.ClassDep", true, loader); Method mainMethod = classdepClass.getMethod("main", new Class[] {String[].class}); mainMethod.invoke(null, new Object[]{args}); } catch (Throwable e) { print("classdep.loadfailed", null); e.printStackTrace(); } } } /** print a localized message */ private static void print(String key, String v1) { Object[] vals = (v1 == null) ? null : new Object[]{v1}; try { String name = "com.sun.jini.tool.resources.classdep"; ResourceBundle resources = ResourceBundle.getBundle(name); String fmt = resources.getString(key); System.err.println(MessageFormat.format(fmt, vals)); } catch (MissingResourceException e) { e.printStackTrace(); } } }