我们有一个解决方案,我们的 UI 项目通过使用 EJB 客户端依赖项包含大量业务服务。Maven 上的问题在于,即使客户端 .jar 通常包含大约 1-2 个类,它们也会带来整个服务应用程序的完整依赖堆栈。这可能有点难看,当 .ear 文件开始增长到 50-100Mb时,由于不相关的依赖项潜入 UI 应用程序,不时会出现令人讨厌的错误。
当然,我们总是可以排除客户端上的依赖关系,但是我们必须为使用这些服务的每个客户端项目编写相同的一行代码,这是很多不必要的重复。另外,人们提出了最奇怪的错误消息并花费大量时间跟踪它们,然后才记得提到它们包含一些客户端 jar 并且没有检查它带来了哪些额外的依赖项。
例子:
<dependency>
<groupId>fi.path.to.service</groupId>
<artifactId>customermanagement-common</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>fi.path.to.service</groupId>
<artifactId>customermanagement-service</artifactId>
<classifier>client</classifier>
<exclusions>
<exclusion>
<groupId>fi.path.to.dependency</groupId>
<artifactId>internal-dependency-#1</artifactId>
</exclusion>
<exclusion>
<groupId>org.codehaus.castor</groupId>
<artifactId>castor</artifactId>
</exclusion>
<exclusion>
<groupId>fi.path.to.dependency</groupId>
<artifactId>internal-dependency-#2</artifactId>
</exclusion>
<exclusion>
<artifactId>internal-dependency-#3</artifactId>
<groupId>fi.path.to.dependency</groupId>
</exclusion>
<exclusion>
<artifactId>internal-dependency-#4</artifactId>
<groupId>fi.path.to.dependency</groupId>
</exclusion>
<exclusion>
<artifactId>internal-dependency-#5</artifactId>
<groupId>fi.path.to.dependency</groupId>
</exclusion>
<exclusion>
<artifactId>castor-xml</artifactId>
<groupId>org.codehaus.castor</groupId>
</exclusion>
<exclusion>
<artifactId>castor-codegen</artifactId>
<groupId>org.codehaus.castor</groupId>
</exclusion>
<exclusion>
<artifactId>castor-xml-schema</artifactId>
<groupId>org.codehaus.castor</groupId>
</exclusion>
<exclusion>
<artifactId>internal-dependency-#6</artifactId>
<groupId>fi.path.to.dependency</groupId>
</exclusion>
</exclusions>
<version>2.6</version>
</dependency>
这只是包含一个服务客户端,想象一下在几个不同的应用程序中有几个这样的应用程序,你就会明白,每次都写下所有的排除项是很烦人的,项目 POM 开始变得相当冗长。
我会将依赖项标记为已提供,但是如果它们不存在,则有几个依赖项会在运行时崩溃。比如说那些包含对另一个应用程序的另一个服务调用的外部异常类,这不是出于某种原因或其他原因包装在服务项目中,如果不存在,则会在运行时导致 ClassNotFoundException。
因此,我知道可以通过使用 maven-ejb-plugin 上的 pom.xml 规范在 ejb 客户端生成过程中排除/包含类,但是有什么方法可以排除依赖项吗?