Maven (EJB) проект с артефактами клиента и сервера - PullRequest
9 голосов
/ 18 декабря 2009

Вот мой вариант вопроса «Несколько артефактов из сборки Maven»:

Я портирую из Ant в Maven. Мое приложение - это сервер EJB, который упакован как EAR, но он также предоставляет клиентский JAR для использования другими клиентскими приложениями. Этот jar содержит интерфейсы EJB, класс фасадов и некоторые помощники.

Я знаю, что путь Maven состоит в том, чтобы иметь один артефакт на проект (POM); однако оба артефакта (сервер EAR и клиент JAR) должны быть построены из одного и того же исходного дерева - сервер и общий ресурс клиента, например, интерфейсы EJB и «home».

Как мне это сделать в Maven?

Есть ли у меня один проект, содержащий два POM, скажем, server-pom.xml и client-pom.xml? Я думал, что у меня также может быть родительский POM (pom.xml), который можно использовать для создания клиента и сервера одним махом? Однако после фазы «пакет» жизненные циклы расходятся, поскольку сервер должен пройти сборку (tar / gzip), а клиент завершает работу после «пакета» и может быть просто установлен в хранилище.

Какой-нибудь совет / опыт о том, как лучше всего подойти к этому?

Ответы [ 2 ]

18 голосов
/ 18 декабря 2009

Я знаю, что путь Maven состоит в том, чтобы иметь один артефакт на проект (POM); однако оба артефакта (сервер EAR и клиент JAR) должны быть построены из одного и того же исходного дерева - сервера и общего ресурса клиента, например, интерфейсов EJB и «home».

Есть некоторые исключения из правила "один артефакт на проект", одним из которых являются проекты EJB. Таким образом, maven-ejb-plugin можно настроить для генерации EJB-файла jar и клиентского JAR-файла следующим образом:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ejb-plugin</artifactId>
        <configuration>
           <generateClient>true</generateClient>
        </configuration>
      </plugin>
    </plugins>
  </build>

Чтобы использовать клиент ejb в другом проекте, просто добавьте его как зависимость <type>ejb-client</type>:

<project>
  [...]
  <dependencies>
    <dependency>
      <groupId>com.example</groupId>
      <artifactId>ejb-project</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>ejb-client</type>
    </dependency>
  </dependencies>
  [...]
</project>

См. Генерация EJB-клиента , Использование ejb-клиента в качестве зависимости и документация ejb mojo для получения более подробной информации (включая способ настройки классы, включенные / исключенные из клиента ejb).

6 голосов
/ 18 декабря 2009

Я использовал многомодульные проекты , чтобы решить эту проблему раньше.

project/
    pom.xml  <- type=pom, lists sub modules
    ejb/
        src/main/java, etc.
        pom.xml <- type=ejb, describes ejb module, has dependency on "jar" module
    jar/ 
        src/main/java, etc.
        pom.xml <- type=jar, simple, builds jar
    ear/ 
        pom.xml <- type=ear, has reference to ejb module that it should use
    ...

Я использую этот подход для довольно сложных проектов, которые могут иметь дюжину различных модулей, которые должны быть собраны вместе. См. ear docs для ссылки на ejb.

В родительском pom.xml используется тег modules:

<modules>
    <module>jar</module>
    <module>ejb</module>
    <module>ear</module>
</modules>

И дочерний pom.xml использует тег parent:

<parent>
    <groupid>mygroup</group>
    <artifactId>parentName</artifactId>
</parent>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...