Как я могу использовать JSP 2.1 с плагином Cargo maven и встроенным Jetty6x? - PullRequest
2 голосов
/ 24 июня 2010

У меня есть веб-приложение, использующее JSP 2.1, Servlets 2.5 и JSTL 1.2 на Java 6. Я тестирую с использованием maven-jetty-plugin 6.1.1rc1 без каких-либо проблем. По этой ссылке: http://docs.codehaus.org/display/JETTY/JSP+2.0+v+JSP+2.1, Я понимаю, что Jetty 6 выберет JSP 2.1, если на JDK 5+, который работает нормально.

Вот соответствующий раздел из моего pom.xml приложения войны:

<!--servlet & javax-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
    </dependency> 

Теперь я бы хотел настроить автоматические интеграционные тесты с использованием встроенного Cargo и Jetty6x. Контейнер запускается нормально, без ошибок. Тем не менее, я не могу рендерить JSP. Это исключение, которое я получаю, поскольку, насколько я могу судить, вместо JSP-2.1 используется имплант JSP-2.0.

(TagLibraryInfoImpl.java:547) - Unknown element (deferred-value) in attribute

и Caused by: java.lang.NoSuchMethodError: javax.servlet.jsp.PageContext.getELContext()Ljavax/el/ELContext; at org.apache.taglibs.standard.tag.common.core.SetSupport.doEndTag(SetSupport.java:140)

Вот мой грузовой конфиг:

<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.0.1</version>
<configuration>
    <container>
        <containerId>jetty6x</containerId>
        <type>embedded</type>
    </container>
    <configuration>
        <deployables>
            <deployable>
                <groupId>groupId</groupId>
                <artifactId>artifact</artifactId>
                <type>war</type>
            </deployable>
        </deployables>
    </configuration>
    <wait>${cargo.wait}</wait>
</configuration>
<executions>
    <execution>
        <id>start-container</id>
        <phase>pre-integration-test</phase>
        <goals>
            <goal>start</goal>
        </goals>
    </execution>
    <execution>
        <id>stop-container</id>
        <phase>post-integration-test</phase>
        <goals>
            <goal>stop</goal>
        </goals>
    </execution>
</executions>

Грузовой контейнер jetty6x также использует v6.1.1rc1 пристани, поэтому это должно быть как-то связано с тем, как груз использует причал. Я знаю, что груз жестко кодирует версии своих контейнерных зависимостей вместо того, чтобы использовать механизм зависимостей maven (вероятно, по уважительной причине, jira -> CARGO-571)

Итак, мой вопрос: кому-нибудь еще удавалось использовать JSP 2.1 со встроенным грузом и причалом 6x? Любые предложения для того, чтобы заставить это работать?

Любая помощь высоко ценится!

1 Ответ

1 голос
/ 24 июня 2010

ОК, удалось выяснить это. Этот пост из списка рассылки грузов был полезен: http://old.nabble.com/Jetty6-version-with-maven-plugin-td16722550.html. В нем описывается, как вы можете настроить путь к классу контейнера с использованием груза, но если вы воспользуетесь этим подходом, вам нужно будет указать все зависимости вручную.

Из источников груза я обнаружил, что это зависимости, используемые по умолчанию для контейнеров jetty6x:

jetty6xDependencies.add(new Dependency("org.mortbay.jetty", "jsp-api-2.0", "6.1.1rc1"));
    jetty6xDependencies.add(new Dependency("org.mortbay.jetty", "servlet-api-2.5", "6.1.1rc1"));
    jetty6xDependencies.add(new Dependency("org.mortbay.jetty", "jetty", "6.1.1rc1"));
    jetty6xDependencies.add(new Dependency("org.mortbay.jetty", "jetty-util", "6.1.1rc1"));
    jetty6xDependencies.add(new Dependency("org.mortbay.jetty", "jetty-naming", "6.1.1rc1"));
    jetty6xDependencies.add(new Dependency("org.mortbay.jetty", "jetty-plus", "6.1.1rc1"));
    jetty6xDependencies.add(new Dependency("ant", "ant", "1.6.5"));
    jetty6xDependencies.add(new Dependency("commons-el", "commons-el", "1.0"));
    jetty6xDependencies.add(new Dependency("tomcat", "jasper-compiler", "5.5.15"));
    jetty6xDependencies.add(new Dependency("tomcat", "jasper-runtime", "5.5.15"));
    jetty6xDependencies.add(new Dependency("tomcat", "jasper-compiler-jdt","5.5.15"));
    jetty6xDependencies.add(new Dependency("javax.mail", "mail", "1.4"));
    jetty6xDependencies.add(new Dependency("javax.activation", "activation", "1.1"));
    jetty6xDependencies.add(new Dependency("geronimo-spec", "geronimo-spec-jta", "1.0.1B-rc4"));
    jetty6xDependencies.add(new Dependency("xerces", "xercesImpl","2.6.2"));
    jetty6xDependencies.add(new Dependency("xerces", "xmlParserAPIs","2.6.2"));
    jetty6xDependencies.add(new Dependency("commons-logging", "commons-logging","1.0.4"));
    jetty6xDependencies.add(new Dependency("log4j", "log4j", "1.2.14"));

