chester.超 2024-01-23 13:35 采纳率: 0%
浏览 11

项目也成功导入了然后哦那个吗maven也配置好了,但是用tomcat启动的时候就是启动不起来,不一会儿直接报红,然后就出现乱码然后启动不起来

img


你看就是先导入文件,然后导入文件之后配置呃门卫,
然后配置maven完成之后,然后就连接数据库连接完成之后,
然后配置tomato配置完之后点开启动项目的时候,然后就没常运行一点,然后直接爆红,然后项目就始终还是运行不起来
我个人感觉可能是tomato配置出现了问题

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2024-01-23 16:34
    关注

    【相关推荐】



    • 这篇博客: 类加载机制、双亲委派机制深度解析以及如何自定义类加载器中的 5.(Tomcat)如何打破双亲委派机制 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

      打破双亲委派机制需要重写ClassLoader中的双亲委派方法loadClass()
      在这里插入图片描述
      打破双亲委派机制代码:

      protected Class<?> loadClass(String name, boolean resolve)
                      throws ClassNotFoundException
              {
                  synchronized (getClassLoadingLock(name)) {
                      // First, check if the class has already been loaded
                      Class<?> c = findLoadedClass(name);
                      if (c == null) {
                          long t0 = System.nanoTime();
      
      
                          if (c == null) {
                              long t1 = System.nanoTime();
                              //如果不是这个包下的类,比如Object,使用 自定义类加载器的父亲 >> 应用类加载器,双亲委派
                              if(!name.startsWith("com.chinalife.policy_manage.user.entity")){
                                  c = this.getParent().loadClass(name);
                              }else {
                                  //如果是这个包下的类 ,比如User,打破双亲委派机制
                                  c = findClass(name);
                              }
      
                              // this is the defining class loader; record the stats
                              sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                              sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                              sun.misc.PerfCounter.getFindClasses().increment();
                          }
                      }
                      if (resolve) {
                          resolveClass(c);
                      }
                      return c;
                  }
              }
      

      5.1 打破双亲委派机制的应用:tomcat

      以Tomcat类加载为例,Tomcat 如果使用默认的双亲委派类加载机制行不行?答案是不行的。为什么?

      • ①:tomcat是一个web容器,可能需要部署多个应用程序。不同的应用程序可能会依赖同一个第三方类库的不同版本。
        • 比如:一个应用依赖的spring4,另外一个应用依赖的spring5spring4和spring5底层也会依赖大量相同得类,如果按照以前的双亲委派机制,这些相同的类只能存在一份,如果被加载的是spring4的类,那么当spring5去使用某个类时,只能加载到spring4的类,那就可能丢失了spring5中对这个类的扩展功能。因此要保证每个应用程序的类库都是独立的,保证相互隔离。所以tomcat需要打破双亲委派机制
      • ②:web容器也有自己依赖的类库,不能与应用程序的类库混淆。基于安全考虑,应该让容器的类库和程序的类库隔离开来。

      如果使用默认的类加载器机制,那么是无法加载两个相同类库的不同版本的,默认 的类加器是不管你是什么版本的,只在乎你的全限定类名,并且只有一份。

              

      5.2 Tomcat自定义加载器详解

      在这里插入图片描述
      如上图所示:

      • tomcat 为了实现隔离性,打破了双亲委派机制,每个webappClassLoader加载自己的目录下的class文件,不会传递给父类加载器
      • 当然,Tomcat的基础设施还是需要遵循双亲委派机制的,只是为了实现应用隔离这一功能,局部打破双亲委派机制。其实现原理如上代码所示,也是经过过滤,让tomcat基础设施目录下的类加载时遵循双亲委派,存放不同应用的目录在加载时自定义类加载器!

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 1月23日