как указать сборке maven в подмодуле, чтобы включить только зависимости, необходимые этому модулю?

Я работаю над многомодульным проектом maven с этими модулями

parent
  |-- restful    // this is a jersey restful service as a WAR
  |-- shared     // some stuff shared by all other modules as a jar
  |-- cl-client  // a commandline client to the restful service, needs assembly

Родительский pom.xml использует dependencyManagement для перечисления всех зависимостей, используемых всеми модулями.

Pom для cl-client включает плагин сборки, настроенный для выполнения на этапе пакета:

    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>2.4</version>
      <executions>
        <execution>
          <id>distro-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
          <configuration>
            <descriptors>
              <descriptor>src/main/assembly/assembly.xml</descriptor>
            </descriptors>
          </configuration>
        </execution>
      </executions>
    </plugin>

а файл assembly.xml выглядит следующим образом:

<assembly>
  <id>commandlinable</id>
  <formats>
    <format>dir</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects>
      <includes>
        <include>my:cl-client</include>
      </includes>
      <binaries>
        <outputDirectory>${artifactId}</outputDirectory>
        <unpack>true</unpack>
        <dependencySets>
          <dependencySet>
            <outputDirectory>${artifactId}/lib</outputDirectory>
            <useProjectArtifact>true</useProjectArtifact>
            <unpack>false</unpack>
            <scope>runtime</scope>
          </dependencySet>
        </dependencySets>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>

Когда я запускаю mvn package, модули cl-client собираются нормально и создают каталог, на который я надеялся, но единственная проблема заключается в том, что все jar-файлы зависимостей копируются в каталог lib /, даже те, которые используются только "restful «модуль, такой как банки, связанные с трикотажем. Я попытался перевернуть флаг useProjectArtifact, но, похоже, это не имело никакого значения.

Так что мне просто интересно, могу ли я сказать, что сборка Maven должна включать только те банки, которые требуются модулю cl-client. Я пролистал довольно много онлайн-ресурсов по сборке Maven для многомодульных проектов, но не смог получить четких ответов.


person Jim    schedule 07.02.2013    source источник
comment
Есть ли у проекта cl-client в качестве зависимости проект restful? Если да, то предположительно выполнение mvn dependency:tree в проекте cl-client показывает все JAR-файлы, которые вы видите в выходных данных сборки?   -  person Duncan Jones    schedule 07.02.2013
comment
cl-client pom наследуется от родительского pom?   -  person Andrew Logvinov    schedule 07.02.2013
comment
@Andrew да, pom cl-client наследуется от родительского pom   -  person Jim    schedule 07.02.2013
comment
@Duncan большое спасибо за предложение. Я все еще новичок в maven и не знал о команде dependency: tree. Это очень полезно. Похоже, что hbase jar зависит от jersey, поэтому он включен.   -  person Jim    schedule 07.02.2013
comment
@ Дункан: Не могли бы вы (или Джим) добавить ответ на этот вопрос с решением. Затем выберите этот ответ как правильный, пожалуйста, Джим. После этого он больше не будет помечен как неотвеченный - спасибо!   -  person Jan    schedule 30.04.2013
comment
@Jan Хорошее замечание, готово.   -  person Duncan Jones    schedule 30.04.2013


Ответы (1)


Используйте команду mvn dependency:tree, чтобы понять, какие зависимости существуют между вашими модулями. Вы, вероятно, обнаружите, что артефакт имеет транзитивную зависимость от трикотажа, поэтому он и включен.

person Duncan Jones    schedule 30.04.2013
comment
+1: Быстрый (кроме, конечно, хорошего ответа ;-) - person Jan; 30.04.2013