Проблема загрузки Jetty Class - PullRequest
0 голосов
/ 03 февраля 2012

Я использую плагин Jetty Maven для локального запуска веб-приложения и получаю исключение приведения классов, когда пытаюсь получить ресурс JNDI.

У меня есть конфигурация Jetty с объектом ресурса, который является компонентом конфигурации, который используется через JNDI. Этот класс находится в другом фляге на пути к классам, который находится в каталоге lib:

<Configure class="org.mortbay.jetty.Server">
    <New class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>config/MyConfigObject</Arg>
        <Arg>
            <New class="my.config.ConfigObject">
                <Set name="foo">bar</Set>
            </New>
        </Arg>
    </New>
</Configure>

Получено с помощью Spring:

<bean id="MyConfigObject" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/config/MyConfigObject" />
</bean>

Внутри сервлета я беру объект вручную:

final MyConfigObject config = (MyConfigObject) applicationContext.getBean("MyConfigObject");

Но когда я пытаюсь получить доступ к сервлету, я получаю:

java.lang.ClassCastException: my.config.MyConfigObject cannot be cast to my.config.MyConfigObject

Я почти уверен, что проблема в загрузке классов, но я не уверен на 100%. Загрузчик классов MyConfigObject является загрузчиком классов солнца по умолчанию, в то время как текущий загрузчик классов потока имеет значение WebAppClassLoader. Мой файл находится в WEB-INF / lib, и я даже добавил его вручную в extraClasspath в конфигурации плагина maven:

<plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>maven-jetty-plugin</artifactId>
                <version>6.1.25</version>
                <configuration>
                    <jettyConfig>${basedir}/test/jetty.xml</jettyConfig>
                    <webAppSourceDirectory>${basedir}/target/${project.artifactId}</webAppSourceDirectory>
                    <webXml>${basedir}/war/WEB-INF/web.xml</webXml>
                    <webAppConfig>
                        <extraClasspath>${basedir}/target/${project.artifactId}/WEB-INF/lib/myConfigJar-1.0.jar</extraClasspath>
                    </webAppConfig>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>testing</groupId>
                        <artifactId>myConfigJar</artifactId>
                        <version>1.0</version>
                    </dependency>
                </dependencies>
            </plugin>

Я застрял на этом этапе. Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Проблема в том, что у вас есть баночка, перечисленная в слишком многих местах - попытка добавить ее к extraClasspath на самом деле сделает ее хуже, а не лучше.

Вы говорите, что она в WEB-INF/lib, но я предполагаю, что она также указана как зависимость в вашем pom.xml

Вы не хотите этого делать, вам нужно иметь одну единственную ссылку на нее.Либо в качестве зависимости в вашем pom.xml или в вашем каталоге lib, либо в extraClasspath, но только в 1 месте.

(Подсказка: pom.xml почти наверняка правильное местоизбавься от остальных)

0 голосов
/ 03 февраля 2012

ваше веб-приложение должно не включать в него класс "my.config.MyConfigObject" (и связанные с ним классы).

основная проблема заключается в том, что вы загружаете класс на 2разные загрузчики классов.вам нужно исключить класс из загрузчика классов веб-приложения, чтобы ваше веб-приложение использовало тот же класс, что и Jetty.

...