[英]Tomcat can't access jar library referenced by my library in WEB-INF/lib
我正在使用Tomcat 7开发Web应用程序。它使用放在webapps \\ MyApplication \\ WEB-INF \\ lib下的MyLib.jar。 Tomcat已成功加载此库。 问题在于MyLib.jar需要的库(比如A.jar和B.jar)。
在创建MyLib.jar时,我添加了带有类路径的MANIFEST:otherLibs \\ A.jar otherLibs \\ B.jar(放在webapps \\ MyApplication \\ WEB-INF \\ lib \\ otherLibs下)。
有趣的是,MyLib.jar可以从命令行运行而不会出现任何问题。
当我将A.jar和B.jar复制到\\ lib目录时,这一切都适用于我。 我只是不想把它们放在那里以保持Tomcat安装清洁。
也许我需要为MyApplication指定额外的类路径? 也许全球为Tomcat? 那么如何? 请提供任何建议。
编辑:奇怪。 我运行了一些额外的测试。 我将MyLib.jar的类路径更改为“A.jar B.jar”(没有otherLibs目录),将A.jar和B.jar放在MyLib.jar旁边,现在它工作正常。 它适用于我,但你能告诉我为什么它不使用“otherLibs”目录吗?
以下是您的应用程序的最新情况(尝试回答,您能告诉我为什么它不能与“otherLibs”目录一起工作吗? ):
当您从命令行运行jar时,JVM使用标准的类加载机制,即Bootstrap类加载器 - >扩展类加载器 - >应用程序类加载器 。 此应用程序类加载器从CLASSPATH
环境变量, -classpath
或-cp
命令行选项,JAR中的Manifest
文件的Class-Path
属性加载类。 这就是它从命令行运行的原因。 更多这里 。
Server ( 如tomcat ) 类加载机制与独立应用程序不同 。 他们使用自定义类加载 。 这就是为什么只将你的所有jar放在WEB-INF/lib
因为自定义类加载器意味着从应用程序中的WEB-INF/lib
文件夹加载jar。 很明显,自定义类加载器不考虑JAR中Manifest
文件中的条目,因此忽略了不直接在WEB-INF/lib
所有jar。 当您在WEB-INF/lib
复制jar时,它会起作用,因为自定义类加载器无法找到它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.