我正在将应用程序从 ant build 迁移到 maven 3 build。这个应用程序是由:
- 指定要构建的所有模块的父项目
- 使用 jaxb 生成类并用它们构建 jar 的项目
- 一个构建ejb项目的项目
- 3 个构建战争模块的项目
- 1个建立耳朵的项目
这是我父母 pom 的摘录:
<groupId>com.test</groupId>
<artifactId>P</artifactId>
<packaging>pom</packaging>
<version>04.01.00</version>
<modules>
<module>../PValidationJaxb</module> <-- jar
<module>../PValidation</module> <-- ejb
<module>../PImport</module> <-- war
<module>../PTerminal</module> <-- war
<module>../PWebService</module> <-- war
<module>../PEAR</module> <-- ear
</modules>
我有几个我认为有相同起源的问题,可能是我无法弄清楚的依赖管理问题:
生成的模块会有所不同,具体取决于我是从父 pom 还是单个模块构建的。通常,如果我只构建 PImport,生成的战争类似于我的 ant 构建,如果我从父 pom 构建,我的战争需要 20MB,添加了许多来自其他模块的依赖项。两场战争都进展顺利。
我的项目 PWebService 具有要在构建期间执行的单元测试。它使用以 cglib 作为依赖项的 mock-ejb。这个有 ClassNotFound 的问题,我不得不排除它并向 cglib-nodep 添加一个依赖项(参见最后一个 pom 提取)。如果我只构建这个模块,它运行良好。但是如果我从父项目构建,它会失败,因为其他模块中的其他依赖项也对 cglib 有隐式依赖。我必须在每个模块 pom 中排除它,并将依赖项添加到 cglib-nodep 中以使其运行。
我错过了配置中的重要内容吗?
PValidation pom 提取物:
它正在创建一个 jar,其中包含一个带有由 xdoclet 生成的接口的 ejb,以及一个客户端 jar。
<parent>
<groupId>com.test</groupId>
<artifactId>P</artifactId>
<version>04.01.00</version>
</parent>
<artifactId>P-validation</artifactId>
<packaging>ejb</packaging>
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>P-jaxb</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2.2</version>
</dependency>
...
[other libs]
...
</dependencies>
<build>
...
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ejb-plugin</artifactId>
<configuration>
<ejbVersion>2.0</ejbVersion>
<generateClient>true</generateClient>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>xdoclet-maven-plugin</artifactId>
...
PImport pom 提取物:
它取决于 Jaxb 生成的 jar 和 ejb 客户端 jar。
<parent>
<groupId>com.test</groupId>
<artifactId>P</artifactId>
<version>04.01.00</version>
</parent>
<artifactId>P-import</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>P-jaxb</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>P-validation</artifactId>
<version>${project.version}</version>
<type>ejb-client</type>
</dependency>
...
[other libs]
...
</dependencies>
PWebService pom 提取:
<parent>
<groupId>com.test</groupId>
<artifactId>P</artifactId>
<version>04.01.00</version>
</parent>
<artifactId>P-webservice</artifactId>
<packaging>war</packaging>
<properties>
<jersey.version>1.14</jersey.version>
</properties>
<dependencies>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>com.rte.etso</groupId>
<artifactId>etso-validation</artifactId>
<version>${project.version}</version>
<type>ejb-client</type>
</dependency>
...
[other libs]
...
<dependency>
<groupId>org.mockejb</groupId>
<artifactId>mockejb</artifactId>
<version>0.6-beta2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>cglib</groupId>
<artifactId>cglib-full</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.2.2</version>
<scope>test</scope>
</dependency>
</dependencies>
非常感谢
修改配置后的解决方案:
当我得到已经 mavenized 的项目时,它不尊重文件夹布局约定,但正如它在 pom 中声明的那样可以找到源代码,我认为它会起作用。无论如何,我改变了它以匹配推荐的结构。
为了构建单个模块,我直接在其级别执行 mvn clean install。正是通过这种方式,我获得了不同的结果(这实际上是我想要的结果)。
无论如何,我的问题已经解决了,我将 PValidation 项目的所有依赖项都按照提供的方式放置,因为我只将生成的客户端包含在其他模块中,并且它们不需要实现所需的所有内容。
但我仍然不明白为什么我对相同的配置有不同的结果。