У меня была такая же проблема;Попытался поместить класс Interface в качестве отдельного модуля и включить его в одно ухо, а также включить его как предоставленный в другое ухо;В JBOSS классы в каждом EAR загружаются отдельным загрузчиком классов.Таким образом, если один EAR имеет класс A, а другой - тот же класс A, вы получите исключение приведения класса.Таким образом, во втором EAR дайте зависимость, как предусмотрено, и в jboss-deploy-structure.xml добавьте первый EAR как зависимость модуля.Обратите внимание, что динамическая зависимость модуля может гарантировать постоянное имя файла EAR;Вы можете указать <finalName>
под тегом сборки для файла EAR, чтобы исправить это
Также изменил поиск с локального на удаленный - см. Ниже, и включил модуль maven, содержащий интерфейс, в оба модуля
//jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
TO
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.naming.remote.client.InitialContextFactory");
И вы хотели бы изменить поиск с java: app на java: global
final javax.naming.Context context = new InitialContext(jndiProperties);
AsyncFutureItf test =(AsyncFutureItf)context.lookup
//("java:app/Executor/AsyncFutureTest!pacakge.AsyncFutureItf");
("java:global/ExecutorEar/Executor/AsyncFutureTest!package.AsyncFutureItf");
И поскольку Ear обычно регистрируется с такой версией, как эта
java:global/ExecutorEar-<version>/Executor/AsyncFutureTest!package.AsyncFutureItf
и вы не хотите, чтобы в вашем коде осуществлялся поиск по версии, вам нужно сделать еще две вещи.В вашем application.xml в maven dir вашего EAR builder (src \ main \ resources \ application.xml) вам нужно добавить тег «application-name», например
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5">
<description>Task Controller EAR</description>
<display-name>TaskControllerEAR</display-name>
<application-name>TaskControllerEAR</application-name>
<module>
<ejb>TaskController.jar</ejb>
</module>
<library-directory>lib</library-directory>
</application>
, и в pom для созданияПом, вам нужно предоставить ссылку на application.xml, например
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<version>5</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<earSourceDirectory>src/main/resources</earSourceDirectory>
<applicationXml>${project.basedir}/src/main/resources/application.xml</applicationXml>
...
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
<ear-subdeployments-isolated>false</ear-subdeployments-isolated>
<sub-deployment name="MROControllerRest.war">
<exclusions>
<module name="org.apache.commons.logging" />
<module name="org.slf4j" />
<module name="org.slf4j.ext" />
<module name="org.slf4j.jcl-over-slf4j" />
<module name="org.slf4j.impl" />
<module name="org.apache.log4j" />
</exclusions>
<dependencies>
<module name="org.slf4j" slot="1.7.5" />
<module name="logger" />
<module name="deployment.TaskControllerEAR.ear.TaskController.jar" export="TRUE"/>
</dependencies>
Вот трассировка стека для справки
java.lang.ClassCastException: com.package.TaskSplitterItf$$$view210 cannot be cast to com.package.TaskSplitterItf