diff options
author | Petr Mrázek <peterix@gmail.com> | 2014-01-12 22:17:14 +0100 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2014-01-12 22:17:14 +0100 |
commit | b589a12d1765f8df616779c53e614adef2e4c48e (patch) | |
tree | 83cdd87d532a36df1177987547c57058fd4f1777 /depends/launcher/org/multimc/Utils.java | |
parent | 498520446fcd10003226822f5ada9c2fe90e8c63 (diff) | |
parent | fca4441229808891f460d5fbc4affd51e8896aa5 (diff) | |
download | PrismLauncher-b589a12d1765f8df616779c53e614adef2e4c48e.tar.gz PrismLauncher-b589a12d1765f8df616779c53e614adef2e4c48e.tar.bz2 PrismLauncher-b589a12d1765f8df616779c53e614adef2e4c48e.zip |
Merge branch 'feature_better_launch' into develop
Diffstat (limited to 'depends/launcher/org/multimc/Utils.java')
-rw-r--r-- | depends/launcher/org/multimc/Utils.java | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/depends/launcher/org/multimc/Utils.java b/depends/launcher/org/multimc/Utils.java new file mode 100644 index 00000000..ba90c07f --- /dev/null +++ b/depends/launcher/org/multimc/Utils.java @@ -0,0 +1,125 @@ +/* + * Copyright 2012-2014 MultiMC Contributors + * + * Licensed 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.multimc; + +import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Arrays; +import java.util.List; + +public class Utils +{ + /** + * Adds the specified library to the classpath + * + * @param s the path to add + * @throws Exception + */ + public static void addToClassPath(String s) throws Exception + { + File f = new File(s); + URL u = f.toURI().toURL(); + URLClassLoader urlClassLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); + Class urlClass = URLClassLoader.class; + Method method = urlClass.getDeclaredMethod("addURL", new Class[]{URL.class}); + method.setAccessible(true); + method.invoke(urlClassLoader, new Object[]{u}); + } + + /** + * Adds many libraries to the classpath + * + * @param jars the paths to add + */ + public static boolean addToClassPath(List<String> jars) + { + boolean pure = true; + // initialize the class path + for (String jar : jars) + { + try + { + Utils.addToClassPath(jar); + } catch (Exception e) + { + System.err.println("Unable to load: " + jar); + e.printStackTrace(System.err); + pure = false; + } + } + return pure; + } + + /** + * Adds the specified path to the java library path + * + * @param pathToAdd the path to add + * @throws Exception + */ + @Deprecated public static void addLibraryPath(String pathToAdd) throws Exception + { + final Field usrPathsField = ClassLoader.class.getDeclaredField("usr_paths"); + usrPathsField.setAccessible(true); + + //get array of paths + final String[] paths = (String[]) usrPathsField.get(null); + + //check if the path to add is already present + for (String path : paths) + { + if (path.equals(pathToAdd)) + { + return; + } + } + + //add the new path + final String[] newPaths = Arrays.copyOf(paths, paths.length + 1); + newPaths[newPaths.length - 1] = pathToAdd; + usrPathsField.set(null, newPaths); + } + + /** + * Finds a field that looks like a Minecraft base folder in a supplied class + * + * @param mc the class to scan + */ + public static Field getMCPathField(Class<?> mc) + { + Field[] fields = mc.getDeclaredFields(); + + for (Field f : fields) + { + if (f.getType() != File.class) + { + // Has to be File + continue; + } + if (f.getModifiers() != (Modifier.PRIVATE + Modifier.STATIC)) + { + // And Private Static. + continue; + } + return f; + } + return null; + } +} |