java - Tomcat 8 新的 Resource 实现将 Jar 文件映射到一个单独的目录中

标签 java tomcat resources tomcat8

在 tomcat 8 中,我扩展了 WebAppClassLoader 并使用 addRepository() 方法将一些从共享位置归档的 jar 添加到类加载器路径。在 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 的未记录的解决方案。考虑到它的复杂性和难度,我不能说它是比直接将 jars 添加到 ClassLoaders 更好的解决方案。

关于java - Tomcat 8 新的 Resource 实现将 Jar 文件映射到一个单独的目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30168222/

相关文章:

java - 接口(interface)的实现必须实现其内部类构建器接口(interface)。怎么做?

java - 当我单击“运行”时,Android Studio 模拟器未运行我的应用程序

java - 通过 Docker 在 Tomcat 上部署 .war - 404

java - 带有jsp的tomcat

通过 Chef 部署 Java 应用程序(聊天服务器 + 客户端)?

wpf - 如何将数据网格中的每一行设置为不同的颜色

java - 在java中使用XSL将XML解析为HTML抛出解析问题

java - 生成另一个类的对象的方法

java - 我如何从 WEB-INF 目录加载图像 [Openshift :Vaadin]

delphi - 删除 package.dpk 文件中的 {$R *.res} 将删除 .dproj 文件中的 rccompile