Displaytag + Tomcat -> тихая ошибка - PullRequest
       45

Displaytag + Tomcat -> тихая ошибка

3 голосов
/ 01 февраля 2020

Я пытаюсь реабилитировать проект, которому около 10 лет.

Это веб-приложение java, которое хорошо работало в Tomcat 6. Существует небольшой кластер модулей, которые были построены по-разному. с Ant и Maven, используя Java 5 и Java 6.

Теперь я получил их все правильно, используя Maven, используя Java 6, развернув в Tomcat 7, пытаясь нацелиться на та же версия зависимостей - только для того, чтобы запустить ее, прежде чем пытаться выполнить обновление.

Некоторые страницы JSP используют DisplayTag 1.2. Если моя сборка Maven включает в себя зависимости displaytag, то веб-приложение не запускается. Там нет ошибок в журналах. Он просто сообщает 404 везде. Если я исключаю displaytag из сборки Maven, все работает нормально, за исключением JSP страниц, нуждающихся в DisplayTag.

Если я пытаюсь запустить веб-приложение в Tomcat 6, я получаю исключение из-за несовместимости между общими -logging и slf4j.

Если веб-приложение молча терпит неудачу, как это, без ошибок или исключений в журналах, что я должен подозревать или расследовать?


ОБНОВЛЕНИЕ

Исходя из ответа Каямана, вот что я сделал:

  1. В любом месте любого pom.xml, который зависел от commons-logging, добавьте следующее:

        <exclusions>
            <exclusion>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </exclusion>
        </exclusions>
    
  2. Если существует явная зависимость от commons-logging, пометьте его как provided:

    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.1.1</version>
        <scope>provided</scope>
    </dependency>
    
  3. При загрузке веб-приложения сейчас это то, что я видел в catalina.out:

    org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/webapp]]
    Caused by: java.lang.NoClassDefFoundError: Lorg/apache/commons/logging/Log;
            ... 10 more
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log
            ... 24 more
    
  4. Затем я добавил в веб-приложение верхнего уровня pom.xml SLF4J "re-router" для регистрации общего доступа:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>jcl-over-slf4j</artifactId>
        <version>1.6.4</version>
    </dependency>
    
  5. Также удостоверился, что SLF4J был связан с Log4j, в правильной версии (Log4J был существующим каркас ведения журнала для этого веб-приложения, 10 лет go):

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.16</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>
    
  6. Теперь при загрузке веб-приложения это позволило JSP ошибок и исключений, которые можно увидеть в catalina.out , который мне удалось успешно отладить!

1 Ответ

5 голосов
/ 01 февраля 2020

Таким образом, включение зависимости displaytag приводит к сбою компиляции jsp для всех jsps, что приводит к тому, что webapp не имеет никаких представлений, следовательно, 404. По крайней мере, очень правдоподобная последовательность событий.

Согласно это любое исключение JSP компиляции можно увидеть в файле tomcat localhost_log.xxx. Тем не менее, тот же поток продолжает жаловаться на то, что информации нет или недостаточно информации, что, вероятно, означает, что ваша конфигурация логирования повреждена.

Для этого вам, вероятно, нужно настроить мост ведения журнала .

Поскольку вы используете slf4j, а другие компоненты используют commons-logging, вы теряете информацию журнала из других компонентов. Для этого вы включаете commons-logging, но в качестве предоставлено , чтобы другие библиотеки его не извлекали.

<dependency>
  <groupId>commons-logging</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.1.1</version>
  <scope>provided</scope>
</dependency>

И затем вы включаете jcl-over-slf4j (который что дает commons-logging, как мы и обещали выше).

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>jcl-over-slf4j</artifactId>
  <version>2.0.0-alpha2-SNAPSHOT</version>
</dependency>

Это должно позволить компонентам, использующим общинное ведение журнала, связывать свои журналы с вашим slf4j (и с фактической реализацией, logback или любым другим).

Вот ссылка к другим настройкам Джаспера, если они понадобятся.

...