2014-02-12 34 views
3

我开始学习maven,现在我正在尝试开始一些简单的realworld项目。也许它在这里看起来很简单,但如果我想同时打包父项目和子项目,我该怎么办,我真的很困惑。用Maven继承和构建

(PS:我使用的BTW的IntelliJ IDEA)

这里是我的配置

项目A

  • 认为这取决于番石榴和GSON

B计划

  • 它将取决于项目A

项目C

  • 它将取决于项目B
  • 当我设置包装项目A的属性到罐子

,它提供了一个错误基本上是这样说的:“如果包装元素在父类中,你必须将包装元素设置为pom”。但我知道,如果我将包装元素设置为pom,则不会创建包装。

因此,我决定创建另一个项目作为multimodule来管理包装问题,但不知道如何!我怎样才能同时为他们每个人生成jar文件?

编辑 - 这里是我DID

MODULE POM

<?xml version="1.0" encoding="UTF-8"?> 
<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.deneme.module</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <packaging>pom</packaging> 
    <version>1.0.1</version> 
    <modules> 
     <module>A</module> 
     <module>B</module> 
    </modules> 


</project> 

项目

<?xml version="1.0" encoding="UTF-8"?> 
<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.mg.A</groupId> 
    <artifactId>A</artifactId> 
    <version>1.0.2</version> 
    <packaging>pom</packaging> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.code.gson</groupId> 
      <artifactId>gson</artifactId> 
      <version>2.2.3</version> 
     </dependency> 
    </dependencies> 



</project> 

项目B

<?xml version="1.0" encoding="UTF-8"?> 
<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> 
    <packaging>jar</packaging> 

    <parent> 
     <artifactId>A</artifactId> 
     <groupId>com.mg.A</groupId> 
     <version>1.0.2</version> 
     <relativePath>../A/pom.xml</relativePath> 
    </parent> 

    <groupId>com.mg.B</groupId> 
    <artifactId>B</artifactId> 
    <version>1.0.1</version> 

</project> 
+0

将与您项目进行建设什么类型的文物,B a nd C?这三个项目如何构建 - B和C作为A的子模块还是所有顶级项目?也许发布你的POM和目录结构的相关部分。 –

+0

你的项目结构是什么样的?是B还是C的父母?如果是的话,这可能不是你想要的。你期望的结果是什么(即应该是什么结果 - 一个EAR文件?)。 如果所有三个“模块”都在同一个“项目”中,您可以制作一个父 - 妈妈,将这三个模块作为孩子。 – MrD

+0

可以说所有这些应该是一个jar文件的结果。 A是B的父母,他们都是图书馆项目。 C是一个正常的项目,它将使用库B(和间接方式A)。我不想一遍又一遍地描述依赖关系。例如,我必须定义项目A中的所有依赖项,并且C应自动使用它们中的所有依赖项。 –

回答

1

我想你混淆了继承和依赖。

继承:子pom继承所有值,如属性,groupId,版本,也依赖关系。一般来说,你不应该在父母劲歌使用依赖

依赖:一个POM依赖于其它一些JAR/POM和使用它的内容,并且也使用/取决于传递依赖

据我理解您的问题您具备以下条件:

  1. A计划 - 根据像GSON和番石榴外部包库
  2. 项目B - 库根据项目B,并传递性上GSON和番石榴
  3. 项目C - 根据项目B的应用程序,并传递地对项目A,GSON和番石榴

我建议你使用这个目录结构

Workspace 
|- ModuleProject 
|- ProjectA 
|- ProjectB 
\- ProjectC 

和劲歌会是什么样子此(报头剥离):

模块POM:

<groupId>com.deneme.projectname</groupId> 
<artifactId>ModuleGroup</artifactId> 
<packaging>pom</packaging> 
<version>1.0.1</version> 

<modules> 
    <module>../ProjectA</module> 
    <module>../ProjectB</module> 
    <module>../ProjectC</module> 
</modules> 

项目A:

<parent> 
    <groupId>com.deneme.projectname</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <version>1.0.1</version> 
    <relativePath>../ModuleProject/</relativePath> 
</parent> 

<artifactId>A</artifactId> 
<version>1.0.2</version> 
<packaging>jar</packaging> 

<dependencies> 
    <dependency> 
     <groupId>com.google.code.gson</groupId> 
     <artifactId>gson</artifactId> 
     <version>2.2.3</version> 
    </dependency> 
</dependencies> 

项目B:

<parent> 
    <groupId>com.deneme.projectname</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <version>1.0.1</version> 
    <relativePath>../ModuleProject/</relativePath> 
</parent> 

<artifactId>B</artifactId> 
<version>1.0.2</version> 
<packaging>jar</packaging> 

<dependencies> 
    <dependency> 
     <groupId>com.deneme.projectname</groupId> 
     <artifactId>A</artifactId> 
     <version>1.0.2</version> 
    </dependency> 
</dependencies> 

项目C:

<parent> 
    <groupId>com.deneme.projectname</groupId> 
    <artifactId>ModuleGroup</artifactId> 
    <version>1.0.1</version> 
    <relativePath>../ModuleProject/</relativePath> 
</parent> 

<artifactId>C</artifactId> 
<version>1.0.2</version> 
<packaging>jar</packaging> 

<dependencies> 
    <dependency> 
     <groupId>com.deneme.projectname</groupId> 
     <artifactId>B</artifactId> 
     <version>1.0.2</version> 
    </dependency> 
</dependencies> 
+0

我按你所说的做了,它的工作非常完美,非常感谢你,但我要求清楚地了解我们什么时候需要使用继承呢? –

+1

我编辑了我的答案,你这样做是为了消除冗余:groupId通常是所有项目使用的相同的值或属性。另一点是DependencyManagement:你可以在你的父Pom中定义一个依赖版本:让我们来说说junit-4.11。每个使用junit作为依赖项的子项自动使用版本号4.11(除非你指定else) –

+0

我完全理解,再次感谢,但是我脑海中还有另一个问题,让我们假设我想在ProjectB中更改某个方法名但未编译然后我建立项目C.通常在构建C之前,它必须构建B,因为我们在项目C中声明了依赖关系,但不知何故(我刚刚检查过它),即使存在依赖关系,项目B也没有编译。我需要从上到下编译问题。如何自动触发编译项目C时编译项目B? –

2

如果您的项目A将B和C声明为模块,则必须将包装元素设置为pom。这也意味着它不应该包含任何代码,并且不会自行生成工件。这只是将项目组合在一起的一种方式。

在maven中,父pom用于定义将由所有子项目继承的公共配置(属性等)。

在你的情况我猜想,你需要一个父项目(POM包装)与3名儿童:A,B和C:

parentProject 
* module A 
* module B 
* module C 

当运行MVN安装上parentProject,所有子模块会建立和生产相应的罐子(比如A.jar,B.jar和C.jar)。

请注意,您不需要在子pom中声明父级以实现此结果,您只需将它们声明为父级pom中的模块即称为项目聚合。在子项中声明父项称为项目继承。你可以看一下下面的文档了解更多信息:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation