/* * 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 samples.util; import java.io.File; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.List; /** * This bootstrap class used for bootstrapping a Axis2 server in standalone * mode for windows environment. * This will avoid long classpath issue occurs @ windows environment) * Rather defining all library classpaths @ wrapper.conf user can give, * 'wrapper.java.additional' parameter which should have all library paths seperated by commas(,). * eg: * wrapper.java.additional.8=-Djar.class.paths=../../lib,../../repository/components/plugins, * ../../repository/components/extensions, * <p/> * In addition to above parameter 'system home' also defined for the current working * directory. * eg: * wrapper.java.additional.9=-Dsystem.home=. * <p/> * Please note that this class will add only the *.jar files to the classpath. Other required files * user should provide in the wrapper.conf */ public class Bootstrap { private static final String JAR_CLASS_PATHS = "jar.class.paths"; private static final String SYSTEM_HOME = "system.home"; public static void main(String args[]) { if (System.getProperty(JAR_CLASS_PATHS) != null) { String root; root = System.getProperty(SYSTEM_HOME, "."); String classpaths = System.getProperty(JAR_CLASS_PATHS); String[] paths = classpaths.split(","); // read class paths from // wrapper.conf file List<URL> classpath = new ArrayList<URL>(); if (paths == null || root == null) { System.out.println("system.home and jar.class.paths system properties should be set"); System.exit(1); } try { // add all *.jars available under all class paths for (String path : paths) { String path_new, prefix, suffix_without_fileseperator; // find the prefix of the classpaths(eg: ../../lib/conf or lib/conf, // assuming paths will be provided only in these 2 ways // against the 'system.home' path) int index = path.lastIndexOf("../"); if (index > 0) { prefix = path.substring(0, index + 3); path_new = path.substring(index + 3, path.length()); } else { prefix = ""; path_new = path; } //split the path to get folders String folders[] = path_new.split("/"); String suffix = ""; for (String folder : folders) { String suffix_new = folder + File.separator; suffix = suffix + suffix_new; } int fileSepLastIndex = suffix.lastIndexOf(File.separator); suffix_without_fileseperator = suffix.substring(0, fileSepLastIndex); File file; String jarRoot; if ("".equals(prefix)) { file = new File(root + File.separator + suffix); jarRoot = root + File.separator + suffix_without_fileseperator; } else { file = new File(root + File.separator + prefix + File.separator + suffix); jarRoot = root + File.separator + prefix + File.separator + suffix_without_fileseperator; } classpath.add(file.toURI().toURL()); addJarFileUrls(classpath, new File(jarRoot)); } //We do not want system class loader or even extension class loaders our parent. //We want only boot class loader as our parent. Boot class loader is represented as null. ClassLoader classLoader = new URLClassLoader(classpath.toArray(new URL[classpath.size()]), null); // Set the proper classloader for this thread. Thread.currentThread().setContextClassLoader(classLoader); // Use reflection to load a class to normally load the // rest of the app. Reflection will use the Thread's context class loader // and therefore pick up the rest of our libraries. Class appClass = classLoader.loadClass("samples.util.SampleAxis2Server"); Object app = appClass.newInstance(); Method m = app.getClass().getMethod("startServer", new Class[]{String[].class}); m.invoke(app, new Object[]{args}); } catch (Exception e) { System.out.println("Server could not start due to class loading issue " + e); System.exit(1); } } } /** * Add JAR files found in the given directory to the list of URLs. * * @param jarUrls the list to add URLs to * @param root the directory to recursively search for JAR files. * @throws java.net.MalformedURLException If a provided JAR file URL is malformed */ private static void addJarFileUrls(List<URL> jarUrls, File root) throws MalformedURLException { File[] children = root.listFiles(); if (children == null) { return; } for (File child : children) { if (child.isDirectory() && child.canRead()) { addJarFileUrls(jarUrls, child); } else if (child.isFile() && child.canRead() && child.getName().toLowerCase().endsWith(".jar")) { jarUrls.add(child.toURI().toURL()); } } } }