没有办法删除tomcat

想要删除tomcat重新下过,但是不能删除。显示操作无法完成,因为其中的文件夹或文件已在另一程序中打开。可是我已经把所有的运行的程序都关掉了。还是没有用。我想打开看看,但是需要权限。我怕不安全,所以也不敢点。

img

img

我就是重启了一下,然后就可以删除了。

【相关推荐】



  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/253794
  • 这篇博客也不错, 你可以看下记一次压力测试引起的系统响应时间过长、Tomcat服务出现服务连接拒绝问题的排查和调优
  • 除此之外, 这篇博客: 类加载机制、双亲委派机制深度解析以及如何自定义类加载器中的 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基础设施目录下的类加载时遵循双亲委派,存放不同应用的目录在加载时自定义类加载器!

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