ClassLoaderAddUrl.java

package org.ferris.riviera.console.classloader;

import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import javax.annotation.Priority;
import javax.enterprise.event.Observes;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.ferris.riviera.console.driver.DriverFile;
import org.ferris.riviera.console.main.MainEvent;
import static org.ferris.riviera.console.main.MainEvent.ADD_URL;

/**
 *
 * @author Michael Remijan mjremijan@yahoo.com @mjremijan
 */
public class ClassLoaderAddUrl {

    @Inject
    protected Logger log;

    public void observes(
            @Observes @Priority(ADD_URL) MainEvent event, DriverFile jar
    ) {
        try {
            Method method
                    = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});

            method.setAccessible(true);

            method.invoke(
                    (URLClassLoader) ClassLoader.getSystemClassLoader(), new Object[]{jar.toURI().toURL()}
            );

            log.info(String.format("Added JAR %s", jar.getAbsolutePath()));
        } catch (Throwable t) {
            throw new RuntimeException(
                    String.format(
                            "Failure adding driver JAR file \"%s\" to system classloader", jar.getAbsolutePath()
                    ), t
            );
        }
    }
}