繁体   English   中英

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

[英]How to set up maven for two separate projects that depend on the same jar

如果在其他地方回答这个问题,请指责我并指出正确的方向。

我是Maven的新手,并试图将我的头脑与我的项目一起使用。 我有两个顶级项目,一个是Swing应用程序,另一个是一组Web服务。 它们都依赖于同一个内部罐子。 有什么好方法可以为此设置poms?

如果jar只被其中一个项目使用,那么看起来我会把它移到里面并使它成为一个模块。 但是我不想要那个jar的源代码的两个(以及更多)副本。

看起来我可以这样做的一种方法是为Swing应用程序提供一个主pom,其中包含Swing应用程序和库jar作为模块。 然后为Web应用程序设置另一个主pom以相同的方式设置。 那会有意义吗? 还有更好的方法吗?

目录结构目前非常简单:

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

方式太多信息和附带问题如下:

我继承了一个“构建系统”(使用松散术语),它是100%Netbeans自动生成的ant脚本。 我开始尝试将它放入持续集成,TeamCity,我非常喜欢。 我试图用它来构建WebServices项目时遇到了严重的问题。 在我所知道的情况下,生成的ant(build-impl.xml)中有些东西无法在CI环境中被覆盖。 在日常开发中将这与一些严重的类路径地狱相结合,你就会开始明白我为什么要去找maven。

这个问题包含的一个问题是我的团队中的开发人员似乎都习惯了。 现在,Netbeans中的各个项目都有对“CoreLibrary”项目的项目引用。 这意味着当在“CoreLibrary”中更改源代码并且开发人员在顶级应用程序上进行构建时,它还将根据需要构建CoreLibrary。 可以在Maven中模拟吗? 这将有助于缓解过渡。 到目前为止,我看到Netbeans(6.7)没有使用maven版本,我认为我不能卖掉(还)在Netbeans之外进行日常构建工作。

在您的开发目录中,您将拥有一个类似于以下内容的pom:

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

是的,我已经遗漏了其他一些元素,所以填写你需要的任何其他元素。

然后,您的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 

您不应该将.jars添加到项目中。 您应该将JAR依赖项添加到.pom文件中。 Maven将为您下载.jars。 您必须为每个内部.jar创建.pom文件,并将它们添加到您的maven存储库(或代理,如果您有)。

从技术上讲,实现此构建有几种解决方案,但是,根据这些项目与其生命周期之间的耦合,您最终可能会选择一个选项或另一个选项。 一些问题可能有助于决定:

  • 谁在建设所有这些项目? 一个独特的团队? 分开的团队?
  • SwingApp和WebServices之间有什么关系吗? 构建SwingApp时,构建WebServices是否有意义? 当您发布SwingApp时,您是否也发布了Web服务? SwingApp和WebServices项目是否始终使用相同版本的CoreLibrary?
  • 将3个项目组合在一起是否有意义?
  • 单独构建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类型的包装,并声明一个包含所有3个子模块的<modules>元素。 通过这样做,父项目现在知道它的模块,并且如果针对父项目调用Maven命令,那么Maven命令也将被执行到父模块。
  • 每个子模块都将父项目声明为<parent> 这对于从父pom继承公共部分很有用
  • swing-app和web-services模块将在其pom中声明的核心库上具有<dependency> 在多模块构建期间,maven使用依赖关系来计算构建顺序。

通过这种设置,当从顶级项目(这称为多模块构建或反应堆构建)运行Maven时, 核心库将在swing-appweb-services之前构建,这似乎是所需的行为。 这似乎相当于没有凌乱的本地JAR管理的实际情况(与maven,依赖关系通过“本地存储库”管理,这是一个内置功能)。

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

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

有关实现的详细信息, 使用EclipseMulti Module Project可能会帮助您快速入门,只需跳过Eclipse特定的步骤即可。 或者查看第6章 .Sonatype的Maven书的多模块项目 ,以获得“真实”参考。

让每个应用程序和jar库成为一个普通父类中的模块。 让两个应用程序都依赖于核心,maven将确定构建内容的顺序。

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

您使用自己的Maven存储库吗? 如果是这样,最简单的选择是简单地部署公共内部JAR,并使用POM中的<dependency>元素使两个项目依赖于JAR。

关系是一个真正伟大的和易于使用的存储库,如果你要使用Maven内部,那么你将毫无疑问要经营自己的仓库,所以你其实可以每一个项目,库JAR等发布的“”版本库使用Nexus进行管理是Sonatype的免费书籍,详细介绍了如何使用它,最佳实践等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM