【问题标题】:Certain libraries cause Tomcat to fail to deploy某些库导致Tomcat部署失败
【发布时间】:2020-02-09 05:58:10
【问题描述】:

我刚刚学习 Tomcat,并且已经成功地将一个简单的测试 WAR 部署到 Tomcat 服务器。 但是,当我尝试通过 Maven 添加库时,Tomcat 的 JarScanner 无法为我的程序加载类文件,说它找不到任何东西

09-Feb-2020 05:36:42.568 INFO [http-nio-80-exec-8] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/tomcat/apache-tomcat-9.0.30/webapps/api.war]
09-Feb-2020 05:36:42.668 FINE [http-nio-80-exec-8] org.apache.jasper.servlet.TldScanner.scanResourcePaths No TLD files were found in resource path [/WEB-INF/].
09-Feb-2020 05:36:42.686 INFO [http-nio-80-exec-8] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/tomcat/apache-tomcat-9.0.30/webapps/api.war] has finished in [117] ms

但是,如果我从 pom.xml(因此从 WAR)中删除该库,它加载正常。 以下是正在加载的库:

  • JDA
  • Trove4J
  • jsr305
  • opus-java
  • opus-java-natives
  • opus-java-api
  • jna
  • 注释
  • okhttp
  • commons-collections4
  • nv-websocket-client
  • slf4j-api
  • 杰克逊数据绑定
  • 杰克逊注解
  • 杰克逊核心

此外,我已经尝试告诉 JARScanner 不要扫描 context.xml 和 catalina.properties 中的任何 JAR 文件。

tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
*.jar
<JarScanner scanClassPath="false" scanAllDirectories="false" scanManifest="false" scanAllFiles="false"/>

这些都没有导致部署工作。 如果我不排除主库 (JDA),则 Tomcat 会报告 ArrayIndexOutOfBounds 异常。 服务器在 JDK 8 上运行 Tomcat 9,我的 IDE 也是如此。

【问题讨论】:

    标签: java maven tomcat


    【解决方案1】:

    从您的日志 sn-p - 似乎没有部署 WAR,实际上是(见第三行):Deployment of web application archive [/opt/tomcat/apache-tomcat-9.0.30/webapps/api.war] has finished in [117] ms

    尝试将此输出与您认为“已部署”的 WAR 输出进行比较,您可能会看到相同的消息(我现在没有 tomcat 来在我的机器上验证这一点,但这是我的假设)。

    第二行:No TLD files were found in resource path... 基本上表示WAR中没有TLD文件当然不代表war有错误...

    TLD 代表标记库描述符 - 它用于 JSP 标记,这不是 Web 档案中的强制组件。

    See here一些关于顶级域名的信息

    【讨论】:

    • 如果我从 pom.xml 中删除 JDA,这里是 catalina.out:pastebin.com/hwQvPDqQ。当我从 Maven 的 pom 文件中删除依赖项时,它正确地找到了我的 Class 文件这一事实让我觉得它是库。
    • 是的,如果您删除 JDA - 它显然会部署。实际上,JDA 的日志看起来如何?你能像这样添加完整的日志吗?
    • Here 你去吧。与问题帖子的输出几乎相同。刚把JDA加回来,重新编译,上传到Tomcat。
    • 两个 sn-ps 都有一行:org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/opt/tomcat/apache-tomcat- 9.0.30/webapps/api.war] has finished in [XXX] ms 这意味着在这两种情况下,WAR 都部署在 tomcat 中(tomcat 中有一个管理器应用程序,您可以在其中查看所有已部署的 WAR) - 但是在内部战争可能会有所不同。这一切都取决于它做了什么......再次,从 tomcat 的角度来看,在这两种情况下,WAR 在技术上都可以并且已部署......
    • 最终解决了问题,只是将修复程序放在这里。 JDA 或其库之一是为比我使用的 Jersey Servlet 版本更高的 Java 版本编译的(我的猜测是 Java 8 与 Java 7),当它遇到 lambda 方法时会导致 ArrayIndexOOB 异常。将 Jersey Servlet 升级到更新的版本解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 2022-09-26
    • 2013-03-23
    相关资源
    最近更新 更多