spring - 类在启动期间丢失但之后可用

标签 spring tomcat gradle classpath

我正在迁移 a project从旧的 Ant 脚本到 Gradle。对于开发,我使用 gradle-tomcat-plugin ,以及 javawar 插件。

该项目是在 Docker 容器中构建的,这对我来说很好用,但对我的同事来说却不行。当他运行 gradle tomcatRun 时,他得到如下错误:

A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/rsa]]
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].StandardContext[/rsa]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    ... 6 more
Caused by: java.lang.NoClassDefFoundError: ServletException
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.getDeclaredMethods(Class.java:1975)
    at org.apache.catalina.util.Introspection.getDeclaredMethods(Introspection.java:127)
    at org.apache.catalina.startup.WebAnnotationSet.loadMethodsAnnotation(WebAnnotationSet.java:287)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationServletAnnotations(WebAnnotationSet.java:140)
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:65)
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:415)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:892)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5412)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 6 more
Caused by: java.lang.ClassNotFoundException: ServletException
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    ... 20 more
A child container failed during start

我假设这是指 javax.servlet.ServletException。但是,如果我强制其中一个 servlet 抛出 ServletException(我可以测试它,因为它在我的机器上加载正常),它可以毫无问题地找到该类。

我的构建文件看起来像这样 ( full source here ):

providedCompile (
    "org.apache.tomcat:tomcat-catalina:$tomcatVersion",
)

compile (
    'com.googlecode.lambdaj:lambdaj:2.3.3',
    'com.sun.xml.bind:jaxb-impl:2.1',
    'commons-io:commons-io:1.3.2',
    'commons-net:commons-net:3.4',
    'javax.validation:validation-api:1.0.0.GA',
    'org.codehaus.jackson:jackson-mapper-asl:1.7.1',
    'org.hibernate:hibernate-validator:4.2.0.Final',
    "org.springframework:org.springframework.web:$springVersion",
    "org.springframework:org.springframework.web.servlet:$springVersion",
    'rome:rome:1.0',
)

runtime (
    'commons-fileupload:commons-fileupload:1.2',
    "org.springframework:spring-oxm:$springVersion",
)

tomcat (
    "org.apache.tomcat.embed:tomcat-embed-core:$tomcatVersion",
    "org.apache.tomcat.embed:tomcat-embed-logging-juli:$tomcatVersion",
    "org.apache.tomcat.embed:tomcat-embed-jasper:$tomcatVersion",
)

是否还有另一个 ServletException 我缺少 .jar?或者是 .jar 在服务器启动期间可能没有加载,但稍后加载?该应用程序当前为 configured使用 servlet API 2.4。我看到其他一些帖子说要升级它,但将其更改为 2.5 并没有帮助。

最佳答案

好吧,这很尴尬:我同事的源代码树中肯定隐藏了一些陈旧的文件,可能被 .gitignore 掩盖了。对存储库进行干净的检查已“解决”了该问题。

我说“已修复”是因为我们从未真正深入了解:错误是找不到ServletException。我在默认包中实现了自己的 ServletException(感谢 Thilo 的提示),但它只是显示了另一个类似的错误。不管怎样,它现在可以工作了,所以很可能这只是一个涉及不应该在源代码树中的文件的类路径问题。

关于spring - 类在启动期间丢失但之后可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36758312/

相关文章:

java - 微服务未从 : http://localhost:8888 Springboot 处的服务器获取配置

java - 当我们使用 Rest 模板在内部点击 API 时,如何在 Spring Boot 中获取 API 的 HTTP 状态

tomcat - SOLR:没有正在运行的 SolrCores 错误消息

java - 将 JAR 设置为跳过以加速 Tomcat 7 maven 插件启动

android - 无法解决代理后面的 gradle 中的依赖关系

java - Spring 试图从里程碑存储库中提取快照

Android Gradle 构建失败 : Could not find com. google.android:support-v4:r18

java - 无法从 http : maven-artifact-manager:pom:2. maven.apache.org/maven2 传输 org.apache.maven ://repo. 0.6

spring - @JsonManagedReference 和 @JsonBackReference 无法从 jsonbackreference 模型中获取关系数据

java - ActionBeanNotFoundException – 无效的 URL