Skip to content

Commit 029c740

Browse files
authored
Merge pull request #15 from odinsbane/fixing-classpath
Switched using classloader to using classgraph library.
2 parents e9b4179 + 714c514 commit 029c740

File tree

2 files changed

+40
-99
lines changed

2 files changed

+40
-99
lines changed

pom.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ Institute of Molecular Cell Biology and Genetics.</license.copyrightOwners>
111111
<groupId>org.scijava</groupId>
112112
<artifactId>scijava-common</artifactId>
113113
</dependency>
114-
114+
<dependency>
115+
<groupId>io.github.classgraph</groupId>
116+
<artifactId>classgraph</artifactId>
117+
<version>4.8.172</version>
118+
</dependency>
115119
<!-- Test dependencies -->
116120
<dependency>
117121
<groupId>junit</groupId>

src/main/java/org/scijava/plugins/scripting/java/JavaEngine.java

Lines changed: 35 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,33 @@
3131

3232
package org.scijava.plugins.scripting.java;
3333

34+
import io.github.classgraph.ClassGraph;
35+
import org.scijava.command.CommandService;
36+
import org.scijava.minimaven.BuildEnvironment;
37+
import org.scijava.minimaven.Coordinate;
38+
import org.scijava.minimaven.MavenProject;
39+
import org.scijava.plugin.Parameter;
40+
import org.scijava.plugin.PluginService;
41+
import org.scijava.run.RunService;
42+
import org.scijava.script.AbstractScriptEngine;
43+
import org.scijava.util.FileUtils;
44+
import org.scijava.util.LineOutputStream;
45+
import org.w3c.dom.Document;
46+
import org.w3c.dom.Element;
47+
import org.xml.sax.SAXException;
48+
49+
import javax.script.ScriptEngine;
50+
import javax.script.ScriptException;
51+
import javax.xml.parsers.DocumentBuilderFactory;
52+
import javax.xml.parsers.ParserConfigurationException;
53+
import javax.xml.transform.OutputKeys;
54+
import javax.xml.transform.Transformer;
55+
import javax.xml.transform.TransformerConfigurationException;
56+
import javax.xml.transform.TransformerException;
57+
import javax.xml.transform.TransformerFactory;
58+
import javax.xml.transform.TransformerFactoryConfigurationError;
59+
import javax.xml.transform.dom.DOMSource;
60+
import javax.xml.transform.stream.StreamResult;
3461
import java.io.BufferedReader;
3562
import java.io.ByteArrayInputStream;
3663
import java.io.ByteArrayOutputStream;
@@ -43,44 +70,13 @@
4370
import java.io.Reader;
4471
import java.io.StringReader;
4572
import java.io.Writer;
46-
import java.net.MalformedURLException;
4773
import java.net.URL;
4874
import java.net.URLClassLoader;
4975
import java.util.ArrayList;
5076
import java.util.List;
51-
import java.util.jar.Attributes.Name;
52-
import java.util.jar.JarFile;
53-
import java.util.jar.Manifest;
5477
import java.util.regex.Matcher;
5578
import java.util.regex.Pattern;
5679

