Skip to content

Commit

Permalink
more class loading issues CompEvol#834
Browse files Browse the repository at this point in the history
  • Loading branch information
rbouckaert committed Apr 5, 2022
1 parent efd769c commit bb5bccf
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 8 deletions.
20 changes: 20 additions & 0 deletions beast.base/version.xml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,26 @@
<provider classname="beast.base.evolution.operator.kernel.BactrianScaleOperator"/>
<provider classname="beast.base.evolution.operator.kernel.BactrianSubtreeSlide"/>
<provider classname="beast.base.evolution.operator.kernel.BactrianTipDatesRandomWalker"/>

<provider classname="beast.base.inference.operator.kernel.Transform$Array"/>
<provider classname="beast.base.inference.operator.kernel.Transform$Collection"/>
<provider classname="beast.base.inference.operator.kernel.Transform$Compose"/>
<provider classname="beast.base.inference.operator.kernel.Transform$ComposeMultivariable"/>
<provider classname="beast.base.inference.operator.kernel.Transform$FisherZTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$Inverse"/>
<provider classname="beast.base.inference.operator.kernel.Transform$InverseMultivariate"/>
<provider classname="beast.base.inference.operator.kernel.Transform$LogConstrainedSumTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$LogTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$LogitTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$MultivariableTransformWithParameter"/>
<provider classname="beast.base.inference.operator.kernel.Transform$MultivariateTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$NegateTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$NoTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$NoTransformMultivariable"/>
<provider classname="beast.base.inference.operator.kernel.Transform$ParsedTransform"/>
<provider classname="beast.base.inference.operator.kernel.Transform$PositiveOrdered"/>
<provider classname="beast.base.inference.operator.kernel.Transform$PowerTransform"/>

<provider classname="beast.base.evolution.sitemodel.SiteModel"/>
<provider classname="beast.base.evolution.speciation.BirthDeathGernhard08Model"/>
<provider classname="beast.base.evolution.speciation.CalibratedBirthDeathModel"/>
Expand Down
13 changes: 10 additions & 3 deletions beast.pkgmgmt/src/beast/pkgmgmt/BEASTClassLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ public void addParent(String packageName, String parentPackage) {
}
MultiParentURLClassLoader loader = getClassLoader(packageName);
MultiParentURLClassLoader parentLoader = getClassLoader(parentPackage);
loader.addParentLoader(parentLoader);
loader.addParentLoader(parentLoader);
}

/** dynamically load jars **/
Expand Down Expand Up @@ -106,12 +106,15 @@ public void addJar(String jarFile, String packageName) {
* The latter won't work for loading classes from packages from BEAST v2.6.0 onwards.
* **/
public static Class<?> forName(String className) throws ClassNotFoundException {
// System.err.println("forName: " + className);

if (class2loaderMap.containsKey(className)) {
ClassLoader loader = class2loaderMap.get(className);
// System.err.println("class2loaderMap " + loader.toString());
return Class.forName(className, false, loader);
}

// System.err.println("Loading non-service: " + className);
// System.err.println("Loading non-service: " + className);
for (MultiParentURLClassLoader loader : package2classLoaderMap.values()) {
try {
// System.err.println("Trying to load "+className+" using " + loader.name);
Expand All @@ -123,13 +126,17 @@ public static Class<?> forName(String className) throws ClassNotFoundException {

try {
// System.err.println("Trying to load using BEASTClassLoader.classLoader");
return Class.forName(className, false, BEASTClassLoader.classLoader);
Class<?> c = Class.forName(className, false, BEASTClassLoader.classLoader);
// System.err.println("Loading from " + c.getProtectionDomain().getCodeSource().getLocation());
return c;
} catch (NoClassDefFoundError e) {
throw new ClassNotFoundException(e.getMessage());
}
}

public static Class<?> forName(String className, String service) throws ClassNotFoundException {
// System.err.println("forName: " + className + " " + service);

if (!services.containsKey(service)) {
if (services.size() == 0) {
services.put(service, new HashSet<>());
Expand Down
26 changes: 26 additions & 0 deletions beast.pkgmgmt/src/beast/pkgmgmt/MultiParentURLClassLoader.java
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,32 @@ public Class<?> forName(String className) throws ClassNotFoundException {
}
}

@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
System.err.println("MPCL: load class " + name + " " + this.name);
try {
return loadClass(name, false);
} catch (NoClassDefFoundError | ClassNotFoundException e) {
// ignore -- try the next class loader instead
}

// no luck trying the parents
for (ClassLoader parentLoader : parentLoaders) {
try {
Class<?> c = parentLoader.loadClass(name);
if (c != null) {
return c;
}
} catch (NoClassDefFoundError e) {
// ignore -- try the next class loader instead
}
}

System.err.println("MPCL: giving up " + name + " " + this.name);

throw new NoClassDefFoundError(name);
}

@Override
public String toString() {
return super.toString() +"["+ name + "]";
Expand Down
4 changes: 2 additions & 2 deletions beast.pkgmgmt/src/beast/pkgmgmt/PackageManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -763,13 +763,13 @@ public static String getPackageSystemDir() {

/**
* Returns directory where BEAST installation resides, based on the location of the jar containing the
* BeastMain class file. This assumes that the parent directory of the beast.jar is the base install
* beast.pkgmgmt.PackageManager class file. This assumes that the parent directory of the launcher.jar is the base install
* directory.
*
* @return string representation of BEAST install directory or null if this directory cannot be identified.
*/
public static String getBEASTInstallDir() {
return getInstallDir(BEAST_PACKAGE_NAME, "beast.app.beastapp.BeastMain");
return getInstallDir(BEAST_PACKAGE_NAME, "beast.pkgmgmt.PackageManager");

}

Expand Down
10 changes: 7 additions & 3 deletions beast.pkgmgmt/src/beast/pkgmgmt/launcher/BeastLauncher.java
Original file line number Diff line number Diff line change
Expand Up @@ -675,14 +675,18 @@ public static void run(String classPath, String main, String[] args) {
System.err.println("WARNING: arg1 the first argument, arg2, the second, etc.");
}
}

for (String jarFileName : classPath.substring(1, classPath.length() - 1).split(File.pathSeparator)) {
if (jarFileName.toLowerCase().endsWith("jar")) {
if (jarFileName.toLowerCase().endsWith("base.jar")) {
File jarFile = new File(jarFileName);
BEASTClassLoader.classLoader.addURL(jarFile.toURI().toURL(), "BEAST.base", null);
}
if (jarFileName.toLowerCase().endsWith("app.jar")) {
File jarFile = new File(jarFileName);
BEASTClassLoader.classLoader.addURL(jarFile.toURI().toURL(), "BEAST.app", null);
}
}

BEASTClassLoader.classLoader.addParent("BEAST.app", "BEAST.base");
BEASTClassLoader.initServices(classPath);

Class<?> mainClass = BEASTClassLoader.forName(main);
Expand Down

0 comments on commit bb5bccf

Please sign in to comment.