Maven ejb-client生成依赖性排除

时间:2012-07-10 06:55:12

标签: java maven dependencies client ejb

我们有一个解决方案,我们的UI项目通过使用EJB客户端依赖项包含了大量业务服务。 Maven上的问题在于,即使客户端.jar通常包含大约1-2个类,它们也会带来整个服务应用程序的完整依赖性堆栈。这可能会有点难看,当.ear文件开始增长到50-100Mb pop 时,由于不相关的依赖关系偷偷进入UI应用程序,有时会出现麻烦的错误。 / p>

当然,我们总是可以排除客户端的依赖关系,但是我们必须使用这些服务为每个客户端项目编写相同的一堆行,这是很多不必要的重复。此外,人们提出了最奇怪的错误消息并使用大量时间跟踪它们,然后再记得提到它们包含了一些客户端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客户端生成期间排除/包含类,但是有没有办法排除依赖项?

2 个答案:

答案 0 :(得分:1)

似乎Maven不支持很好地从一个模块中构建多个jar。

因此,我们发现的唯一合理的方法是创建另一个模块(将xxx-service分解为xxx-service和xxx-service-client)并将xxx-service-client模块配置为仅具有EJB客户/代表类&amp;最小的依赖。这样,项目就可以通过一次执行来构建。

答案 1 :(得分:0)

我在这里遇到同样的问题。我认为一个解决方案可能正在使用配置文件,因为在每个配置文件中您都可以指定依赖关系(请参阅http://blog.sonatype.com/people/2010/01/how-to-create-two-jars-from-one-project-and-why-you-shouldnt/

在我的情况下,这不起作用,因为我需要在Maven的单次执行中生成两个JAR(ejb和ejb-client)。 :)