Skip to content
This repository has been archived by the owner on Mar 18, 2024. It is now read-only.

Commit

Permalink
Resolve #75 by adding DynamicClassLoader
Browse files Browse the repository at this point in the history
  • Loading branch information
mordechaim committed Jan 14, 2020
1 parent 0ef7373 commit e8defdd
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 6 deletions.
17 changes: 13 additions & 4 deletions src/main/java/org/update4j/ConfigImpl.java
Expand Up @@ -457,9 +457,18 @@ static void doLaunch(Configuration config, Injectable injectable, Launcher launc
java.lang.module.Configuration cf = parent.configuration()
.resolveAndBind(ModuleFinder.of(), finder, moduleNames);

ClassLoader parentClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader classpathLoader = new URLClassLoader("classpath", classpaths.toArray(new URL[classpaths.size()]),
parentClassLoader);

ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
ClassLoader classpathLoader = DynamicClassLoader.findAncestor(contextClassLoader);
if(classpathLoader != null) {
DynamicClassLoader dynamic = (DynamicClassLoader) classpathLoader;
for(URL url : classpaths) {
dynamic.add(url);
}
} else {
classpathLoader = new URLClassLoader("classpath", classpaths.toArray(new URL[classpaths.size()]),
contextClassLoader);
}

ModuleLayer.Controller controller = ModuleLayer.defineModulesWithOneLoader(cf, List.of(parent),
classpathLoader);
Expand Down Expand Up @@ -502,7 +511,7 @@ static void doLaunch(Configuration config, Injectable injectable, Launcher launc
}
}

ClassLoader contextClassLoader = classpathLoader;
contextClassLoader = classpathLoader;
if (moduleNames.size() > 0) {
contextClassLoader = layer.findLoader(moduleNames.get(0));
}
Expand Down
56 changes: 56 additions & 0 deletions src/main/java/org/update4j/DynamicClassLoader.java
@@ -0,0 +1,56 @@
package org.update4j;

import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Paths;

public final class DynamicClassLoader extends URLClassLoader {

static {
registerAsParallelCapable();
}

public DynamicClassLoader(String name, ClassLoader parent) {
super(name, new URL[0], parent);
}

/*
* Required when this classloader is used as the system classloader
*/
public DynamicClassLoader(ClassLoader parent) {
this("classpath", parent);
}

public DynamicClassLoader() {
this(Thread.currentThread().getContextClassLoader());
}

void add(URL url) {
addURL(url);
}

public static DynamicClassLoader findAncestor(ClassLoader cl) {
do {

if(cl instanceof DynamicClassLoader)
return (DynamicClassLoader) cl;

cl = cl.getParent();
} while(cl != null);

return null;
}

/*
* Required for Java Agents when this classloader is used as the system classloader
*/
@SuppressWarnings("unused")
private void appendToClassPathForInstrumentation(String jarfile) {
try {
add(Paths.get(jarfile).toRealPath().toUri().toURL());
} catch (IOException e) {
new AssertionError(e);
}
}
}
4 changes: 2 additions & 2 deletions src/main/java/org/update4j/service/DefaultLauncher.java
Expand Up @@ -96,12 +96,12 @@ public void run(LaunchContext context) {
System.setProperty("update4j.suppress.warning.access", "true");

try {
Class<?> clazz = Class.forName(mainClass, true, context.getClassLoader());
Class<?> clazz = context.getClassLoader().loadClass(mainClass);

// first check for JavaFx start method
Class<?> javafx = null;
try {
javafx = Class.forName("javafx.application.Application", true, context.getClassLoader());
javafx = context.getClassLoader().loadClass("javafx.application.Application");
} catch (ClassNotFoundException e) {
// no JavaFx present, skip.
}
Expand Down

0 comments on commit e8defdd

Please sign in to comment.