遇到一个场景是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.getRes