Как заставить Jetty использовать JNDI с областью действия JVM?

Я пытаюсь настроить ресурс JNDI для фабрики репозиториев Jackrabbit в Jetty. Проблема в том, что я, кажется, получаю JNDI в качестве веб-приложения. Мне нужно, чтобы это было в области JVM. Насколько я понял из документов, для этого вам нужно указать нулевой аргумент, как показано ниже (<Arg></Arg>) (объяснение здесь).

У меня есть два веб-приложения, развернутые в Jetty, и мне нужно, чтобы они использовали один и тот же JNDI. Если они не делятся им, Jackrabbit дважды пытается инициализироваться и терпит неудачу, что ломает все мое приложение.

Я пропустил код через отладчик и вижу, что первое веб-приложение, к которому обращаются и которому требуется поиск JNDI для репозитория Jackrabbit, получает экземпляр BindableRepositoryFactory и правильно добавляет записи в объект cache. Однако при поиске JNDI для cache создается совершенно другой объект. Это, очевидно, все еще пусто, и поэтому создается новый экземпляр, что все портит.

Я использую Jetty 7.6.2.v20120308. Вот мой причал-jndi.xml:

<New class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
    <Arg>jndi:comp/env/jcr/repository</Arg>
    <Arg>
        <New class="javax.naming.Reference" id="reference">
            <Arg>javax.jcr.Repository</Arg>
            <Arg>org.apache.jackrabbit.core.jndi.BindableRepositoryFactory</Arg>
            <Arg>null</Arg>
            <Call name="add" id="reference">
                <Arg>
                    <New class="javax.naming.StringRefAddr">
                        <Arg>configFilePath</Arg>
                        <Arg><SystemProperty name="jetty.home" default="."/>/jackrabbit/repository.xml</Arg>
                    </New>
                </Arg>
            </Call>
            <Call name="add" id="reference">
                <Arg>
                    <New class="javax.naming.StringRefAddr">
                        <Arg>repHomeDir</Arg>
                        <Arg><SystemProperty name="jetty.home" default="."/>/jackrabbit</Arg>
                    </New>
                </Arg>
            </Call>
        </New>
    </Arg>
</New>

В файле pom, из которого я вызываю причал, у меня есть следующие соответствующие настройки, которые говорят Jetty использовать настройки JNDI и Plus xml-s:

<jettyConfig>${project.build.directory}/jetty/etc/jetty-plus.xml,${project.build.directory}/jetty/etc/jetty-jndi.xml</jettyConfig>

В jetty-plus.xml у меня есть:

<!-- =========================================================== -->
<!-- Sequence of configurations to defining Plus features.       -->
<!-- =========================================================== -->
<Array id="plusConfig" type="java.lang.String">
    <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>
    <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
    <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
    <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
    <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>        <!-- Add for JNDI -->
    <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>       <!-- Add for JNDI -->
    <Item>org.eclipse.jetty.annotations.AnnotationConfiguration</Item>
    <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>
    <Item>org.eclipse.jetty.webapp.TagLibConfiguration</Item>          <!-- Not needed for Jetty-8 -->
</Array>


<!-- =========================================================== -->
<!-- Apply plusConfig to all webapps for this Server             -->
<!-- =========================================================== -->
<Call name="setAttribute">
    <Arg>org.eclipse.jetty.webapp.configuration</Arg>
    <Arg>
        <Ref id="plusConfig"/>
    </Arg>
</Call>

Any ideas what I might be doing wrong?

Спасибо заранее! :)


person carlspring    schedule 13.04.2012    source источник
comment
Работает ли он правильно при обычном развертывании на пристани в дистрибутиве? Я вижу, как это может быть проблемой с плагином jetty-maven.   -  person jesse mcconnell    schedule 13.04.2012
comment
@jessemcconnell: Не могли бы вы уточнить предполагаемую потенциальную проблему? Нет, я еще не пробовал это в автономном Jetty. Я сделаю это сейчас. Тем не менее, я не ожидаю, что это будет сильно отличаться. В конце концов, плагин Maven вызывает код сервера Jetty.   -  person carlspring    schedule 13.04.2012
comment
Частично да, но плагин jetty-maven работает с загрузчиками классов немного иначе, чем традиционный дистрибутив. Прошли годы с тех пор, как я работал над ним, но я знаю, что у него есть ряд особых случаев для извлечения зависимостей из проекта maven, и я вижу, как он может обрабатывать jndi goop немного по-другому. Если это работает в дистрибутиве, откройте для этого ошибку в codehaus jira, и мы посмотрим. Если это не работает должным образом в дистрибутиве, откройте ошибку в eclipse bugzilla под RT->Jetty.   -  person jesse mcconnell    schedule 13.04.2012
comment
Я боюсь, что это не работает так же под автономным Jetty.   -  person carlspring    schedule 13.04.2012


Ответы (1)


Похоже, это ошибка в глобальной конфигурации ресурсов JNDI Jetty.

Я сообщил об ошибке в Jetty's bugzilla и приму этот ответ как правильный. , несмотря на то, что это не решение.

person carlspring    schedule 13.04.2012
comment
В качестве дополнения к этому для всех, кто наткнется на эту страницу, на самом деле это была не ошибка в причале, а неправильная конфигурация веб-приложения. Ссылка на ошибку содержит полное объяснение того, что было не так с настройкой веб-приложения. - person Jan; 21.02.2013