Разделение EJB и интерфейсов на отдельный модуль - сбой развертывания - PullRequest
3 голосов
/ 28 марта 2010

У меня проблемы с выполнением этого руководства для "извлечения" моих интерфейсов и сущностей из моего EAR для использования их из другого веб-приложения:

  • Я использую NetBeans 6.8 и Glassfish 3.0.1
  • Проект "Библиотека классов Java"
    • содержит все сущности и интерфейсы
  • Проект "Приложение Java EE"
    • библиотека классов, добавленная в проект, упакована в EAR
    • содержит реализации EJB, MDB, Test
  • Проект "Java Web Application"
    • библиотека классов, добавленная в проект, упакована в WAR
    • содержит интерфейс REST

Когда я собираю и внедряю веб-приложение, все идет хорошо.

Когда я собираю приложение Java EE, я вижу, что включается jar-файл (интерфейсы, сущности). Но когда я пытаюсь развернуть EAR, Glassfish отклоняет его с ошибкой java.lang.NoClassDefFoundError:

[#|2010-03-28T18:25:59.875+0200|WARNING|glassfishv3.0|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: mvs/core/StoreServiceLocal|#]

[#|2010-03-28T18:25:59.876+0200|SEVERE|glassfishv3.0|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=28;_ThreadName=Thread-1;|Exception while deploying the app
java.lang.IllegalArgumentException: Invalid ejb jar [CoreServer]: it contains zero ejb. 
Note: 
1. A valid ejb jar requires at least one session, entity (1.x/2.x style), or message-driven bean. 
2. EJB3+ entity beans (@Entity) are POJOs and please package them as library jar. 
3. If the jar file contains valid EJBs which are annotated with EJB component level annotations (@Stateless, @Stateful, @MessageDriven, @Singleton), please check server.log to see whether the annotations were processed properly.

'mvs / core / StoreServiceLocal' - это интерфейс, который определен в файле jar библиотеки.

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

Я использую аннотации EJB3, поэтому не существует специфического для bean-компонента дескриптора развертывания:

MVS / ядро ​​/ ShopperService.java:

@Stateless
public class ShopperService implements ShopperServiceLocal, ShopperServiceRemote {
}

MVS / ядро ​​/ ShopperServiceLocal.java:

@Local
public interface ShopperServiceLocal {
}

Ответы [ 2 ]

4 голосов
/ 29 марта 2010

Ваш проект "Приложение Java EE" должен содержать интерфейсы (которые в настоящее время не могут быть загружены во время выполнения, следовательно, NoClassDefFoundError). И если вы хотите вызывать EJB из другого веб-приложения, создайте дополнительный «клиентский» jar (только с интерфейсами).

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

Я не уверен насчет подробной структуры вашего EAR-файла, который вы перечислили выше.Внутри EAR-файла должен быть один WAR-файл (для веб-контейнера) и другой JAR-файл, содержащий ваш EJB (для EJB-контейнера).Оба должны знать об интерфейсах EJB, так как их соответствующие контейнеры имеют отдельные загрузчики классов.

Если вам не нужна полнофункциональная функциональность EJB, тогда EJB lite (поставляется с EJB 3.1) позволяет вам просто создать один WARфайл, в который вы можете поместить оба. Например, эта WAR может содержать ваши EJB и сервлеты.Это упрощает развертывание всего с одним файлом WAR.Но EJB lite полезен только в том случае, если вашим EJB не нужно предоставлять какие-либо удаленные интерфейсы.

Если вам нужны удаленные интерфейсы для ваших EJB, тогда EAR-файл - верный путь.Этот файл EAR должен содержать файл WAR для веб-целей и файлы JAR для ваших определений EJB.

...