57-
import javax.script.ScriptEngine;
58-
import javax.script.ScriptException;
59-
import javax.xml.parsers.DocumentBuilderFactory;
60-
import javax.xml.parsers.ParserConfigurationException;
61-
import javax.xml.transform.OutputKeys;
62-
import javax.xml.transform.Transformer;
63-
import javax.xml.transform.TransformerConfigurationException;
64-
import javax.xml.transform.TransformerException;
65-
import javax.xml.transform.TransformerFactory;
66-
import javax.xml.transform.TransformerFactoryConfigurationError;
67-
import javax.xml.transform.dom.DOMSource;
68-
import javax.xml.transform.stream.StreamResult;
69-
70-
import org.scijava.command.CommandService;
71-
import org.scijava.minimaven.BuildEnvironment;
72-
import org.scijava.minimaven.Coordinate;
73-
import org.scijava.minimaven.MavenProject;
74-
import org.scijava.plugin.Parameter;
75-
import org.scijava.plugin.PluginService;
76-
import org.scijava.run.RunService;
77-
import org.scijava.script.AbstractScriptEngine;
78-
import org.scijava.util.FileUtils;
79-
import org.scijava.util.LineOutputStream;
80-
import org.w3c.dom.Document;
81-
import org.w3c.dom.Element;
82-
import org.xml.sax.SAXException;
83-
8480
/**
8581
* A pseudo-{@link ScriptEngine} compiling and executing Java classes.
8682
* <p>
@@ -787,23 +783,14 @@ private static Element append(final Document document, final Element parent,
787783
getAllDependencies(final BuildEnvironment env)
788784
{
789785
final List<Coordinate> result = new ArrayList<Coordinate>();
790-
for (ClassLoader loader = Thread.currentThread().getContextClassLoader(); loader != null; loader =
791-
loader.getParent())
792-
{
793-
if (loader instanceof URLClassLoader) {
794-
for (final URL url : ((URLClassLoader) loader).getURLs()) {
795-
if (url.getProtocol().equals("file")) {
796-
final File file = new File(url.getPath());
797-
if (url.toString().matches(
798-
".*/target/surefire/surefirebooter[0-9]*\\.jar"))
799-
{
800-
getSurefireBooterURLs(file, url, env, result);
801-
continue;
802-
}
803-
result.add(fakeDependency(env, file));
804-
}
805-
}
806-
}
786+
ClassGraph cg = new ClassGraph();
787+
String cp = cg.getClasspath();
788+
String[] candidates = cp.split(File.pathSeparator);
789+
790+
for( String candidate : candidates ){
791+
File file = new File(candidate);
792+
Coordinate c = fakeDependency(env, file);
793+
result.add(c);
807794
}
808795
return result;
809796
}
@@ -830,56 +817,6 @@ private static Coordinate fakeDependency(final BuildEnvironment env,
830817
return dependency;
831818
}
832819

833-
/**
834-
* Figures out the class path given a {@code .jar} file generated by the
835-
* {@code maven-surefire-plugin}.
836-
* <p>
837-
* A little-known feature of JAR files is that their manifest can specify
838-
* additional class path elements in a {@code Class-Path} entry. The
839-
* {@code maven-surefire-plugin} makes extensive use of that: the URLs of the
840-
* of the active {@link URLClassLoader} will consist of only a single
841-
* {@code .jar} file that is empty except for a manifest whose sole purpose is
842-
* to specify the dependencies.
843-
* </p>
844-
* <p>
845-
* This method can be used to discover those additional class path elements.
846-
* </p>
847-
*
848-
* @param file the {@code .jar} file generated by the
849-
* {@code maven-surefire-plugin}
850-
* @param baseURL the {@link URL} of the {@code .jar} file, needed for class
851-
* path elements specified as relative paths
852-
* @param env the {@link BuildEnvironment}, to store the Maven POMs faked for
853-
* the class path elements
854-
* @param result the list of dependencies to which the discovered dependencies
855-
* are added
856-
*/
857-
private static void getSurefireBooterURLs(final File file, final URL baseURL,
858-
final BuildEnvironment env, final List<Coordinate> result)
859-
{
860-
try {
861-
final JarFile jar = new JarFile(file);
862-
Manifest manifest = jar.getManifest();
863-
if (manifest != null) {
864-
final String classPath =
865-
manifest.getMainAttributes().getValue(Name.CLASS_PATH);
866-
if (classPath != null) {
867-
for (final String element : classPath.split(" +"))
868-
try {
869-
final File dependency =
870-
new File(new URL(baseURL, element).getPath());
871-
result.add(fakeDependency(env, dependency));
872-
}
873-
catch (MalformedURLException e) {
874-
e.printStackTrace();
875-
}
876-
}
877-
}
878-
}
879-
catch (final IOException e) {
880-
e.printStackTrace();
881-
}
882-
}
883820

884821
/**
885822
* Read complete contents of a Reader and return as String.

0 commit comments

Comments
 (0)