如何让 Jetty 使用 JVM 范围的 JNDI



我正在尝试为Jetty的Jackrabbit存储库工厂设置JNDI资源。问题是我似乎正在将JNDI作为Web应用程序范围。我需要它是JVM范围的。据我从文档中了解到,您需要指定一个空参数,如下所示(<Arg></Arg>)才能这样做(此处解释)。

我有两个Web应用程序部署到Jetty,我需要它们共享同一个JNDI。如果他们不共享它,Jackrabbit 会尝试初始化两次并失败,这会破坏我的整个应用程序。

通过调试器运行了代码,我可以看到第一个被访问并需要对 Jackrabbit 存储库进行 JNDI 查找的 Web 应用程序获取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>

在我从中调用 jetty 的 pom 文件中,我有以下相关设置,告诉 Jetty 使用 JNDI 和 Plus 设置 xml-s:

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

在码头上.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>

知道我可能做错了什么吗?

提前非常感谢! :)

这似乎是 Jetty 全局 JNDI 资源配置中的一个错误。

我已经在 Jetty 的 bugzilla 中提交了一个错误,并将接受这个答案是正确的,尽管它不是解决方案。

最新更新