继承和构建Maven

时间:2014-02-12 11:15:20

标签: java maven intellij-idea

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

(PS:我正在使用intellij idea btw)

这是我的配置

项目A

  • 假设它依赖于番石榴和gson

项目B

  • 将取决于项目A

项目C

  • 这将取决于项目B

当我将项目A的打包属性设置为jar时,它给出了一个错误,基本上说“如果它在父pom中,你必须将打包元素设置为pom”。但我知道,如果我将包装元素设置为pom,它就不会创建包。

所以我决定创建另一个项目作为多模块来管理包装问题,但不知道如何!我怎么能同时为每个文件生成jar文件?

编辑 - 这就是我发布的

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>

项目A

<?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>

2 个答案:

答案 0 :(得分:2)

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

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

在你的情况下,我猜你需要一个包含3个孩子的父项目(pom包装):A,B和C:

parentProject 
 * module A
 * module B
 * module C

在parentProject上运行mvn install时,将构建所有子模块并生成相应的jar(例如A.jar,B.jar和C.jar)。

请注意,您不需要在子pom中声明父元素来实现此结果,您只需要将它们声明为父pom中的模块,这称为项目聚合。声明子项中的父项称为项目继承。您可以查看以下文档以获取更多详细信息:

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

答案 1 :(得分:1)

我认为你混淆了继承和依赖。

继承:子pom继承所有值,例如属性,groupId,版本和依赖项。通常,您不应在父poms

中使用依赖项

依赖:pom依赖于其他jar / pom并使用它的内容并使用/依赖于传递依赖

据我所知,您有以下问题:

  1. 项目A - 一个依赖外部软件包的库,如gson和guava
  2. 项目B - 依赖于项目B的库,可传递给gson和guava
  3. 项目C - 依赖于项目B的应用程序,可传递给项目A,gson和番石榴
  4. 我建议您使用目录结构

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

    并且poms看起来像这样(标题剥离):

    模块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>