2012-04-05 3 views
5

Я использую Maven 3 для создания приложения Java с 3 уровнями - сервером, ejb и ui. Проект EJB зависит от проекта сервера, а проект пользовательского интерфейса зависит только от EJB и обеспечивает исключение для транзитивной зависимости сервера.Maven Построение, отличное от дерева зависимостей

Когда проект пользовательского интерфейса построен как война, включена зависимость Сервера, несмотря на то, что она не отображается в команде зависимости: tree.

Вот соответствующий выход работает mvn dependency:tree

**project.name:UI:war:1.0 SNAPSHOT** 
+- project.name:Common:jar:1.0 SNAPSHOT:compile 
| + org_common:_lib:jar:16.0.006:compile 
| | +- log4j:log4j:jar:1.2.16:compile 
| | \- commons configuration:commons configuration:jar:1.6:compile 
| |  +- commons lang:commons lang:jar:2.4:compile 
| |  +- commons digester:commons digester:jar:1.8:compile 
| |  \- commons beanutils:commons beanutils core:jar:1.8.0:compile 
| +- org_common:_security_lib:jar:16.0.006:compile 
| \- org.springframework:spring:jar:2.0:compile 
+- **project.name:EJB:ejb client:client:1.0 SNAPSHOT:compile** 
| \- com.ibm.websphere.appserver:j2ee:jar:7.0.0.9:compile 
+- org_common:_uicomponent:jar:16.0.006:compile 

А вот дерево вывода зависимости от того, когда работает mvn clean install -X

**project.name:UI:war:1.0 SNAPSHOT** 
+- project.name:Common:jar:1.0 SNAPSHOT:compile 
| + org_common:_lib:jar:16.0.006:compile 
| | +- log4j:log4j:jar:1.2.16:compile 
| | \- commons configuration:commons configuration:jar:1.6:compile 
| |  +- commons lang:commons lang:jar:2.4:compile 
| |  +- commons digester:commons digester:jar:1.8:compile 
| |  \- commons beanutils:commons beanutils core:jar:1.8.0:compile 
| +- org_common:_security_lib:jar:16.0.006:compile 
| \- org.springframework:spring:jar:2.0:compile 
+- **project.name:EJB:ejb client:client:1.0 SNAPSHOT:compile** 
| +- **project.name:Server:jar:1.0 SNAPSHOT:compile** 
| | +- javassist:javassist:jar:3.4.GA:compile 
| | +- project.filestore:filestore_client:jar:7.0.003:compile 
| | +- com.ibm.db2:db2jcc:jar:9.7.fp1.aix64.s091114:compile 
| | +- com.ibm.db2:db2java:jar:9.7.fp1.aix64.s091114:compile 
| | +- com.ibm.db2:db2jcc_license_cu:jar:9.7.fp1.aix64.s091114:compile 
| \- com.ibm.websphere.appserver:j2ee:jar:7.0.0.9:compile 
+- org_common:_uicomponent:jar:16.0.006:compile 

Зависимость от сервера является единственным различием между двумя деревьями. Должны ли эти два выхода всегда быть одинаковыми? Что может привести к включению библиотеки, которая не отображается в зависимости: tree?

Родитель ПОМ определяет модули, как:

<modules> 
    <module>Server</module> 
    <module>EJB</module> 
    <module>UI</module> 
</modules> 

Зависимость перечисленных в EJB POM является:

<dependencies> 
     <dependency> 
      <groupId>project.name</groupId> 
      <artifactId>Server</artifactId> 
      <version>${project.version}</version> 
     </dependency> 
    </dependencies> 

Зависимость в пользовательском интерфейсе является:

<dependencies> 
     <dependency> 
      <groupId>project.name</groupId> 
      <artifactId>EJB</artifactId> 
      <version>${project.version}</version> 
      <type>ejb-client</type> 
      <exclusions> 
       <exclusion> 
        <groupId>project.name</groupId> 
        <artifactId>Server</artifactId> 
       </exclusion> 
      </exclusions> 
     </dependency> 
</dependencies> 

Я я знаю, что я могу явно исключить банку Server из включенного в WAR, но я бы предпочел исправить actua l выпуск.

+0

Если пользовательский интерфейс зависит от EJB и EJB, зависит от сервера, тогда пользовательский интерфейс зависит от сервера. Таким образом, вы либо исключаете EJB с его транзитивными зависимостями из 'WEB-INF/lib', устанавливая свою область действия' provided', либо вы упаковываете их все в войну.Насколько мне известно, в войну нет возможности включать только базовый артефакт без его транзитивных зависимостей. –

+0

Используете ли вы самый современный плагин зависимостей (2.4)? – khmarbaise

+0

@AndrewLogvinov Вот почему у меня есть исключение на сервере, когда проект EJB добавлен как зависимость от пользовательского интерфейса. EJB-уровень является особенным в maven - он разбит на банки клиента и сервера - клиентский баннер, от которого зависит пользовательский интерфейс, не имеет зависимости от Сервера. Если транзитивная зависимость исключена явно, почему она должна быть включена? –

ответ

1

Как мы выяснили, в комментариях, источник этой проблемы был глючный Maven 3.0.3. Версия 3.0.4 решила проблему.

Мой комментарий здесь:

Какой точный Maven версию вы используете? Если не 3.0.4, попробуйте и скажите, помогает ли это. Я действительно нашел, ДЕЙСТВИТЕЛЬНО дерьмовые проблемы при использовании предыдущих релизов Maven 3, в основном с 3.0.2.

2

Вы правы, что выход должен быть одинаковым в обоих случаях. Однако Maven 3 перешел на использование эфира для разрешения зависимостей, но теперь зависимость: дерево использует старый механизм разрешения зависимостей, поэтому разница. Подробнее см. Следующую ссылку.

https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html#Maven3.xCompatibilityNotes-DependencyResolution

По этой причине вы должны полагаться только на выходе MVN чистой установки -X для управления зависимостями.

Редактировать

Начиная с версии 2.5 из Maven зависимостей плагин, dependency:tree также использует Aether (см bug report, и release notes)

+0

Это объясняет, почему два дерева разные. Любая идея, как исправить проблему транзитивной зависимости? –

Смежные вопросы