Я хочу загрузить определенные файлы jar в ScriptEngineManager
с помощью конкретный загрузчик классов
Этот конструктор загружает реализации ScriptEngineFactory, видимые для данного ClassLoader, используя механизм поставщика услуг.
Проблема, когда я попытался создать загрузчик классов
File file = new File("c:\\myclasses\\"); try { // Convert File to a URL URL url = file.toURI().toURL(); // file:/c:/myclasses/ URL[] urls = new URL[]{url}; // Create a new class loader with the directory ClassLoader cl = new URLClassLoader(urls)
И я получаю также класс, которого не было в классе, например Spring
Class cls1 = cl.loadClass("org.springframework.http.HttpStatus");
Как я могу создать чистый загрузчик классов только с классами определенной папки?
ИЗМЕНИТЬ
Если это невозможно, могу ли я использовать в скрипте groovy что-то эквивалентное Rhino ClassShutter
private static void setJavaClassesVisibleInvisibleSandbox(Context cx) { cx.setClassShutter(new ClassShutter() { public boolean visibleToScripts(String className) { // No Java classes allowed inside scripts
ИЗМЕНИТЬ
При попытке решения @Vinz243 CustomClassLoader
не удалось загрузить классы для файлов классов или файлов jar из определенной папки, даже при попытке rt.jar
java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:662)
at java.lang.ClassLoader.defineClass(ClassLoader.java:761)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at com.CustomClassLoader.loadClass(CustomClassLoader.java:15)