我们有一个解决方案,其中我们的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开始变得相当漫长。
我将标记为已提供的依赖项,但是如果不存在,有几个依赖项会在运行时崩溃。假设包含通过外部Exception类对另一个应用程序进行的另一个服务调用的原因,这不是出于某种原因,也不是包装在服务项目中的另一个原因,并且如果不存在,则会在运行时导致ClassNotFoundException。
因此,我知道可以通过在maven-ejb-plugin上使用pom.xml规范从ejb客户端生成类的过程中排除/包含类,但是还有什么方法可以排除依赖项吗?
最佳答案
似乎Maven不支持很好地在一个模块中构建多个jar。
因此,我们找到的解决此问题的唯一合理方法是创建另一个模块(将xxx-service分解为xxx-service和xxx-service-client)并将xxx-service-client模块配置为仅具有EJB客户端/代理类和最小的依赖关系。这样,可以一次执行就可以构建项目。
关于java - Maven EJB客户端生成依赖项排除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11408100/