Проблематичными являются кошки, потому что они используют JSP 2.0. Поэтому при настройке classpath вам необходимо исключить их и включить JSP-2.1, т.е.

<dependencies>
<dependency>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jsp-2.1</artifactId>
    <version>6.1.1rc1</version>
</dependency>

<dependency>
    <groupId>org.eclipse.jdt</groupId>
    <artifactId>core</artifactId>
    <version>3.1.1</version>
</dependency>

Итак, вот вся конфигурация:

<plugin>
<groupId>org.codehaus.cargo</groupId>
<artifactId>cargo-maven2-plugin</artifactId>
<version>1.0.1</version>
<configuration>
    <container>
        <containerId>jjetty6x</containerId>
        <type>embedded</type>
        <implementation>
            org.codehaus.cargo.container.jetty.Jetty6xEmbeddedLocalContainer
        </implementation>
        <timeout>500000</timeout>
        <dependencies>
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jsp-api-2.1</artifactId>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </dependency>
            <dependency>
                <groupId>commons-logging</groupId>
                <artifactId>commons-logging</artifactId>
            </dependency>
            <dependency>
                <groupId>xerces</groupId>
                <artifactId>xmlParserAPIs</artifactId>
            </dependency>
            <dependency>
                <groupId>xerces</groupId>
                <artifactId>xercesImpl</artifactId>
            </dependency>
            <dependency>
                <groupId>geronimo-spec</groupId>
                <artifactId>geronimo-spec-jta</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.activation</groupId>
                <artifactId>activation</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.mail</groupId>
                <artifactId>mail</artifactId>
            </dependency>
            <!--replaced these:-->
            <!--<dependency>
                <groupId>tomcat</groupId>
                <artifactId>jasper-compiler</artifactId>
            </dependency>
            <dependency>
                <groupId>tomcat</groupId>
                <artifactId>jasper-runtime</artifactId>
            </dependency>
            <dependency>
                <groupId>tomcat</groupId>
                <artifactId>jasper-compiler-jdt</artifactId>
            </dependency>-->
            <!--with this:-->
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jsp-2.1</artifactId>
            </dependency>
            <dependency>
                <groupId>org.eclipse.jdt</groupId>
                <artifactId>core</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>servlet-api-2.5</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-util</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-naming</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-plus</artifactId>
            </dependency>
            <dependency>
                <groupId>ant</groupId>
                <artifactId>ant</artifactId>
            </dependency>
            <dependency>
                <groupId>commons-el</groupId>
                <artifactId>commons-el</artifactId>
            </dependency>
        </dependencies>
    </container>
    <configuration>
        <deployables>
            <deployable>
                <groupId>gruopId</groupId>
                <artifactId>artifact</artifactId>
                <type>war</type>
            </deployable>
        </deployables>
        <implementation>
            org.codehaus.cargo.container.jetty.Jetty6xEmbeddedStandaloneLocalConfiguration
        </implementation>
</configuration>
<executions>
    <execution>
        <id>start-container</id>
        <phase>pre-integration-test</phase>
        <goals>
            <goal>start</goal>
        </goals>
    </execution>
    <execution>
        <id>stop-container</id>
        <phase>post-integration-test</phase>
        <goals>
            <goal>stop</goal>
        </goals>
    </execution>
</executions>

Обратите внимание, что вам нужно указать все зависимости дважды - один раз в плагине и один раз как зависимости проекта. Вы можете получить версии из первого фрагмента.

...