我正在使用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”目录吗?
答案 0 :(得分:6)
以下是您的应用程序的最新情况(尝试回答您能告诉我它为什么不能使用“otherLibs”目录吗?):
当您从命令行运行jar时,JVM使用标准的类加载机制,即 Bootstrap类加载器 - >扩展类加载器 - >应用程序类加载器。此应用程序类加载器从CLASSPATH
环境变量,-classpath
或-cp
命令行选项,Class-Path
Manifest
文件属性加载类在JAR里面。这就是它从命令行运行的原因。 More here。
服务器(类似tomcat )类加载机制与独立应用程序不同。他们使用自定义类加载。这就是为什么只将你的所有jar放在WEB-INF/lib
中,因为自定义类加载器意味着从应用程序中的WEB-INF/lib
文件夹加载jar。很明显,自定义类加载器不考虑JAR中Manifest
文件中的条目,因此忽略了WEB-INF/lib
中不直接存在的所有jar文件。当您在WEB-INF/lib
中复制jar时,它会起作用,因为自定义类加载器无法找到它们。