package net.glowstone.util; import net.glowstone.GlowServer; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; import java.util.logging.Level; /** * Simple library manager which downloads external dependencies. */ public final class LibraryManager { /** * The Maven repository to download from. */ private final String repository; /** * The directory to store downloads in. */ private final File directory; public LibraryManager(GlowServer server) { // todo: allow configuration of repository, libraries, and directory repository = "http://repo.glowstone.net/service/local/repositories/central/content/"; directory = new File("lib"); } public void run() { if (!directory.isDirectory() && !directory.mkdirs()) { GlowServer.logger.log(Level.SEVERE, "Could not create libraries directory: " + directory); } download("org.xerial", "sqlite-jdbc", "3.7.2"); download("mysql", "mysql-connector-java", "5.1.34"); // was 5.1.14 } private void download(String group, String library, String version) { // check if we already have it File file = new File(directory, library + "-" + version + ".jar"); if (!file.exists()) { // download it GlowServer.logger.info("Downloading " + library + " " + version + "..."); try { URL downloadUrl = new URL(repository + group.replace('.', '/') + "/" + library + "/" + version + "/" + library + "-" + version + ".jar"); try (ReadableByteChannel input = Channels.newChannel(downloadUrl.openStream()); FileOutputStream output = new FileOutputStream(file)) { output.getChannel().transferFrom(input, 0, Long.MAX_VALUE); } } catch (IOException e) { GlowServer.logger.log(Level.WARNING, "Failed to download: " + library + " " + version, e); return; } } // hack it onto the classpath URLClassLoader sysLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); try { Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); method.setAccessible(true); method.invoke(sysLoader, file.toURI().toURL()); } catch (ReflectiveOperationException | MalformedURLException e) { GlowServer.logger.log(Level.WARNING, "Failed to add to classpath: " + library + " " + version, e); } } }