嵌入式码头并没有完全清除临时目录(保留lib / *。jar)

佩奇

我有一个使用嵌入式码头的应用程序,并且运行良好。

我的码头产生的临时目录有问题。部署应用程序时,它会生成一个临时目录,其中包含提取的war(jetty-0.0.0.0-8888-app.war-_app-any-4643933123854766078.dir),都很好。但是,当我用另一个版本(相同的上下文)删除/替换此战争时,它会创建另一个临时目录,而另一个则没有完全删除。我看到码头删除了所有的css,html文件,但是没有删除web-inf / lib / *。jar。

webAppContext.setPersistTempDirectory设置为false,我已经选中。

我已经尝试过更改码头也使用的临时目录。

这是我的WebAppProvider:

WebAppProvider webAppProvider = new WebAppProvider();
webAppProvider.setMonitoredDirName("webapps");
webAppProvider.setScanInterval(1);
webAppProvider.setExtractWars(true);
webAppProvider.setDefaultsDescriptor("webdefault.xml");
webAppProvider.setTempDir(new File("work"));

String webDefault = Thread.currentThread().getContextClassLoader().getResource("webdefault.xml").getPath();
if (webDefault != null) {
    File f = new File(webDefault);
    if (f.exists() && !f.isDirectory()) {
        webAppProvider.setDefaultsDescriptor(webDefault);
    }
}

这是DeploymentManager:

DeploymentManager deploymentManager = new DeploymentManager();
deploymentManager.setContexts(contextHandlerCollection);
deploymentManager.setContextAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
        ".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/org.apache.taglibs.taglibs-standard-impl-.*\\.jar$");

deploymentManager.addAppProvider(webAppProvider);

服务器设置:

server = new Server(8888);
server.setStopAtShutdown(true);
server.setStopTimeout(5000);

handlerCollection.addHandler(contextHandlerCollection);
handlerCollection.addHandler(new DefaultHandler());

server.setHandler(handlerCollection);
server.addBean(deployManager);

我注意到当我停止码头时,我只能手动删除目录。我认为这是释放使用jar的进程并让我完全删除的唯一方法。

Obs:我不想停止服务器,因此可以删除文件夹。

提前致谢。

佩奇

好吧,我找到了解决方案。只需将其张贴在此处即可帮助有需要的任何人。

这是我的文件:

DeploymentManager:

DeploymentManager deploymentManager = new DeploymentManager();
deploymentManager.setContexts(contextHandlerCollection);
deploymentManager.setContextAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
        ".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/org.apache.taglibs.taglibs-standard-impl-.*\\.jar$");

deploymentManager.addLifeCycleBinding(new StandardStarter());
deploymentManager.addLifeCycleBinding(new StandardStopperCustom());
deploymentManager.addLifeCycleBinding(new StandardDeployer());
deploymentManager.addLifeCycleBinding(new StandardUndeployer());
deploymentManager.setUseStandardBindings(false);

deploymentManager.addAppProvider(webAppProvider);

WebAppProvider:

WebAppProviderCustom webAppProvider = new WebAppProviderCustom();
webAppProvider.setMonitoredDirName("webapps");
webAppProvider.setScanInterval(1);
webAppProvider.setExtractWars(true);
webAppProvider.setDefaultsDescriptor("webdefault.xml");
webAppProvider.setTempDir(new File("work"));

String webDefault = Thread.currentThread().getContextClassLoader().getResource("webdefault.xml").getPath();
if (webDefault != null) {
    File f = new File(webDefault);
    if (f.exists() && !f.isDirectory()) {
        webAppProvider.setDefaultsDescriptor(webDefault);
    }
}

StopperCustom:

public class StandardStopperCustom extends StandardStopper {
    @Override
    public void processBinding(Node node, App app) throws Exception {
        ContextHandler handler;
        try {
            handler = app.getContextHandler();

            if (handler instanceof WebAppContext) {
                WebAppContext webapp = (WebAppContext) handler;

                File tempDirectory = (File) webapp.getAttribute("javax.servlet.context.tempdir");
                String baseDirectory = tempDirectory.getName();

                if (webapp.getClassLoader() instanceof WebAppClassLoaderCustom && !baseDirectory.isEmpty()) {
                    WebAppClassLoaderCustom classLoader = (WebAppClassLoaderCustom) webapp.getClassLoader();

                    super.processBinding(node, app);

                    classLoader.close();
                    cleanUpTempDirectory(baseDirectory);
                }
            } else {
                super.processBinding(node, app);
            }
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }

    public void cleanUpTempDirectory(String tempDirectory) {
        File work = new File(Constantes.workDirectory);

        File[] jettyFolders = work.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                if (name.equalsIgnoreCase(tempDirectory)) {
                    return true;
                }

                return false;
            }
        });

        if (jettyFolders != null && jettyFolders.length > 0) {
            for (File file : jettyFolders) {
                IO.delete(file);
            }
        }
    }
}

