Maven Java EE和模块项目pom

时间:2010-11-14 03:52:35

标签: maven-2 maven

我是maven的新手。

我有一个Java EE Web项目和一个模型项目,web项目依赖于模型,因为模块有一些标准的类,需要在web中使用jar。

web需要模型jar文件。

我如何编写一个依赖另一个项目的2个项目?

给我一​​个关于项目pom的示例编码。

2 个答案:

答案 0 :(得分:5)

典型的maven多模块项目结构将包含 3 模块:聚合父模块(允许在所有模块上启动多模块构建),模型模块和Web模块。像这样:

.
├── mymodule
│   ├── pom.xml
│   └── src
│       ├── main
│       │   ├── java
│       │   └── resources
│       └── test
│           ├── java
│           └── resources
├── mywebapp
│   ├── pom.xml
│   └── src
│       └── main
│           ├── resources
│           └── webapp
│               ├── index.jsp
│               └── WEB-INF
│                   └── web.xml
└── pom.xml

pom.xml(在根)的位置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.stackoverflow</groupId>
  <artifactId>Q4176120</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>Q4176120 - Parent POM</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    ...
  </dependencies>
  <modules>
    <module>mywebapp</module>
    <module>mymodule</module>
  </modules>
</project>

mymodule/pom.xml将是常规POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>Q4176120</artifactId>
    <groupId>com.stackoverflow</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <!--groupId>com.stackoverflow</groupId--> <!-- inherited -->
  <artifactId>mymodule</artifactId>
  <packaging>jar</packaging>
  <name>Q4176120 - Module</name>
  <dependencies>
    ...
  </dependencies>
</project>

并且mywebapp/pom.xml将声明对mymodule工件的依赖:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>Q4176120</artifactId>
    <groupId>com.stackoverflow</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <!--groupId>com.stackoverflow</groupId--> <!-- inherited -->
  <artifactId>mywebapp</artifactId>
  <packaging>war</packaging>
  <name>Q4176120 - Maven Webapp</name>
  <dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mymodule</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>Q4176120</finalName>
  </build>
</project>

使用此结构,您可以从父目录启动多模块构建,即在所有模块上运行目标(并且maven将计算正确的构建顺序):

$ mvn install
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Q4176120 Parent POM
[INFO] Q4176120 Module
[INFO] Q4176120 Maven Webapp
[INFO]                                                                         
...

请注意,我还在上述示例中使用了继承mymodulemywebapp 继承来自{{ 1}}元素)这样我就可以在父POM中对公共部分进行分组,避免重复。这不是强制性的,您可以使用聚合而不继承,但这非常方便,聚合和继承通常在实践中结合在一起。

资源

答案 1 :(得分:0)

您创建了2个maven项目:Web项目和jar项目。 Web项目将取决于模型项目。因此,您将在Web项目pom.xml中添加模型项目作为依赖项

我建议你在这里阅读maven基础知识:http://www.sonatype.com/books/maven-book/

您的模型项目pom.xml可能看起来像这样

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.abc</groupId>
<artifactId>>model-module</artifactId>
<name>My Model Module</name>
<packaging>jar</packaging>
<version>1.0.0-SNAPSHOT</version>

您的网络应用pom.xml可能如下所示。注意依赖性部分

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<groupId>com.abc</groupId>
<artifactId>>my-web-app</artifactId>
<name>My First Web Application</name>
<packaging>war</packaging>
<version>1.0.0-SNAPSHOT</version>
<dependencies>
    <dependency>
      <groupId>com.abc</groupId>
      <artifactId>model-module</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    </dependency>