Нужна помощь в создании глобального модуля в проекте JBoss 7 для c3p0

У меня есть проект, работающий на сервере JBoss 7, для которого я пытаюсь использовать c3p0. JBoss 7 не поддерживает просто сброс jar-файлов в папку /lib, как в предыдущих версиях. Как я понимаю, мне нужно использовать новую систему модулей. Вот шаги, которые я предпринял:

Скачал jar c3p0 отсюда: http://sourceforge.net/projects/c3p0/?source=dlp

Скопировал 3 баночки в мой проект Eclipse и добавил их в путь сборки (я уверен, что это было сделано правильно).

Сделал папку в JBOSS_HOME\modules\com\c3p0\main, и я добавил туда 3 банки, плюс я создал файл "module.xml" со следующим содержимым:

<?xml version="1.0" encoding="UTF-8
<module xmlns="urn:jboss:module:1.0" name="com.c3p0">
    <resources>
        <resource-root path="c3p0-0.9.5-pre8.jar"/>
        <resource-root path="c3p0-oracle-thin-extras-0.9.5-pre8.jar"/>
        <resource-root path="mchange-commons-java-0.2.7.jar"/>
    </resources>
</module>

Я добавил следующее в мой JBoss standalone.xml (часть sun.jdk уже была там):

<subsystem xmlns="urn:jboss:domain:ee:1.0">
    <global-modules>
        <module name="sun.jdk" slot="main"/>
        <module name="com.c3p0" slot="main"/>
    </global-modules>
</subsystem>

Запустил сервер и получил доступ к той части кода, которая использует класс из jar c3p0. Получил следующее сообщение об ошибке (сокращенно):

WARN  [org.jboss.modules] (http-localhost-127.0.0.1-9091-2) Failed to define class com.mchange.v2.c3p0.ComboPooledDataSource in Module "com.c3p0:main" from local module loader @50908fa9 (roots: C:\jboss-as-web-7.0.2.Final\modules): java.lang.LinkageError: Failed to link com/mchange/v2/c3p0/ComboPooledDataSource (Module "com.c3p0:main" from local module loader @50908fa9 (roots: C:\jboss-as-web-7.0.2.Final\modules))
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:401)
    at org.jboss.modules.ModuleClassLoader.loadClassLocal(ModuleClassLoader.java:261)
    at org.jboss.modules.ModuleClassLoader$1. loadClassLocal(ModuleClassLoader.java:76)
    ... LOTS MORE
Caused by: java.lang.NoClassDefFoundError: javax/naming/Referenceable
    at java.lang.ClassLoader.defineClass1(Native Method) [:1.7.0_45]
    at java.lang.ClassLoader.defineClass(Unknown Source) [:1.7.0_45]
    at java.security.SecureClassLoader.defineClass(Unknown Source) [:1.7.0_45]
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:397)
    ... 86 more
Caused by: java.lang.ClassNotFoundException: javax.naming.Referenceable from [Module "com.c3p0:main" from local module loader @50908fa9 (roots: C:\jboss-as-web-7.0.2.Final\modules)]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:361)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333)
    at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:310)
    at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:103)
    ... 90 more
javax.ejb.EJBException: Unexpected Error
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:157)
    ...
Caused by: java.lang.LinkageError: Failed to link com/mchange/v2/c3p0/ComboPooledDataSource (Module "com.c3p0:main" from local module loader @50908fa9 (roots: C:\jboss-as-web-7.0.2.Final\modules))
    at org.jboss.modules.ModuleClassLoader.defineClass(ModuleClassLoader.java:401)
    ...
Caused by: java.lang.NoClassDefFoundError: javax/naming/Referenceable
    at java.lang.ClassLoader.defineClass1(Native Method)
    ...
Caused by: java.lang.ClassNotFoundException: javax.naming.Referenceable from [Module "com.c3p0:main" from local module loader @50908fa9 (roots: C:\jboss-as-web-7.0.2.Final\modules)]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
    ...

Что я делаю неправильно? Любая помощь высоко ценится!

РЕШЕНИЕ:

В моем файле module.xml отсутствовали зависимости. Тот, который работает следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.c3p0">
    <resources>
        <resource-root path="c3p0-0.9.5-pre8.jar"/>
        <resource-root path="c3p0-oracle-thin-extras-0.9.5-pre8.jar"/>
        <resource-root path="mchange-commons-java-0.2.7.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
        <module name="org.hibernate"/>
    </dependencies>
</module>

1 ответ

Решение

Вы должны определить <dependencies> для вашего собственного модуля c3p0. Я хотел бы начать с этого и добавлять других по мере необходимости.

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.c3p0">
    <resources>
        <resource-root path="c3p0-0.9.5-pre8.jar"/>
        <resource-root path="c3p0-oracle-thin-extras-0.9.5-pre8.jar"/>
        <resource-root path="mchange-commons-java-0.2.7.jar"/>
    </resources>
    <dependencies>
        <module name="javax.api"/>
        <module name="javax.transaction.api"/>
    </dependencies>
</module>

Обратите внимание, что javax.api Модуль - это просто совокупность множества других зависимостей модуля EE.

Другие вопросы по тегам