[英]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存储库(或代理,如果您有)。
从技术上讲,实现此构建有几种解决方案,但是,根据这些项目与其生命周期之间的耦合,您最终可能会选择一个选项或另一个选项。 一些问题可能有助于决定:
根据提供的信息,我的理解(这可能是错误的,它只是一种解释)是所有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继承公共部分很有用 <dependency>
。 在多模块构建期间,maven使用依赖关系来计算构建顺序。 通过这种设置,当从顶级项目(这称为多模块构建或反应堆构建)运行Maven时, 核心库将在swing-app和web-services之前构建,这似乎是所需的行为。 这似乎相当于没有凌乱的本地JAR管理的实际情况(与maven,依赖关系通过“本地存储库”管理,这是一个内置功能)。
注意:如果NetBeans不喜欢嵌套模块,则可以使用这样的平面布局(但现在这更详细):
my-app/ |-- parent | `-- pom.xml |-- core-library | `-- pom.xml |-- swing-app | `-- pom.xml `-- web-services `-- pom.xml
有关实现的详细信息, 使用Eclipse的Multi 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.