我正在将应用程序从ant build迁移到maven 3 build。 这个应用程序由:
组成以下是我父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具有在构建期间执行的单元测试。它使用的是mock-ejb,它将cglib作为依赖。有这个问题的ClassNotFound,我不得不排除它并添加一个依赖到cglib-nodep(参见最后一个pom提取)。如果我然后只构建这个模块,它运行良好。但是,如果我从父项目构建,它会失败,因为其他模块中的其他依赖项也对cglib具有隐式依赖性。我不得不在每个模块pom中排除它,并将依赖项添加到cglib-nodep到处运行。
我是否会错过配置中的重要内容?
PValidation pom提取物:
它正在创建一个包含ejb的jar,其中包含xdoclet生成的接口以及客户端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>
非常感谢
修改配置后的解决方案:
当我已经对项目进行了规范化时,它并没有尊重文件夹布局约定,但是因为它在pom中声明了在哪里找到源代码,我认为它会起作用。 无论如何,我改变它以匹配推荐的结构。
要构建单个模块,我直接在其级别执行mvn clean install。正是这种方式我获得了不同的结果(实际上是我想要的结果)。
无论如何,我的问题已经解决,我把PValidation项目的所有依赖项都提供了,因为我只在其他模块中包含生成的客户端,并且它们不需要实现所需的全部内容。
但我仍然不明白为什么我对同一配置有不同的结果。
答案 0 :(得分:2)
第一件重要的事情是你应该创建适合于模块结构的项目结构,这意味着具有以下文件夹结构:
+-- parent
+-- PValidationJaxb
+-- PValidation
+-- PImport
+-- PTerminal
+-- PWebService
+-- PEAR
这意味着拥有一个pom.xml,其中包含父文件夹中的模块定义。 如果您遵循上述建议,您可以将模块列表简化为以下内容:
<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>
此外,Maven的最佳做法是使用小写工件,这意味着在您的情况下 pvalidationjaxb 而不是 PValidationJaxb 。
另一个重要的事情是你的版本不遵循Maven conventions。此外,您的版本将从Maven的角度出发,而不是您正在进行开发的情况。在Maven中,您应该使用所谓的 SNAPSHOT 来实现1.0.0-SNAPSHOT等目的。
我希望您已按照folder layout recommendation of Maven说明将生产代码(将打包到生成的jar中)放入 src / main / java ,而将测试代码放入的src /测试/ JAVA
您描述的具有不同依赖关系的问题听起来很受欢迎。问题是你是如何尝试构建单一模块的?这通常可以通过在父位置使用以下内容来实现:
mvn -pl module clean package
你的单元测试的问题听起来像是缺少依赖等等。但是这里有一些问题你是如何尝试运行单元测试并且你配置了maven-surefire-plugin?或者你有集成测试?这只是猜测,因为我没有在你的poms中看到Maven插件的任何配置。