Commit 11bcac00b0f72faba0df367d841402026f3400fd
1 parent
1bc2d41a
don't add file to classpath if the file is already present on the classpath - Test #67
Showing
4 changed files
with
39 additions
and
3 deletions
java/common/com/mumfrey/liteloader/core/api/EnumeratorModuleFolder.java
| @@ -48,12 +48,13 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | @@ -48,12 +48,13 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | ||
| 48 | 48 | ||
| 49 | protected boolean readJarFiles; | 49 | protected boolean readJarFiles; |
| 50 | protected boolean loadTweaks; | 50 | protected boolean loadTweaks; |
| 51 | + protected boolean forceInjection; | ||
| 51 | 52 | ||
| 52 | /** | 53 | /** |
| 53 | * True if this is a versioned folder and the enumerator should also try to load tweak jars which would normally be ignored | 54 | * True if this is a versioned folder and the enumerator should also try to load tweak jars which would normally be ignored |
| 54 | */ | 55 | */ |
| 55 | protected final boolean loadTweakJars; | 56 | protected final boolean loadTweakJars; |
| 56 | - | 57 | + |
| 57 | public EnumeratorModuleFolder(LiteLoaderCoreAPI coreAPI, File directory, boolean loadTweakJars) | 58 | public EnumeratorModuleFolder(LiteLoaderCoreAPI coreAPI, File directory, boolean loadTweakJars) |
| 58 | { | 59 | { |
| 59 | this.coreAPI = coreAPI; | 60 | this.coreAPI = coreAPI; |
| @@ -66,6 +67,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | @@ -66,6 +67,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | ||
| 66 | { | 67 | { |
| 67 | this.loadTweaks = properties.loadTweaksEnabled(); | 68 | this.loadTweaks = properties.loadTweaksEnabled(); |
| 68 | this.readJarFiles = properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, true); | 69 | this.readJarFiles = properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, true); |
| 70 | + this.forceInjection = properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_FORCE_INJECTION, false); | ||
| 69 | 71 | ||
| 70 | this.coreAPI.writeDiscoverySettings(); | 72 | this.coreAPI.writeDiscoverySettings(); |
| 71 | } | 73 | } |
| @@ -77,6 +79,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | @@ -77,6 +79,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | ||
| 77 | public void writeSettings(LoaderEnvironment environment, LoaderProperties properties) | 79 | public void writeSettings(LoaderEnvironment environment, LoaderProperties properties) |
| 78 | { | 80 | { |
| 79 | properties.setBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, this.readJarFiles); | 81 | properties.setBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, this.readJarFiles); |
| 82 | + properties.setBooleanProperty(LoaderProperties.OPTION_FORCE_INJECTION, this.forceInjection); | ||
| 80 | } | 83 | } |
| 81 | 84 | ||
| 82 | /* (non-Javadoc) | 85 | /* (non-Javadoc) |
| @@ -146,6 +149,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | @@ -146,6 +149,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule | ||
| 146 | for (File file : this.directory.listFiles(this.getFilenameFilter())) | 149 | for (File file : this.directory.listFiles(this.getFilenameFilter())) |
| 147 | { | 150 | { |
| 148 | LoadableFile candidateFile = new LoadableFile(file); | 151 | LoadableFile candidateFile = new LoadableFile(file); |
| 152 | + candidateFile.setForceInjection(this.forceInjection); | ||
| 149 | try | 153 | try |
| 150 | { | 154 | { |
| 151 | this.inspectFile(enumerator, candidateFile); | 155 | this.inspectFile(enumerator, candidateFile); |
java/common/com/mumfrey/liteloader/interfaces/LoadableFile.java
| @@ -39,6 +39,8 @@ public class LoadableFile extends File implements TweakContainer<File> | @@ -39,6 +39,8 @@ public class LoadableFile extends File implements TweakContainer<File> | ||
| 39 | */ | 39 | */ |
| 40 | protected boolean injected; | 40 | protected boolean injected; |
| 41 | 41 | ||
| 42 | + protected boolean forceInjection; | ||
| 43 | + | ||
| 42 | /** | 44 | /** |
| 43 | * Position to inject the mod file at in the class path, if blank injects at the bottom as usual, alternatively | 45 | * Position to inject the mod file at in the class path, if blank injects at the bottom as usual, alternatively |
| 44 | * the developer can specify "top" to inject at the top, "base" to inject above the game jar, or "above: name" to | 46 | * the developer can specify "top" to inject at the top, "base" to inject above the game jar, or "above: name" to |
| @@ -87,6 +89,7 @@ public class LoadableFile extends File implements TweakContainer<File> | @@ -87,6 +89,7 @@ public class LoadableFile extends File implements TweakContainer<File> | ||
| 87 | { | 89 | { |
| 88 | super(file.getAbsolutePath()); | 90 | super(file.getAbsolutePath()); |
| 89 | this.displayName = this.getName(); | 91 | this.displayName = this.getName(); |
| 92 | + this.forceInjection = file.forceInjection; | ||
| 90 | this.assignJarMetaData(file); | 93 | this.assignJarMetaData(file); |
| 91 | } | 94 | } |
| 92 | 95 | ||
| @@ -295,6 +298,15 @@ public class LoadableFile extends File implements TweakContainer<File> | @@ -295,6 +298,15 @@ public class LoadableFile extends File implements TweakContainer<File> | ||
| 295 | return new ArrayList<String>(); | 298 | return new ArrayList<String>(); |
| 296 | } | 299 | } |
| 297 | 300 | ||
| 301 | + public boolean isInjectionForced() | ||
| 302 | + { | ||
| 303 | + return this.forceInjection; | ||
| 304 | + } | ||
| 305 | + | ||
| 306 | + public void setForceInjection(boolean forceInjection) | ||
| 307 | + { | ||
| 308 | + this.forceInjection = forceInjection; | ||
| 309 | + } | ||
| 298 | 310 | ||
| 299 | @Override | 311 | @Override |
| 300 | public boolean isInjected() | 312 | public boolean isInjected() |
| @@ -307,6 +319,15 @@ public class LoadableFile extends File implements TweakContainer<File> | @@ -307,6 +319,15 @@ public class LoadableFile extends File implements TweakContainer<File> | ||
| 307 | { | 319 | { |
| 308 | if (!this.injected) | 320 | if (!this.injected) |
| 309 | { | 321 | { |
| 322 | + this.injected = true; | ||
| 323 | + | ||
| 324 | + boolean isOnClassPath = ClassPathUtilities.isJarOnClassPath(this, classLoader); | ||
| 325 | + if (!this.forceInjection && isOnClassPath) | ||
| 326 | + { | ||
| 327 | + LiteLoaderLogger.info("%s already exists on the classpath, skipping injection", this); | ||
| 328 | + return false; | ||
| 329 | + } | ||
| 330 | + | ||
| 310 | ClassPathUtilities.injectIntoClassPath(classLoader, this.getURL(), this.getInjectionStrategy()); | 331 | ClassPathUtilities.injectIntoClassPath(classLoader, this.getURL(), this.getInjectionStrategy()); |
| 311 | 332 | ||
| 312 | if (injectIntoParent) | 333 | if (injectIntoParent) |
| @@ -314,8 +335,8 @@ public class LoadableFile extends File implements TweakContainer<File> | @@ -314,8 +335,8 @@ public class LoadableFile extends File implements TweakContainer<File> | ||
| 314 | LiteLoaderTweaker.addURLToParentClassLoader(this.getURL()); | 335 | LiteLoaderTweaker.addURLToParentClassLoader(this.getURL()); |
| 315 | } | 336 | } |
| 316 | 337 | ||
| 317 | - this.injected = true; | ||
| 318 | return true; | 338 | return true; |
| 339 | + | ||
| 319 | } | 340 | } |
| 320 | 341 | ||
| 321 | return false; | 342 | return false; |
java/common/com/mumfrey/liteloader/launch/ClassPathUtilities.java
| @@ -232,11 +232,21 @@ public abstract class ClassPathUtilities | @@ -232,11 +232,21 @@ public abstract class ClassPathUtilities | ||
| 232 | */ | 232 | */ |
| 233 | public static boolean isJarOnClassPath(File jarFile) | 233 | public static boolean isJarOnClassPath(File jarFile) |
| 234 | { | 234 | { |
| 235 | + URLClassLoader classLoader = (URLClassLoader)Launch.class.getClassLoader(); | ||
| 236 | + return ClassPathUtilities.isJarOnClassPath(jarFile, classLoader); | ||
| 237 | + } | ||
| 238 | + | ||
| 239 | + /** | ||
| 240 | + * @param jarFile | ||
| 241 | + * @param classLoader | ||
| 242 | + */ | ||
| 243 | + public static boolean isJarOnClassPath(File jarFile, URLClassLoader classLoader) | ||
| 244 | + { | ||
| 235 | try | 245 | try |
| 236 | { | 246 | { |
| 237 | String jarURL = jarFile.toURI().toURL().toString(); | 247 | String jarURL = jarFile.toURI().toURL().toString(); |
| 238 | 248 | ||
| 239 | - URL[] classPath = ((URLClassLoader)Launch.class.getClassLoader()).getURLs(); | 249 | + URL[] classPath = classLoader.getURLs(); |
| 240 | for (URL classPathEntry : classPath) | 250 | for (URL classPathEntry : classPath) |
| 241 | { | 251 | { |
| 242 | if (classPathEntry.toString().equals(jarURL)) | 252 | if (classPathEntry.toString().equals(jarURL)) |
java/common/com/mumfrey/liteloader/launch/LoaderProperties.java
| @@ -96,4 +96,5 @@ public interface LoaderProperties | @@ -96,4 +96,5 @@ public interface LoaderProperties | ||
| 96 | public static final String OPTION_SEARCH_MODS = "search.mods"; | 96 | public static final String OPTION_SEARCH_MODS = "search.mods"; |
| 97 | public static final String OPTION_SEARCH_CLASSPATH = "search.classpath"; | 97 | public static final String OPTION_SEARCH_CLASSPATH = "search.classpath"; |
| 98 | public static final String OPTION_SEARCH_JARFILES = "search.jarfiles"; | 98 | public static final String OPTION_SEARCH_JARFILES = "search.jarfiles"; |
| 99 | + public static final String OPTION_FORCE_INJECTION = "forceInjection"; | ||
| 99 | } | 100 | } |