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 | 48 | |
49 | 49 | protected boolean readJarFiles; |
50 | 50 | protected boolean loadTweaks; |
51 | + protected boolean forceInjection; | |
51 | 52 | |
52 | 53 | /** |
53 | 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 | 56 | protected final boolean loadTweakJars; |
56 | - | |
57 | + | |
57 | 58 | public EnumeratorModuleFolder(LiteLoaderCoreAPI coreAPI, File directory, boolean loadTweakJars) |
58 | 59 | { |
59 | 60 | this.coreAPI = coreAPI; |
... | ... | @@ -66,6 +67,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule |
66 | 67 | { |
67 | 68 | this.loadTweaks = properties.loadTweaksEnabled(); |
68 | 69 | this.readJarFiles = properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, true); |
70 | + this.forceInjection = properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_FORCE_INJECTION, false); | |
69 | 71 | |
70 | 72 | this.coreAPI.writeDiscoverySettings(); |
71 | 73 | } |
... | ... | @@ -77,6 +79,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule |
77 | 79 | public void writeSettings(LoaderEnvironment environment, LoaderProperties properties) |
78 | 80 | { |
79 | 81 | properties.setBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, this.readJarFiles); |
82 | + properties.setBooleanProperty(LoaderProperties.OPTION_FORCE_INJECTION, this.forceInjection); | |
80 | 83 | } |
81 | 84 | |
82 | 85 | /* (non-Javadoc) |
... | ... | @@ -146,6 +149,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule |
146 | 149 | for (File file : this.directory.listFiles(this.getFilenameFilter())) |
147 | 150 | { |
148 | 151 | LoadableFile candidateFile = new LoadableFile(file); |
152 | + candidateFile.setForceInjection(this.forceInjection); | |
149 | 153 | try |
150 | 154 | { |
151 | 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 | 39 | */ |
40 | 40 | protected boolean injected; |
41 | 41 | |
42 | + protected boolean forceInjection; | |
43 | + | |
42 | 44 | /** |
43 | 45 | * Position to inject the mod file at in the class path, if blank injects at the bottom as usual, alternatively |
44 | 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 | 89 | { |
88 | 90 | super(file.getAbsolutePath()); |
89 | 91 | this.displayName = this.getName(); |
92 | + this.forceInjection = file.forceInjection; | |
90 | 93 | this.assignJarMetaData(file); |
91 | 94 | } |
92 | 95 | |
... | ... | @@ -295,6 +298,15 @@ public class LoadableFile extends File implements TweakContainer<File> |
295 | 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 | 311 | @Override |
300 | 312 | public boolean isInjected() |
... | ... | @@ -307,6 +319,15 @@ public class LoadableFile extends File implements TweakContainer<File> |
307 | 319 | { |
308 | 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 | 331 | ClassPathUtilities.injectIntoClassPath(classLoader, this.getURL(), this.getInjectionStrategy()); |
311 | 332 | |
312 | 333 | if (injectIntoParent) |
... | ... | @@ -314,8 +335,8 @@ public class LoadableFile extends File implements TweakContainer<File> |
314 | 335 | LiteLoaderTweaker.addURLToParentClassLoader(this.getURL()); |
315 | 336 | } |
316 | 337 | |
317 | - this.injected = true; | |
318 | 338 | return true; |
339 | + | |
319 | 340 | } |
320 | 341 | |
321 | 342 | return false; | ... | ... |
java/common/com/mumfrey/liteloader/launch/ClassPathUtilities.java
... | ... | @@ -232,11 +232,21 @@ public abstract class ClassPathUtilities |
232 | 232 | */ |
233 | 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 | 245 | try |
236 | 246 | { |
237 | 247 | String jarURL = jarFile.toURI().toURL().toString(); |
238 | 248 | |
239 | - URL[] classPath = ((URLClassLoader)Launch.class.getClassLoader()).getURLs(); | |
249 | + URL[] classPath = classLoader.getURLs(); | |
240 | 250 | for (URL classPathEntry : classPath) |
241 | 251 | { |
242 | 252 | if (classPathEntry.toString().equals(jarURL)) | ... | ... |
java/common/com/mumfrey/liteloader/launch/LoaderProperties.java
... | ... | @@ -96,4 +96,5 @@ public interface LoaderProperties |
96 | 96 | public static final String OPTION_SEARCH_MODS = "search.mods"; |
97 | 97 | public static final String OPTION_SEARCH_CLASSPATH = "search.classpath"; |
98 | 98 | public static final String OPTION_SEARCH_JARFILES = "search.jarfiles"; |
99 | + public static final String OPTION_FORCE_INJECTION = "forceInjection"; | |
99 | 100 | } | ... | ... |