Ошибка создания экземпляра DnsContextFactory на JBoss 7 - PullRequest
0 голосов
/ 08 августа 2011

При попытке создать новый InitialDirContext с помощью com.sun.jndi.dns.DnsContextFactory в JBoss AS 7 возникает следующее исключение:

Caused by: javax.naming.NamingException: Failed instantiate InitialContextFactory com.sun.jndi.dns.DnsContextFactory from classloader ModuleClassLoader for Module "deployment.test-case.ear.test-web.war:main" from Service Module Loader
        at org.jboss.as.naming.InitialContextFactoryBuilder.createInitialContextFactory(InitialContextFactoryBuilder.java:58)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:664) [:1.6.0_26]
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) [:1.6.0_26]
        at javax.naming.InitialContext.init(InitialContext.java:223) [:1.6.0_26]
        at javax.naming.InitialContext.(InitialContext.java:197) [:1.6.0_26]
        at javax.naming.directory.InitialDirContext.(InitialDirContext.java:82) [:1.6.0_26]
        at com.test.messaging.internal.resource.dns.DnsClientImpl.querySrv(DnsClientImpl.java:328) [dns-lookup-jar.jar:]
        ...

16:36:36,000 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-5) Error listenerStart
16:36:36,013 ERROR [org.apache.catalina.core.StandardContext] (MSC service thread 1-5) Context [/test] startup failed due to previous errors
16:36:36,023 INFO  [org.jboss.web] (MSC service thread 1-5) registering web context: /test

Вот соответствующий фрагмент кода:

Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
env.put("java.naming.authoritative", "false");
env.put("com.sun.jndi.dns.recursion", "true");
env.put("com.sun.jndi.dns.timeout.initial", timeoutProp);
env.put("com.sun.jndi.dns.timeout.retries", "1");
env.put("java.naming.provider.url", providerProp);
DirContext ctx = new InitialDirContext(env);

Код вызывается изнутри ServletContextListener, и поэтому исключение не позволяет запускать модуль. Я также удалил слушателя и попытался вызвать код из сервлета, который дал те же результаты (javax.naming.NamingException: Failed instantiate InitialContextFactory com.sun.jndi.dns.DnsContextFactory).

Я нашел этот поток , который казался очень похожим на проблему, с которой я сталкиваюсь, но установка свойства "jboss.modules.system.pkgs" в "com.sun.jndi.dns", как упоминал поток, не имела никакого эффекта .

Код работает правильно на JBoss 6, WebSphere Application Server 7 и Geronimo 2.2.1 (на Tomcat 6), но не работает на JBoss 7, как описано выше. Я использую JBoss AS 7.0.0.Final и тестирую с использованием автономного сервера с использованием JRE 1.6.0_26. Будем весьма благодарны за любые предложения о том, как решить эту проблему.

Я также разместил этот вопрос на форуме сообщества разработчиков JBoss, но не получил ни одного ответа.


[ОБНОВЛЕНИЕ] Кажется, эта проблема, вероятно, связана с новыми изолированными, модульными политиками загрузки классов JBoss 7. Я нашел два обходных пути / решения этой проблемы, но мне все еще интересны предложения относительно наиболее подходящего, рекомендуемого подхода, особенно если есть способ избежать ручного изменения наших приложений или установок JBoss.

MANIFEST.MF

  • Создайте модуль com.sun.jndi.dns, скопировав $JBOSS_HOME/modules/com/sun/jndi/ldap в $JBOSS_HOME/modules/com/sun/jndi/dns и изменив вхождения "ldap" в "dns"

  • Добавьте следующую запись в MANIFEST.MF веб-модуля: Dependencies: com.sun.jndi.dns

Хотя теперь это позволяет DnsContextFactory создавать экземпляры должным образом, это не кажется постоянным решением, поскольку требует изменения всех установок JBoss, а также всех приложений, использующих DnsContextFactory.

JBoss развертывания-structure.xml

  • Добавьте файл jboss-deployment-structure.xml в каталог EAR META-INF следующим образом:

    <sub-deployment name="test-web.war">
        <dependencies>
            <module name="deployment.com.sun.jndi.dns" />
        </dependencies>
    </sub-deployment>
    
    <module name="deployment.com.sun.jndi.dns">
        <dependencies>
            <module name="system" export="false">
                <exports>
                    <include-set>
                        <path name="com/sun/jndi/dns"/>
                    </include-set>
                </exports>
            </module>
        </dependencies>
    </module>
    

Это немного лучше, чем предыдущий подход "MANIFEST.MF", поскольку он требует только модификации приложения, а не модулей JBoss, но, к сожалению, все приложения, использующие DnsContextFactory, должны включать эту конфигурацию.

Я все еще ищу предложения о наиболее подходящем, рекомендованном подходе, особенно если есть способ, которым мы можем избежать включения более специфичной для JBoss конфигурации в наши приложения.

1 Ответ

0 голосов
/ 10 августа 2011

Благодаря некоторой помощи на форуме JBoss было подтверждено, что упомянутые выше обходные пути могут работать, но наиболее подходящее решение требует запроса функций от JBoss. Я зарегистрировал этот запрос функции , и тем временем еще одно временное решение - добавить путь "com/sun/jndi/dns" в дескриптор модуля sun.jdk ($JBOSS_HOME/modules/sun/jdk/main/module.xml).

...