2016-04-21 4 views
1

Я переношу a project из старых скриптов Ant в Gradle. Для разработки я использую gradle-tomcat-plugin и плагины java и war.Класс отсутствует во время запуска, но доступен после этого

Проект строится в контейнере 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. Однако, если я заставляю один из сервлетов бросать 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 для использования сервлета API 2.4. Я видел некоторые другие потоки, говорящие, чтобы обновить его, но изменить его на 2.5 не помогло.

+1

В сообщении об ошибке должно быть указано полное имя класса (с пакетами). Может ли ваш код ссылаться на пользовательский «ServletException» в пакете по умолчанию (возможно, случайно)? – Thilo

+0

Я тоже так думал. Наш код не относится к 'ServletException' без квалификации (согласно' git grep'), но, возможно, одна из библиотек. Spring имеет ['NestedServletException'] (http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/web/util/NestedServletException.html), но, судя по документам, он extends 'javax.servlet.ServletException' – z0r

+0

Спасибо за отзыв @Thilo - реализация моего собственного' ServletException' в пакете по умолчанию позволяет мне увидеть, что должна была быть ошибка: еще одна ошибка, которая сильно намекала на неверно сконфигурированный путь к классам! – z0r

ответ

0

OK это неудобно: там, должно быть, были некоторые устаревшие файлы, скрывающиеся в исходном дереве моего коллеги, может быть замаскирован .gitignore. Выполнение чистой проверки хранилища «исправило» проблему.

Я говорю «исправлено», потому что мы никогда не дошли до конца: ошибка была , говоря, что не удалось найти ServletException. Я реализовал свой собственный ServletException в пакете по умолчанию (спасибо Thilo за подсказку), но он просто показал другую аналогичную ошибку. В любом случае, он работает сейчас, поэтому есть вероятность, что это просто проблема с classpath, связанная с файлом, который не должен был находиться в исходном дереве.