1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.nuiton.util;
24
25 import org.apache.commons.logging.Log;
26 import org.apache.commons.logging.LogFactory;
27
28 import java.lang.reflect.Method;
29 import java.net.URL;
30 import java.net.URLClassLoader;
31 import java.util.ArrayList;
32 import java.util.Arrays;
33 import java.util.List;
34 import java.util.Stack;
35
36
37
38
39
40
41 public class ClassLoaderUtil {
42
43
44
45 private static final Log log = LogFactory.getLog(ClassLoaderUtil.class);
46
47
48
49
50
51
52
53
54
55
56 public static URL[] getDeepURLs(URLClassLoader loader) {
57 Stack<URL> urlToTreate = new Stack<URL>();
58 List<URL> urlTreated = new ArrayList<URL>();
59
60
61 URL[] result = getURLs(loader);
62
63 urlToTreate.addAll(Arrays.asList(result));
64 while (!urlToTreate.isEmpty()) {
65 URL currentUrl = urlToTreate.pop();
66
67 urlTreated.add(currentUrl);
68 if (Resource.isJar(currentUrl.toString())) {
69
70 try {
71 URL[] newArrayURLs =
72 Resource.getClassPathURLsFromJarManifest(
73 currentUrl);
74 if (newArrayURLs == null) {
75 continue;
76 }
77 List<URL> newURLs = Arrays.asList(newArrayURLs);
78 for (URL newURL : newURLs) {
79 if (!urlTreated.contains(newURL) &&
80 !urlToTreate.contains(newURL)) {
81 urlToTreate.add(newURL);
82 }
83 }
84 } catch (Exception e) {
85 if (log.isDebugEnabled()) {
86
87 log.debug("error with url" + currentUrl +
88 " for reason : " + e.getMessage());
89 }
90 }
91 }
92 }
93 return urlTreated.toArray(new URL[urlToTreate.size()]);
94 }
95
96
97
98
99
100
101
102
103
104
105 public static URL[] getURLs(URLClassLoader classLoader) {
106 if (classLoader == null) {
107 classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
108 }
109 Method m;
110 try {
111
112
113 m = classLoader.getClass().getMethod("getAllURLs");
114 } catch (Exception e) {
115 m = null;
116 }
117 URL[] result;
118 if (m == null) {
119 result = classLoader.getURLs();
120 } else {
121 try {
122 result = (URL[]) m.invoke(classLoader);
123 } catch (Exception e) {
124 throw new IllegalStateException(e);
125 }
126 }
127 return result;
128 }
129
130 public static void printLoader(ClassLoader loader) {
131 log.info(loader);
132 if (loader instanceof URLClassLoader) {
133 URL[] urls = getURLs((URLClassLoader) loader);
134 for (URL url : urls) {
135 log.info(url);
136 }
137 }
138 }
139
140 }