tomcat中C++线程调用java出现ClassDefNotFound

来源:互联网 发布:智慧树网络课答案2017 编辑:程序博客网 时间:2024/06/05 06:13

  遇到一个场景是web项目中需要使用C++的库,正常写法,调用C++的函数什么的都没有问题,但是C++中的线程回调中调用java的类在使用FindClass时出现ClassDefNotFound

的错误,但是脱离tomcat测试就是ok了,那一定是classpath中没有对应路径了,但是tomcat中用java直接访问啥问题都没啊,怀疑tomcat启动脚本并没有设置对应的classpath,而tomcat使用了自己的classloader。在tomcat启动脚本中catalina.sh尝试加上classpath=class的绝对路径,问题果然解决了,但是这个办法感觉不够灵活,需要对应项目classes的路径,随后在程序启动中动态的加上应用classpath,测试ok,以下是代码部分

//反射的方式将当前应用的classes路径加到系统的classloader里面去if (Test.class.getClassLoader() instanceof ParallelWebappClassLoader&& Test.class.getClassLoader().getParent() instanceof URLClassLoader&& ClassLoader.getSystemClassLoader() instanceof URLClassLoader){try {Method func = URLClassLoader.class.getDeclaredMethod("addURL", (new Class[]{URL.class}));func.setAccessible(true);URL addPath = new URL(Test.class.getResource("/").toString());func.invoke(ClassLoader.getSystemClassLoader(),new Object[]{addPath});} catch (NoSuchMethodException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (SecurityException e) {// TODO 自动生成的 catch 块e.printStackTrace();}catch (IllegalAccessException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (IllegalArgumentException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (InvocationTargetException e) {// TODO 自动生成的 catch 块e.printStackTrace();} catch (MalformedURLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}
补充:上面的方法一个严重的问题就是两个classloader加载的同一个class在jvm中并不是相同的,导致jvm中存在两个Test对象,继续想办法ing
阅读全文
0 0
原创粉丝点击