Я использую 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 выпуск.
Если пользовательский интерфейс зависит от EJB и EJB, зависит от сервера, тогда пользовательский интерфейс зависит от сервера. Таким образом, вы либо исключаете EJB с его транзитивными зависимостями из 'WEB-INF/lib', устанавливая свою область действия' provided', либо вы упаковываете их все в войну.Насколько мне известно, в войну нет возможности включать только базовый артефакт без его транзитивных зависимостей. –
Используете ли вы самый современный плагин зависимостей (2.4)? – khmarbaise
@AndrewLogvinov Вот почему у меня есть исключение на сервере, когда проект EJB добавлен как зависимость от пользовательского интерфейса. EJB-уровень является особенным в maven - он разбит на банки клиента и сервера - клиентский баннер, от которого зависит пользовательский интерфейс, не имеет зависимости от Сервера. Если транзитивная зависимость исключена явно, почему она должна быть включена? –