【发布时间】:2010-12-09 22:00:13
【问题描述】:
我目前正在同时从事两个项目:
- 我的主要项目(使用 maven 构建)
- 一个开源项目的高峰,我的主要项目依赖于它(不是用 maven 构建的)
鉴于我经常同时开发这两者,我如何设置 maven 以将 OSS 项目用作摩擦最小的依赖项?
【问题讨论】:
标签: maven-2
我目前正在同时从事两个项目:
鉴于我经常同时开发这两者,我如何设置 maven 以将 OSS 项目用作摩擦最小的依赖项?
【问题讨论】:
标签: maven-2
我认为您可能需要硬着头皮为您的 OSS 项目树设置 POM。这是痛苦的部分(因为您需要根据 OSS 应用程序类型(即 Web 等)查找为所涉及的各种插件指定资源路径的详细信息)。好消息是,这是一次性的努力。
完成后,您的主项目可以将(包装的)OSS 项目作为依赖项引用。这里将适用(标准 maven)多项目结构。
【讨论】:
我使用的解决方案是 maven-ant 任务 (http://maven.apache.org/ant-tasks/)。
我在 build.xml 文件中添加了一个安装任务,它将编译后的 .jar 安装到本地 repo 中。
虽然在项目中添加一个成熟的 pom 肯定是最好的方法,但这是一项主要工作,并且会给项目带来 maven(其他用户不愿意使用它)。
【讨论】:
如果 OSS 项目有依赖项 - 创建一个包含这些依赖项的 POM(您的项目将使用它们作为传递依赖项)并将该工件和 pom 安装在本地存储库中。如果 OSS 项目没有其他依赖就更简单了——安装时会自动生成 POM。
对于这两种情况,请使用maven-install-plugin。
mvn install:install-file -Dfile=your-artifact-1.0.jar \
[-DpomFile=your-pom.xml] \
[-Dsources=src.jar] \
[-Djavadoc=apidocs.jar] \
[-DgroupId=org.some.group] \
[-DartifactId=your-artifact] \
[-Dversion=1.0] \
[-Dpackaging=jar] \
[-Dclassifier=sources] \
[-DgeneratePom=true] \
[-DcreateChecksum=true]
【讨论】:
我能想到几个解决方案:
Mavenize 现有的 OSS 项目。 这当然是“理想”选项,但通常不可行(即使您在现有系统的同时引入新的构建系统)。该项目可能具有与 Maven 标准布局不同的现有项目结构。开发人员可能不希望更改现有的布局和构建脚本,调整 Maven 构建以使用非标准布局可能会很痛苦。在这两种情况下,你都搞砸了。
用 Maven 包装现有的 Ant 构建。 如果您想将 OSS 项目的构建包含在项目的生命周期中并将它们都构建在一个中,这可能会很好步。您可以查看this answer on SO 了解如何执行此操作的详细信息。
在现有构建中使用 Apache Ivy 或 Maven Ant Task 在本地存储库中生成和安装 Maven 工件。将此工件用作 Maven 项目中的常规依赖项(除非您必须手动声明其传递依赖项)。如果单独构建两个项目不成问题,这可能是一种更快且干扰更少的方法。
看起来你选择了选项3。我认为这是一个快速获胜的好选择。
【讨论】: