@@ -29,6 +29,8 @@ of this software and associated documentation files (the "Software"), to deal
2929import org .dvare .dynamic .resources .DynamicClassLoader ;
3030import org .dvare .dynamic .resources .DynamicJavaFileManager ;
3131import org .dvare .dynamic .resources .SourceCode ;
32+ import org .slf4j .Logger ;
33+ import org .slf4j .LoggerFactory ;
3234
3335import javax .tools .*;
3436import java .io .File ;
@@ -39,19 +41,22 @@ of this software and associated documentation files (the "Software"), to deal
3941
4042public class DynamicCompiler {
4143 private static final List <String > options = new ArrayList <>(Arrays .asList ("-Xlint:unchecked" ));
44+ private static Logger logger = LoggerFactory .getLogger (DynamicCompiler .class );
4245 private static javax .tools .JavaCompiler javac = ToolProvider .getSystemJavaCompiler ();
4346 private StandardJavaFileManager standardFileManager =
4447 javac .getStandardFileManager (null , null , null );
4548 private DynamicClassLoader dynamicClassLoader ;
4649 private Map <String , JavaFileObject > sourceCodes = new HashMap <>();
4750 private List <URL > jars = new ArrayList <>();
51+ private String classpath = "" ;
4852 private boolean separateContext = false ;
4953 private boolean updateContextClassLoader = false ;
5054
5155 public void addSource (String className , String testSourceCode ) {
5256 sourceCodes .put (className , new SourceCode (className , testSourceCode ));
5357 }
5458
59+
5560 public void addSource (String className , File sourceFile ) {
5661 Iterable <? extends JavaFileObject > compilationUnits = standardFileManager .getJavaFileObjectsFromFiles (Arrays .asList (sourceFile ));
5762 for (JavaFileObject javaFileObject : compilationUnits ) {
@@ -67,45 +72,63 @@ public void addJar(URL url) {
6772
6873 public Map <String , Class <?>> build () throws DynamicCompilerException {
6974
70- //ClassLoader classLoader = ClassLoader.getSystemClassLoader();
7175 ClassLoader classLoader = Thread .currentThread ()
7276 .getContextClassLoader ();
7377 if (separateContext ) {
7478 classLoader = new CustomClassLoader ().getCustomURLClassLoader ();
7579 }
7680
77- URLClassLoader urlClassLoader = (URLClassLoader ) classLoader ;
7881
79- try {
80- if (!jars .isEmpty ()) {
82+ if (!(classLoader instanceof URLClassLoader )) {
83+ classLoader = this .getClass ().getClassLoader ();
84+ }
85+
86+
87+ if (classLoader instanceof URLClassLoader ) {
88+
89+ URLClassLoader urlClassLoader = (URLClassLoader ) classLoader ;
8190
82- for (URL url : jars ) {
83- Method method = URLClassLoader .class .getDeclaredMethod ("addURL" , URL .class );
84- method .setAccessible (true );
85- method .invoke (urlClassLoader , new Object []{url });
91+ try {
92+ if (!jars .isEmpty ()) {
93+
94+ for (URL url : jars ) {
95+ Method method = URLClassLoader .class .getDeclaredMethod ("addURL" , URL .class );
96+ method .setAccessible (true );
97+ method .invoke (urlClassLoader , new Object []{url });
98+ }
8699 }
87- }
88100
89- Method method2 = URLClassLoader .class .getDeclaredMethod ("getURLs" );
90- method2 .setAccessible (true );
91- URL [] urls = (URL []) method2 .invoke ((URLClassLoader ) classLoader );
92- String classpath = "" ;
93- for (URL url : urls ) {
94- classpath += url + File .pathSeparator ;
95- }
101+ Method method2 = URLClassLoader .class .getDeclaredMethod ("getURLs" );
102+ method2 .setAccessible (true );
103+ URL [] urls = (URL []) method2 .invoke ((URLClassLoader ) classLoader );
96104
97- options .addAll (Arrays .asList ("-classpath" , classpath ));
105+ if (urls .length == 0 ) {
106+
107+ urls = (URL []) method2 .invoke ((URLClassLoader ) getClass ().getClassLoader ());
108+ }
109+ for (URL url : urls ) {
110+ File file = new File (url .getFile ());
111+
112+ classpath += file .getAbsolutePath () + File .pathSeparator ;
113+ logger .debug (file .getAbsolutePath () + File .pathSeparator );
114+ }
115+
116+ if (!classpath .trim ().isEmpty ()) {
117+ options .addAll (Arrays .asList ("-classpath" , classpath ));
118+ }
119+
120+
121+ } catch (Exception e ) {
122+ e .printStackTrace ();
123+ }
98124
99125
100- } catch (Exception e ) {
101- e .printStackTrace ();
102126 }
103127
128+ dynamicClassLoader = new DynamicClassLoader (classLoader );
104129 Collection <JavaFileObject > compilationUnits = sourceCodes .values ();
105130 List <CompiledCode > compiledCodes = new ArrayList <>();
106131
107-
108- dynamicClassLoader = new DynamicClassLoader (urlClassLoader );
109132 DynamicJavaFileManager fileManager = new DynamicJavaFileManager (standardFileManager , compiledCodes , dynamicClassLoader );
110133
111134
@@ -159,5 +182,11 @@ public void setUpdateContextClassLoader(boolean updateContextClassLoader) {
159182 this .updateContextClassLoader = updateContextClassLoader ;
160183 }
161184
185+ public String getClasspath () {
186+ return classpath ;
187+ }
162188
189+ public void setClasspath (String classpath ) {
190+ this .classpath = classpath ;
191+ }
163192}
0 commit comments