blob: bc2910df41142073cade1a95c936379a98c2daab [file] [log] [blame]
/*
* 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 org.apache.activemq.artemis.boot;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* <p>
* A main class which setups up a classpath and then passes
* execution off to the ActiveMQ Artemis cli main.
* </p>
*/
public class Artemis {
public static void main(String[] args) throws Throwable {
String home = System.getProperty("artemis.home");
File fileHome = home != null ? new File(home) : null;
String instance = System.getProperty("artemis.instance");
File fileInstance = instance != null ? new File(instance) : null;
execute(fileHome, fileInstance, args);
}
/** This is a good method for booting an embedded command */
public static Object execute(File artemisHome, File artemisInstance, List<String> args) throws Throwable {
return execute(artemisHome, artemisInstance, args.toArray(new String[args.size()]));
}
/** This is a good method for booting an embedded command */
public static Object execute(File fileHome, File fileInstance, String ... args) throws Throwable {
ArrayList<File> dirs = new ArrayList<>();
if (fileHome != null) {
dirs.add(new File(fileHome, "lib"));
}
if (fileInstance != null) {
dirs.add(new File(fileInstance, "lib"));
}
ArrayList<URL> urls = new ArrayList<>();
// Without the etc on the config, things like JGroups configuration wouldn't be loaded
if (fileInstance != null) {
File etcFile = new File(fileInstance, "etc");
// Adding etc to the classLoader so modules can lookup for their configs
urls.add(etcFile.toURI().toURL());
}
if (fileHome != null) {
File etcFile = new File(fileHome, "etc");
// Adding etc to the classLoader so modules can lookup for their configs
urls.add(etcFile.toURI().toURL());
}
for (File bootdir : dirs) {
if (bootdir.exists() && bootdir.isDirectory()) {
// Find the jar files in the directory..
ArrayList<File> files = new ArrayList<>();
for (File f : bootdir.listFiles()) {
if (f.getName().endsWith(".jar") || f.getName().endsWith(".zip")) {
files.add(f);
}
}
// Sort the list by file name..
Collections.sort(files, new Comparator<File>() {
@Override
public int compare(File file, File file1) {
return file.getName().compareTo(file1.getName());
}
});
for (File f : files) {
add(urls, f);
}
}
}
if (fileInstance != null) {
System.setProperty("java.io.tmpdir", new File(fileInstance, "tmp").getCanonicalPath());
}
// Lets try to covert the logging.configuration setting to a valid URI
String loggingConfig = System.getProperty("logging.configuration");
if (loggingConfig != null) {
System.setProperty("logging.configuration", fixupFileURI(loggingConfig));
}
ClassLoader originalCL = Thread.currentThread().getContextClassLoader();
// Now setup our classloader..
URLClassLoader loader = new URLClassLoader(urls.toArray(new URL[urls.size()]));
Thread.currentThread().setContextClassLoader(loader);
Class<?> clazz = loader.loadClass("org.apache.activemq.artemis.cli.Artemis");
Method method = clazz.getMethod("execute", File.class, File.class, args.getClass());
try {
return method.invoke(null, fileHome, fileInstance, args);
}
catch (InvocationTargetException e) {
throw e.getTargetException();
}
finally {
Thread.currentThread().setContextClassLoader(originalCL);
}
}
static String fixupFileURI(String value) {
if (value != null && value.startsWith("file:")) {
value = value.substring("file:".length());
value = new File(value).toURI().toString();
}
return value;
}
private static void add(ArrayList<URL> urls, File file) {
try {
urls.add(file.toURI().toURL());
}
catch (MalformedURLException e) {
e.printStackTrace();
}
}
}