将自定义类加载器设置为webappcontext: webAppContext.setClassLoader(new WebAppClassLoaderCustom(webAppContext));

WebAppClassLoaderCustom:

public class WebAppClassLoaderCustom extends WebAppClassLoader {

    private HashSet<String> jarFileToClose = new HashSet<String>();

    public WebAppClassLoaderCustom(Context context) throws IOException {
        super(context);
    }

    public WebAppClassLoaderCustom(ClassLoader parent, Context context) throws IOException {
        super(parent, context);
    }

    @Override
    public void close() {
        System.out.println("Closing ClassLoader.");

        jarFileToClose.clear();
        closeClassLoader(this);
        // finalizeNativeLibs(this);
        cleanupJarFileFactory();

        try {
            super.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @SuppressWarnings("rawtypes")
    private boolean closeClassLoader(ClassLoader cl) {
        boolean res = false;
        if (cl == null) {
            return res;
        }
        Class classURLClassLoader = URLClassLoader.class;
        Field f = null;
        try {
            f = classURLClassLoader.getDeclaredField("ucp");
        } catch (NoSuchFieldException e1) {
            // ignore
        }
        if (f != null) {
            f.setAccessible(true);
            Object obj = null;
            try {
                obj = f.get(cl);
            } catch (IllegalAccessException e1) {
                // ignore
            }
            if (obj != null) {
                final Object ucp = obj;
                f = null;
                try {
                    f = ucp.getClass().getDeclaredField("loaders");
                } catch (NoSuchFieldException e1) {
                    // ignore
                }
                if (f != null) {
                    f.setAccessible(true);
                    ArrayList loaders = null;
                    try {
                        loaders = (ArrayList) f.get(ucp);
                        res = true;
                    } catch (IllegalAccessException e1) {
                        // ignore
                    }
                    for (int i = 0; loaders != null && i < loaders.size(); i++) {
                        obj = loaders.get(i);
                        f = null;
                        try {
                            f = obj.getClass().getDeclaredField("jar");
                        } catch (NoSuchFieldException e) {
                            // ignore
                        }
                        if (f != null) {
                            f.setAccessible(true);
                            try {
                                obj = f.get(obj);
                            } catch (IllegalAccessException e1) {
                                // ignore
                            }
                            if (obj instanceof JarFile) {
                                final JarFile jarFile = (JarFile) obj;
                                jarFileToClose.add(jarFile.getName());
                                try {
                                    jarFile.close();
                                } catch (IOException e) {
                                    // ignore
                                }
                            }
                        }
                    }
                }
            }
        }
        return res;
    }

    @SuppressWarnings("rawtypes")
    private boolean finalizeNativeLibs(ClassLoader cl) {
        boolean res = false;
        Class classClassLoader = ClassLoader.class;
        java.lang.reflect.Field nativeLibraries = null;
        try {
            nativeLibraries = classClassLoader.getDeclaredField("nativeLibraries");
        } catch (NoSuchFieldException e1) {
            // ignore
        }
        if (nativeLibraries == null) {
            return res;
        }
        nativeLibraries.setAccessible(true);
        Object obj = null;
        try {
            obj = nativeLibraries.get(cl);
        } catch (IllegalAccessException e1) {
            // ignore
        }
        if (!(obj instanceof Vector)) {
            return res;
        }
        res = true;
        Vector java_lang_ClassLoader_NativeLibrary = (Vector) obj;
        for (Object lib : java_lang_ClassLoader_NativeLibrary) {
            java.lang.reflect.Method finalize = null;
            try {
                finalize = lib.getClass().getDeclaredMethod("finalize", new Class[0]);
            } catch (NoSuchMethodException e) {
                // ignore
            }
            if (finalize != null) {
                finalize.setAccessible(true);
                try {
                    finalize.invoke(lib, new Object[0]);
                } catch (IllegalAccessException e) {
                } catch (InvocationTargetException e) {
                    // ignore
                }
            }
        }
        return res;
    }

    @SuppressWarnings("rawtypes")
    private boolean cleanupJarFileFactory() {
        boolean res = false;
        Class classJarURLConnection = null;
        try {
            classJarURLConnection = Class.forName("sun.net.www.protocol.jar.JarURLConnection");
        } catch (ClassNotFoundException e) {
            // ignore
        }
        if (classJarURLConnection == null) {
            return res;
        }
        Field f = null;
        try {
            f = classJarURLConnection.getDeclaredField("factory");
        } catch (NoSuchFieldException e) {
            // ignore
        }
        if (f == null) {
            return res;
        }
        f.setAccessible(true);
        Object obj = null;
        try {
            obj = f.get(null);
        } catch (IllegalAccessException e) {
            // ignore
        }
        if (obj == null) {
            return res;
        }
        Class classJarFileFactory = obj.getClass();
        //
        HashMap fileCache = null;
        try {
            f = classJarFileFactory.getDeclaredField("fileCache");
            f.setAccessible(true);
            obj = f.get(null);
            if (obj instanceof HashMap) {
                fileCache = (HashMap) obj;
            }
        } catch (NoSuchFieldException e) {
        } catch (IllegalAccessException e) {
            // ignore
        }
        HashMap urlCache = null;
        try {
            f = classJarFileFactory.getDeclaredField("urlCache");
            f.setAccessible(true);
            obj = f.get(null);
            if (obj instanceof HashMap) {
                urlCache = (HashMap) obj;
            }
        } catch (NoSuchFieldException e) {
        } catch (IllegalAccessException e) {
            // ignore
        }
        if (urlCache != null) {
            HashMap urlCacheTmp = (HashMap) urlCache.clone();
            Iterator it = urlCacheTmp.keySet().iterator();
            while (it.hasNext()) {
                obj = it.next();
                if (!(obj instanceof JarFile)) {
                    continue;
                }
                JarFile jarFile = (JarFile) obj;
                if (jarFileToClose.contains(jarFile.getName())) {
                    try {
                        jarFile.close();
                    } catch (IOException e) {
                        // ignore
                    }
                    if (fileCache != null) {
                        fileCache.remove(urlCache.get(jarFile));
                    }
                    urlCache.remove(jarFile);
                }
            }
            res = true;
        } else if (fileCache != null) {
            // urlCache := null
            HashMap fileCacheTmp = (HashMap) fileCache.clone();
            Iterator it = fileCacheTmp.keySet().iterator();
            while (it.hasNext()) {
                Object key = it.next();
                obj = fileCache.get(key);
                if (!(obj instanceof JarFile)) {
                    continue;
                }
                JarFile jarFile = (JarFile) obj;
                if (jarFileToClose.contains(jarFile.getName())) {
                    try {
                        jarFile.close();
                    } catch (IOException e) {
                        // ignore
                    }
                    fileCache.remove(key);
                }
            }
            res = true;
        }
        jarFileToClose.clear();

        return res;
    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

与嵌入式JAR文件通信

来自分类Dev

与嵌入式JAR文件通信

来自分类Dev

Gradle Jar 没有正确编译 .jar?

来自分类Dev

嵌入式Tomcat,可执行jar,ServletContext.getRealPath()

来自分类Dev

嵌入式Neo4j需要哪些jar?

来自分类Dev

JEditorPane与jar文件中的嵌入式图像

来自分类Dev

嵌入式Neo4j需要哪些jar?

来自分类Dev

如何使用嵌入式jar文件中可用的功能?

来自分类Dev

使用Spring嵌入式tomcat(.jar)公开资源

来自分类常见问题

建议部署War文件与带有嵌入式容器的可执行jar

来自分类Dev

jhipster运行带有prod配置文件的嵌入式jar-liquibase的问题

来自分类Dev

带有嵌入式Tomcat的Jar和War包装之间的区别

来自分类Dev

带有Servlet 3.0的嵌入式Tomcat-如何在扫描时跳过某些jar?

来自分类Dev

JAR文件找不到嵌入式资源-相对路径有问题吗?

来自分类Dev

jhipster运行带有prod配置文件的嵌入式jar-liquibase的问题

来自分类Dev

在另一个独立/嵌入式码头服务器中部署独立(不同的 Maven 项目)Rest 服务 Jar

来自分类Dev

使用嵌入式依赖项时,JAR 未嵌入 OSGi 包中

来自分类Dev

在jar中没有配置文件的Java jar创建

来自分类Dev

Jboss没有使用jboss lib jar commons-lang3-3.0.jar

来自分类Dev

如何从jar lib包含JSP

来自分类Dev

清除Nginx并没有删除配置文件

来自分类Dev

清除Nginx并没有删除配置文件

来自分类Dev

春季启动:Web.xml和嵌入式服务器jar

来自分类Dev

带有嵌入式码头的招摇

来自分类Dev

Java listFiles在jar目录中

来自分类Dev

如何更改目标jar目录

来自分类Dev

Java从目录加载jar文件

来自分类Dev

jar 没有看到 config.properties?

来自分类Dev

如何以 jar 格式在该 jar 中具有依赖项的最终 jar?

Related 相关文章

热门标签

归档