Не удается развернуть приложение Java EE, ссылающееся на другой модуль EJB - PullRequest
2 голосов
/ 28 марта 2012

У меня есть приложение («CC»), содержащее два модуля: CC-ejb и CC-war. CC-ejb содержит объекты JPA и фасады, которые использует CC-war. Это приложение работает правильно. Теперь я создаю еще один ("CINT") с двумя модулями: CINT-ejb и CINT-war. В веб-модуле мне нужно получить доступ к объектам, предоставленным CC-ejb. Я использую NetBeans 7.1 для разработки и Glassfish 3.1.1 для развертывания.


В CC-ejb у меня есть интерфейс:

/* ... */
import javax.ejb.Local;

@Local
public interface CallDetailsFacadeLocal {
        /* ... */

и реализующий класс:

/* ... */
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
/* ... */
import tp.coma.data.entities.CallDetails;

@Stateless
public class CallDetailsFacade
            extends AbstractFacade<CallDetails>
            implements CallDetailsFacadeLocal {
    @PersistenceContext(unitName = "CC-ejbPU")
    private EntityManager em;
    /* ... */

В CINT-war я упоминаю об этом в одном из моих бобов:

/* ... */
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import tp.coma.data.beans.CallDetailsFacadeLocal;
/* ... */

@ManagedBean(name = "bookingController")
@SessionScoped
public class BookingController implements Serializable {
    /* ... */
    @EJB
    private CallDetailsFacadeLocal cdrFacade;
    /* ... */

При развертывании CINT (CC уже запущен и работает), я получаю следующее сообщение:

Произошла ошибка при развертывании: исключение при загрузке приложения: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Ltp / coma data / beans / CallDetailsFacadeLocal; java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Ltp / beans / coma Пожалуйста, смотрите server.log для более подробной информации.

В журнале сервера я вижу:

[# | 2012-03-28T12: 42: 42.236 + 0200 | SEVERE | glassfish3.1.1 | global | _ThreadID = 22; _ThreadName = Thread-2; | Класс [Ltp / coma / data / beans / CallDetailsFacadeLocal; ] не найдено. Ошибка при загрузке [class tp.coma.cint.jsf.BookingController] | #] [# | 2012-03-28T12: 42: 42.252 + 0200 | SEVERE | glassfish3.1.1 | global | _ThreadID = 22; _ThreadName = Thread-2; | Класс [Ltp / coma / data / beans / CallDetailsFacadeLocal; ] не найдено. Ошибка при загрузке [class tp.coma.cint.jsf.BookingController] | #]

И несколько (восемь) следов стека исключений.

Что я делаю не так ??

1 Ответ

1 голос
/ 29 марта 2012

Если вы делаете сборки с помощью maven, прочитайте о создании jar-файла клиента вместе с вашим ejb-jar. http://maven.apache.org/plugins/maven-ejb-plugin/examples/ejb-client-dependency.html

Если вы выполняете сборку ant, создайте задачу, которая генерирует клиентский jar, просто включите ** / * Local.jar или любой другой шаблон, который имеет смысл для вашего проекта.

И не забывайте о файлах * $ 1.class, они могут укусить вас позже. Например, если вы включаете Enum, java генерирует анонимный класс, и вы получите класс XYZ $ 1.c, и в зависимости от того, что это, вам нужно будет исключить или включить его. В моем случае maven включил сгенерированный класс $ 1. из реализации сессионного компонента. Затем разные загрузчики классов разозлились, что было две копии этого анонимного класса. (IllegalAccessError)

...