Java Tomcat can';t访问WEB-INF/lib中我的库引用的jar库

Java Tomcat can';t访问WEB-INF/lib中我的库引用的jar库,java,tomcat,Java,Tomcat,我正在使用Tomcat7开发web应用程序。它使用放置在下面的MyLib.jar webapps\MyApplication\WEB-INF\lib。Tomcat已成功加载此库。问题在于MyLib.jar所需的库(比如A.jar和B.jar) 在创建MyLib.jar时,我添加了带有类路径的清单:otherLibs\A.jar otherLibs\B.jar(位于webapps\MyApplication\WEB-INF\lib\otherLibs下) 有趣的是,MyLib.jar可以从命令行运

我正在使用Tomcat7开发web应用程序。它使用放置在下面的MyLib.jar webapps\MyApplication\WEB-INF\lib。Tomcat已成功加载此库。问题在于MyLib.jar所需的库(比如A.jar和B.jar)

在创建MyLib.jar时,我添加了带有类路径的清单:otherLibs\A.jar otherLibs\B.jar(位于webapps\MyApplication\WEB-INF\lib\otherLibs下)

有趣的是,MyLib.jar可以从命令行运行,没有任何问题

当我将A.jar和B.jar复制到\lib目录时,这一切都对我有效。我只是不想把它们放在那里以保持Tomcat安装的清洁

也许我需要为我的应用程序指定额外的类路径?也许是为了Tomcat?那怎么办?请提供任何建议

编辑:
奇怪。我运行了一些附加测试。我将MyLib.jar的类路径更改为“A.jar B.jar”(不带otherLibs目录),将A.jar和B.jar放在MyLib.jar旁边,现在它可以正常工作了。它对我有效,但是你能告诉我为什么它不能与“otherLibs”目录一起工作吗?

下面是你的应用程序的情况(尝试回答你能告诉我为什么它不能与“otherLibs”目录一起工作吗?)

  • 当您从命令行运行jar时,JVM使用标准的类加载机制,即引导类加载程序->扩展类加载程序->应用程序类加载程序。这个应用程序类加载器从JAR中
    清单
    文件的
    属性的
    环境变量、
    -CLASSPATH
    -cp
    命令行选项、
    类路径
    加载类。这就是它在命令行中工作的原因

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


  • 为什么不将它们放在
    \WEB-INF\lib
    下,而不是创建另一个子文件夹?我刚刚做了,更改了类路径,它工作正常(请参见问题中的编辑)。出于好奇,为什么它不能与子文件夹一起工作?当lib位于
    WEB-INF\lib
    下时,您不需要使用
    class path
    引用它们。正如我在JRE规范中所知道的,libs只在这个文件夹下搜索,而不检查类path。MyLib.jar被添加到内置到.war文件中的MyApplication项目中。我没有在这个项目中添加A.jar和B.jar,非常感谢。我不理解Tomcat使用的类加载机制。现在很清楚了。