gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:28:55 24 4
gpt4 key购买 nike

在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com