提交 jar 执行
Submitting jar for execution
我正在使用 Spring 设计一个系统,其中一些用户应该能够实现一些 类,提交 JAR 并能够执行他们的提交,前提是 类 在Jar 符合应该实现的接口。这个想法是有一个使用 jars(和一些 xml 配置文件)的可扩展性框架。
我的问题是,这可能吗?我应该如何处理上述 Jar 的执行,我能否在提交期间验证 Jar 的内容是否符合 API?
谢谢!
URLClassLoader child = new URLClassLoader (myJar.toURL(), this.getClass().getClassLoader());
Class classToLoad = Class.forName ("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod ("myMethod");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);
How should I load Jars dynamically at runtime?
限制已加载 jar 的权限
Java security: Sandboxing plugins loaded via URLClassLoader
使用反射来测试类
How can I determine whether a Java class is abstract by reflection
https://docs.oracle.com/javase/tutorial/reflect/
我最终使用了 JCL:https://github.com/kamranzafar/JCL
我将它与类似的东西一起使用:
public class AnalyticsMethodsClassPathLoader {
private JarClassLoader jcl;
private JclObjectFactory factory;
public AnalyticsMethodsClassPathLoader(String analyticsMethodsJarsFolder) {
//JCL object for loading jars
jcl = new JarClassLoader();
//Loading classes from different sources
jcl.add(analyticsMethodsJarsFolder);
// Set ClassPathLoader priorities to prevent collisions when loading
jcl.getParentLoader().setOrder(1);
jcl.getLocalLoader().setOrder(2);
jcl.getSystemLoader().setOrder(3);
jcl.getThreadLoader().setOrder(4);
jcl.getCurrentLoader().setOrder(5);
// Set default to cglib (from version 2.2.1)
ProxyProviderFactory.setDefaultProxyProvider( new CglibProxyProvider() );
factory = JclObjectFactory.getInstance(true);
}
public AnalyticsMethod loadClass(String implementingClass) throws AnalyticsMethodLoaderException {
//Create object of loaded class
AnalyticsMethod abstractMethod;
try{
abstractMethod = (AnalyticsMethod) factory.create(jcl, implementingClass);
return abstractMethod;
}
catch (JclException e)
{
e.printStackTrace();
throw new AnalyticsMethodLoaderException("The class " + implementingClass +
" was not found or does not implement the framework.");
}
catch (java.lang.NoSuchMethodError error)
{
error.printStackTrace();
throw new AnalyticsMethodLoaderException("The class " + implementingClass +
" does not have an empty constructor.");
}
}
}
它相对稳定,允许我在 spring 中做我需要的事情,而不需要将它与 spring 现在不受支持的 OSGi 功能结合起来。
我知道它有局限性,并不是在所有情况下都是绝对最佳的解决方案,但是对于提交和执行简单的 jars 来说工作得很好。
我正在使用 Spring 设计一个系统,其中一些用户应该能够实现一些 类,提交 JAR 并能够执行他们的提交,前提是 类 在Jar 符合应该实现的接口。这个想法是有一个使用 jars(和一些 xml 配置文件)的可扩展性框架。
我的问题是,这可能吗?我应该如何处理上述 Jar 的执行,我能否在提交期间验证 Jar 的内容是否符合 API?
谢谢!
URLClassLoader child = new URLClassLoader (myJar.toURL(), this.getClass().getClassLoader());
Class classToLoad = Class.forName ("com.MyClass", true, child);
Method method = classToLoad.getDeclaredMethod ("myMethod");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);
How should I load Jars dynamically at runtime?
限制已加载 jar 的权限 Java security: Sandboxing plugins loaded via URLClassLoader
使用反射来测试类 How can I determine whether a Java class is abstract by reflection https://docs.oracle.com/javase/tutorial/reflect/
我最终使用了 JCL:https://github.com/kamranzafar/JCL
我将它与类似的东西一起使用:
public class AnalyticsMethodsClassPathLoader {
private JarClassLoader jcl;
private JclObjectFactory factory;
public AnalyticsMethodsClassPathLoader(String analyticsMethodsJarsFolder) {
//JCL object for loading jars
jcl = new JarClassLoader();
//Loading classes from different sources
jcl.add(analyticsMethodsJarsFolder);
// Set ClassPathLoader priorities to prevent collisions when loading
jcl.getParentLoader().setOrder(1);
jcl.getLocalLoader().setOrder(2);
jcl.getSystemLoader().setOrder(3);
jcl.getThreadLoader().setOrder(4);
jcl.getCurrentLoader().setOrder(5);
// Set default to cglib (from version 2.2.1)
ProxyProviderFactory.setDefaultProxyProvider( new CglibProxyProvider() );
factory = JclObjectFactory.getInstance(true);
}
public AnalyticsMethod loadClass(String implementingClass) throws AnalyticsMethodLoaderException {
//Create object of loaded class
AnalyticsMethod abstractMethod;
try{
abstractMethod = (AnalyticsMethod) factory.create(jcl, implementingClass);
return abstractMethod;
}
catch (JclException e)
{
e.printStackTrace();
throw new AnalyticsMethodLoaderException("The class " + implementingClass +
" was not found or does not implement the framework.");
}
catch (java.lang.NoSuchMethodError error)
{
error.printStackTrace();
throw new AnalyticsMethodLoaderException("The class " + implementingClass +
" does not have an empty constructor.");
}
}
}
它相对稳定,允许我在 spring 中做我需要的事情,而不需要将它与 spring 现在不受支持的 OSGi 功能结合起来。 我知道它有局限性,并不是在所有情况下都是绝对最佳的解决方案,但是对于提交和执行简单的 jars 来说工作得很好。