Java Tomcat 8新的资源实现将Jar文件映射到一个单独的目录中

Java Tomcat 8新的资源实现将Jar文件映射到一个单独的目录中,java,tomcat,resources,tomcat8,Java,Tomcat,Resources,Tomcat8,使用Tomcat8,我扩展了WebAppClassLoader,并使用addRepository方法将一些jar文件从共享位置添加到classloader路径。在tomcat 8中,删除了addRepository,并引入了新的资源实现。我仍然能够使用addUrl方法添加jar文件。但是我想实现新的基于资源的实现 我试过了 DirResourceSet dirResourceSet = new DirResourceSet(getContext().getResources(), "/WEB-I

使用Tomcat8,我扩展了WebAppClassLoader,并使用addRepository方法将一些jar文件从共享位置添加到classloader路径。在tomcat 8中,删除了addRepository,并引入了新的资源实现。我仍然能够使用addUrl方法添加jar文件。但是我想实现新的基于资源的实现

我试过了

DirResourceSet dirResourceSet = new DirResourceSet(getContext().getResources(), "/WEB-INF/lib", "/home/thusitha/lib/runtimes/cxf", "/");
WebResourceRoot webResourceRoot = getContext().getResources();
webResourceRoot.getContext().getResources().addPreResources(dirResourceSet);
但这不起作用,它仍然抛出classnotfoundexception


有人能告诉我如何使用Tomcat新资源实现将包含JAR的目录映射到特定的webapp吗?

这个问题的解决方案是通过覆盖ContextConfig类org.apache.catalina.startup.ContextConfig来注册资源。Catalina在扫描文档路径中的资源后立即进入启动状态。这些资源(如注释)的大部分处理由ContextConfig LifecycleListener处理。要确保在进行上下文配置之前添加资源,请重写ContextConfig

    final Context currentContext = ctx;

    ContextConfig ctxCfg = new ContextConfig() {
        @Override
        public void lifecycleEvent(LifecycleEvent event) {
            if (event.getType().equals(Lifecycle.CONFIGURE_START_EVENT)) {

                WebResourceRoot webResourcesRoot = currentContext.getResources();

                String baseDir = Platform.getBaseDir(); // Server Base Directory

                File libDir = new File(baseDir + File.separator + "lib");

                DirResourceSet dirResourceSet = null;
                try {
                    dirResourceSet = new DirResourceSet(webResourcesRoot, "/WEB-INF/lib", libDir.getCanonicalPath(), "/");
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }

                webResourcesRoot.addPostResources(dirResourceSet);

                String[] possibleJars = dirResourceSet.list("/WEB-INF/lib");

                for(String libfile : possibleJars) {
                    WebResource possibleJar = dirResourceSet.getResource("/WEB-INF/lib/"+libfile);
                    System.err.println(String.format("Loading possible jar %s",possibleJar.getCanonicalPath())); // Just checking...
                    if (possibleJar.isFile() && possibleJar.getName().endsWith(".jar")) {
                        WebResourceSet resourceSet = new JarResourceSet(webResourcesRoot, "/WEB-INF/classes", possibleJar.getCanonicalPath(),"/");
                        webResourcesRoot.addPostResources(resourceSet);
                    }
                }
            }

            super.lifecycleEvent(event);
        }
    };

    ctx.addLifecycleListener(ctxCfg);

这是一个在Tomcat 8.0.23上运行的未记录的解决方案。考虑到这个问题的复杂性和难度,我不能说这是一个比直接向类加载器添加jar更好的解决方案。

您解决过这个问题吗?我花了一整天的时间试图修改我的应用程序以使用资源系统,但没有成功。我尝试的技术是在Lifecycle.START\u事件上添加带有LifecycleListener的资源。据我所知,使用自定义类加载器和/或addUrl是唯一的解决方案。这可能应该被报告为一个bug。我所做的是使用addUrl方法。我无法使用新的资源实现来解决这个问题:我花了大约12个小时才找到这个解决方案,我认为这是不值得的。我的问题是ContextConfig LifecycleListener在我的自定义LifecycleListener之前运行。当我将代码移动到ContextConfig中时,一切都正常工作。尽管这只是为了让JSTL库正常工作而进行的测试。这可能无法解决新系统的所有资源加载问题。