При попытке создать новый 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 конфигурации в наши приложения.