Я использую плагин Maven Cargo для запуска веб-контейнера Jetty для запуска некоторых интеграционных тестов в отдельном модуле проекта.
Проблема, с которой я борюсь, возникает, когда я добавляю библиотеки тегов на страницы jsp и пытаюсь получить их из интеграционных тестов. Когда причал пытается скомпилировать страницы, он завершается ошибкой:
org.apache.jasper.JasperException: Unable to initialize TldLocationsCache: null
Веб-приложение отлично работает при запуске в установленном контейнере Tomcat или автономном запуске Jetty через maven в командной строке, поэтому я думаю, что проблема должна быть связана с тем, как груз встраивает причал, а затем как причал компилирует приложение.
Я пробовал работать в разветвленном и неразветвленном режимах, добавляя библиотеки тегов в путь к классам контейнера, явно определяя библиотеки тегов в web.xml и не имея там конфигурации... все безрезультатно.
Вот тестовый проект, который я использую для отладки:
веб.xml
<?xml version='1.0' encoding='UTF-8'?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>taglibs-test</display-name>
<jsp-config>
<taglib>
<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/tld/c.tld</taglib-location>
</taglib>
</jsp-config>
And the test module pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
http://maven.apache.org/maven-v4_0_0.xsd">
...
<build>
<!-- Integration Test Embedded Servlet Container -->
<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<configuration>
<wait>false</wait>
<container>
<containerId>jetty6x</containerId>
<type>embedded</type>
<log>${project.build.directory}/log</log>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
</dependency>
</dependencies>
<systemProperties>
<DEBUG>true</DEBUG>
</systemProperties>
</container>
<configuration>
<properties>
<cargo.servlet.port>8090</cargo.servlet.port>
<cargo.logging>high</cargo.logging>
</properties>
<deployables>
<deployable>
<groupId>test</groupId>
<artifactId>web</artifactId>
<type>war</type>
<properties>
<context>taglibs-test</context>
</properties>
</deployable>
</deployables>
</configuration>
</configuration>
<executions>
<execution>
<id>start-container</id>
<phase>test-compile</phase>
<goals>
<goal>start</goal>
</goals>
</execution>
<execution>
<id>stop-container</id>
<phase>package</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Here's the stacktrace from the error:
2009-01-24 13:53:06.766::WARN: /taglibs-test/index.jsp:
org.apache.jasper.JasperException: Unable to initialize TldLocationsCache: null
at org.apache.jasper.compiler.TldLocationsCache.init(TldLocationsCache.java:253)
at org.apache.jasper.compiler.TldLocationsCache.getLocation(TldLocationsCache.java:224)
at org.apache.jasper.JspCompilationContext.getTldLocation(JspCompilationContext.java:526)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:422)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:492)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1552)
at org.apache.jasper.compiler.Parser.parse(Parser.java:126)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:211)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:100)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:155)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:295)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
Я отследил это до следующих строк в TldLocationsCache яшмы:
private void init() throws JasperException {
if (initialized) return;
try {
processWebDotXml();
scanJars();
processTldsInFileSystem("/WEB-INF/");
initialized = true;
} catch (Exception ex) {
throw new JasperException(Localizer.getMessage(
"jsp.error.internal.tldinit", ex.getMessage()));
}
}
Любая помощь приветствуется!
камера