我正试图使用Javassist加载一个抽象方法类,该类在运行时从JAR文件动态加载。由于某些原因,此代码仅在Windows操作系统上运行。我在任何其他平台上都会得到ClassDefNotFoundException。这是我使用的代码。
public static void example() throws Exception {
String pathToJar = "pathToJar.jar";
File JARFile = new File(pathToJar);
ClassLoader classLoader = URLClassLoader.newInstance(new URL[]{ JARFile.toURI().toURL() });
Class<?> callBackClass = classLoader.loadClass("package.Callback");
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(callBackClass);
MethodHandler handler = new MethodHandler() {
@Override
public Object invoke(Object self, Method overridden, Method forwarder,
Object[] args) throws Throwable {
return forwarder.invoke(self, args);
}
};
factory.setFilter(
new MethodFilter() {
@Override
public boolean isHandled(Method method) {
return Modifier.isAbstract(method.getModifiers());
}
}
);
Object instance = factory.create(new Class<?>[0], new Object[0], handler); /*exception thrown here on non-windows OS*/
}
这是类加载器的问题吗?还是Javassist有问题?它应该是独立于平台的,但根据操作系统的不同,它可能会运行,也可能不会运行。
在非windows操作系统上此处引发异常
这是一个很大的线索,表明某个地方存在资本差异。与Windows一起使用的主要文件系统不区分大小写,而其他地方使用的主要的文件系统(*nix)区分大小写。因此,请非常仔细地查看您试图加载的资源的大小写,并确保您加载的资源在代码中的大小写与在jar或文件系统中完全相同。
找不到并导致异常的类是
javassist.util.proxy.ProxyObject
你确定在非Windows操作系统上的类路径上有正确的jar吗?代理对象接口由javassist创建的任何类实现。类加载器似乎看不到它。您是否尝试定义一个显式类加载器提供程序?
我同意另一个答案,即套管是最可能的原因。你能提供运行应用程序的命令和jar的确切文件名吗?