Tomcat无法访问我的库在WEB-INF / lib中引用的jar库

时间:2014-01-16 14:57:20

标签: java tomcat

我正在使用Tomcat 7开发Web应用程序。它使用放在其下的MyLib.jar 的webapps \ MyApplication的\ WEB-INF \ lib中。 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”目录吗?

1 个答案:

答案 0 :(得分:6)

以下是您的应用程序的最新情况(尝试回答您能告诉我它为什么不能使用“otherLibs”目录吗?):

  1. 当您从命令行运行jar时,JVM使用标准的类加载机制,即 Bootstrap类加载器 - >扩展类加载器 - >应用程序类加载器。此应用程序类加载器CLASSPATH环境变量,-classpath-cp命令行选项,Class-Path Manifest文件属性加载类在JAR里面。这就是它从命令行运行的原因。 More here

  2. 服务器类似tomcat 类加载机制与独立应用程序不同。他们使用自定义类加载。这就是为什么只将你的所有jar放在WEB-INF/lib中,因为自定义类加载器意味着从应用程序中的WEB-INF/lib文件夹加载jar。很明显,自定义类加载器不考虑JAR中Manifest文件中的条目,因此忽略了WEB-INF/lib中不直接存在的所有jar文件。当您在WEB-INF/lib中复制jar时,它会起作用,因为自定义类加载器无法找到它们。