Как разрешить ссылки на классы во внешнем файле конфигурации для развертывания grails war?

#grails #log4j #perf4j

#grails #log4j #perf4j

Вопрос:

Я использую Grails 1.3.7. Я создаю файл war и развертываю его в tomcat. У меня есть внешний файл конфигурации groovy, который я использую для настройки ведения журнала. Я добавил некоторые приложения для ведения журнала perf4j к объявлению, но теперь файл конфигурации не может скомпилироваться, потому что он не может разрешить полные имена классов.

Код выглядит следующим образом:

 log4j = {
    ...
    // file appender that writes out the URLs of the Google Chart API graphs generated by the performanceGraphAppender
    def performanceGraphFileAppender = new org.apache.log4j.FileAppender(
        fileName: "log/perfGraphs.log",
        layout: pattern(conversionPattern: '%m%n')
    )
    appender name: 'performanceGraphFileAppender', performanceGraphFileAppender

    // this appender creates the Google Chart API graphs
    def performanceGraphAppender = new org.perf4j.log4j.GraphingStatisticsAppender(
        graphType: 'Mean',      // possible options: Mean, Min, Max, StdDev, Count or TPS
        tagNamesToGraph: 'tag1,tag2,tag3',
        dataPointsPerGraph: 5
    )
    performanceGraphAppender.addAppender(performanceGraphFileAppender)
    appender name: 'performanceGraph', performanceGraphAppender

    ...
}
  

и сообщение об ошибке, которое записывается в журнал, выглядит следующим образом:

 script1317679813518843914255.groovy: 38: unable to resolve class org.perf4j.log4j.GraphingStatisticsAppender 
@ line 38, column 34.
    def performanceGraphAppender = new org.perf4j.log4j.GraphingStatisticsAppender(
  

Файл war, который я создаю, содержит все необходимые JAR. Есть мысли о том, как заставить его разрешить ссылки?

Спасибо,

Gene

Ответ №1:

Существует вероятность того, что после развертывания он начнет использовать log4j из tomcat. Взгляните на lib папку, возможно, она содержит банки log4j. Если это правда — он использует другой загрузчик классов, который не может видеть ваши классы perf4j.

Вы можете попробовать поместить свои банки perf4j в tomcat lib , возможно, это может решить эту проблему

Комментарии:

1. Это интересно. Я попробую. Однако мне интересно, как это работает: среда выполнения grails находится в том же файле WAR, что и файлы perf4j. Почему он не найдет их? Чего мне не хватает?

2. Когда я поместил банки perf4j и log4j в папку tomcat / lib, код, казалось, выполнялся правильно. Интересно, почему он не выбирает классы из файла application WAR.

3. это проблема разных загрузчиков классов. Похоже, что у tomcat были классы log4j где-то еще, а не только ваша война (поскольку log4j используется большинством проектов), и JVM заявила, что использует его (= из другого загрузчика классов). В то же время per4j был только в вашей войне, но загрузчик классов, содержащий log4j (= соседний загрузчик классов), не имеет доступа к вашим библиотекам.

4. До того, как я поместил log4j в папку lib, он также не разрешал классы log4j, упомянутые в моем файле logging.groovy. Так что для меня это все еще загадка.