代码之家  ›  专栏  ›  技术社区  ›  Jim

如何为依赖于同一jar的两个独立项目设置maven

  •  3
  • Jim  · 技术社区  · 16 年前

    如果这个问题在其他地方得到了回答,请打我一巴掌,给我指出正确的方向。

    看起来我可以这样做的一种方法是为Swing应用程序设置一个主pom,该pom将Swing应用程序和库jar作为模块。然后以相同的方式为Web应用程序设置另一个主pom。这有道理吗?有更好的方法吗?

    Development/  
    ----SwingApp/  
    ----WebServices/  
    ----CoreLibrary/  
    

    我继承了一个“构建系统”(松散地使用这个术语),它是100%由Netbeans自动生成的蚂蚁脚本。我开始尝试将其融入持续集成,TeamCity,我真的很喜欢它。我在尝试用它构建WebServices项目时遇到了严重的问题。据我所知,生成的ant(build-inmpl.xml)中有些东西在CI环境中无法被覆盖。再加上日常开发中一些严重的类路径问题,你就开始明白我为什么想去maven了。

    5 回复  |  直到 16 年前
        1
  •  6
  •   digitaljoel    16 年前

    <project>
        <groupId>yourGroup</groupId>
        <artifactId>project</artifactId>
        <packaging>pom</packaging>
        <modules>
            <module>coreLibrary</module>
            <module>swingApp</module>
            <module>webServices</module>
        </modules>
    </project>
    

    是的,我遗漏了一些其他元素,所以请填写完成pom所需的其他内容。

    然后,您的coreLibrary、swingApp和webServices模块都将有一个带有父元素和任何依赖项的pom,如下所示

    <project>
        <parent>
            <groupId>yourGroup</groupId>
            <artifactId>project</artifactId>
            <version>yourVersion</version>
        </parent>
        <artifactId>webServices</artifactId>
        <packaging>war</packaging>
        <version>yourVersion</version>
        <dependencies>
            <dependency>
                <groupId>yourGroup</groupId>
                <artifactId>coreLibrary</artifactId>
                <version>yourVersion</version>
            </dependency>
        </dependencies>
    </project>
    

    如果你在根级别构建,那么它将构建所有3个模块,或者,更好的是,你可以使用--also make选项仅构建webServices及其依赖项(在本例中为coreLibrary)

    mvn -am --projects webServices clean install 
    
        2
  •  3
  •   Chris Nava    16 年前

        3
  •  3
  •   Pascal Thivent    16 年前

    • SwingApp和Web服务之间有什么关系吗?当你构建SwingApp时,构建WebServices有意义吗?当你发布SwingApp时,你也会发布WebServices吗?SwingApp和WebServices项目是否总是使用相同版本的CoreLibrary?
    • 单独构建CoreLibrary并让两个项目都依赖于生成的jar是否有意义?

    根据提供的信息,我的理解(这可能是错误的,这只是一种解释)是,所有3个项目实际上是紧密耦合的,并且是由同一个人同时开发的。修改核心库时,将重建依赖项目。因此,我建议采用以下多模块项目:

    my-app/           // this is the parent module, it aggregates the child modules  
    |-- pom.xml       
    |-- core-library  
    |   `-- pom.xml   
    |-- swing-app     // this module has a dependency on core-library  
    |   `-- pom.xml   
    `-- web-services  // this module has a dependency on core-library  
        `-- pom.xml   
    

    其想法是将所有项目放在父模块下,并使用项目聚合和项目继承:

    • 父项目将用于聚合子模块。它的包装类型为 pom <modules> 通过这样做,父项目现在知道它的模块,如果对父项目调用Maven命令,那么该Maven命令也将对父项目的模块执行。
    • 每个子模块将声明父项目为 <parent>
    • swing应用程序和web服务模块将具有 <dependency>

    将在之前建造 Web服务

    注意:如果NetBeans不喜欢嵌套模块,可以使用这样的平面布局(但现在这是一个更多的细节):

    my-app/           
    |-- parent
    |   `-- pom.xml       
    |-- core-library  
    |   `-- pom.xml   
    |-- swing-app     
    |   `-- pom.xml   
    `-- web-services  
        `-- pom.xml   
    

    Multi Module Project with Eclipse 可能有助于您快速入门,只需跳过Eclipse特定的步骤即可。或者查看 Chapter 6. A Multi-module Project Sonatype的Maven书籍的“真实”参考。

        4
  •  0
  •   ankon    16 年前

    让每个应用程序和jar库都成为一个平凡父级中的模块。让这两个应用程序都依赖于核心,maven将确定构建的顺序。

        5
  •  0
  •   matt b    16 年前

    我有两个顶级项目,一个是Swing应用程序,另一个是一组Web服务。它们都依赖于同一个内部罐子。

    您是否正在使用自己的Maven存储库?如果是这样,最简单的选择是简单地部署通用的内部JAR,并使用 <dependency>

    Nexus 这是一个非常棒且易于使用的存储库,如果你打算在内部使用Maven,那么你无疑会希望运行自己的存储库以便实际“发布”每个项目的版本、库JAR等。 Repository Management with Nexus