【发布时间】:2014-06-10 22:44:44
【问题描述】:
是的,我知道,标题糟透了——它尽我所能描述性。
当您拥有也在开发中的依赖 JAR 以及如何在本地构建以及使用 CI (Jenkins) 时,我试图让我的大脑围绕开发 JAR 的概念。这是设置:
假设我有一个 Maven 项目(Java 代码),它创建了一个很好的、自我部署的 JAR,名为 KillerApplicationSpaceship。在许多第三方库(作为托管依赖项)中,这个项目依赖于我也在开发的几个 JAR。称他们为 KillerLibraryLister 和 KillerLibraryRimmer。他们有自己的 Maven 项目。我可以随时加入其中的任何一个并“mvn compile”,并且生活很美好。
我在监控所有三个项目的 GitHub 存储库的机器上安装了 Jenkins。每当推送代码更改时,都会触发构建。每当 KillerLibraryLister 或 KillerLibraryRimmer 成功构建时,也会触发 KillerApplicationSpaceship 构建。所有三个 JAR 在构建时都会推送到 Maven 存储库,并且 KillerApplicationSpaceship 将这两个库指定为该存储库中的托管依赖项。生活是美好的,除了对任何一个库进行更改,同时开始构建 KillerApplicationSpaceship 时,不会对库进行更改!它们的版本号不会改变,因此始终使用库的缓存版本。
在我们生活的这个现代世界中,如何正确地对库进行开发并确保库的每个构建在构建时都被 KillerApplicationSpaceship 拾取?有没有办法说“总是从存储库中检索这个 JAR。总是,总是?”
现在让我们更进一步。当然,我也可以在本地构建这些项目。我希望能够在我的本地机器上“mvn clean package” KillerApplicationSpaceship - 但是 POM 指定这两个库是 Maven 存储库中的托管依赖项。正如我所提到的,我的 Jenkins 盒子会在成功构建时将它们推送到我的开发存储库,但这在开发过程中会出现问题,原因有两个:
首先,如上所述,即使有变化,我似乎也没有得到最新版本,因为版本号没有变化。
其次,更重要的是,在进行开发时,我不会将每一个小改动都推送到 GitHub,而是希望经常在本地编译和测试。本地。
如何引用我的 KillerLibraryLister 和 KillerLibraryRimmer 项目的本地版本?如果我在 KillerApplicationStarship 中使它们不受管理,那么我的 Jenkins 盒子也期望它们不受管理 - 因为我们都使用相同的 POM。
在我看来,我想要的是在我的本地机器上进行本地构建以引用两个库中每一个的最新本地构建,但如果构建在 Jenkins 盒子上,请引用 Maven 存储库中的最新版本,因为那是最后一个签入版本。当然,我不知道该怎么做。
这可能会受到更多限制,因为库 JAR 被其他应用程序使用,例如,其中一个应用程序是使用 SBT 构建的(它是使用 Scalatra 的 Scala 应用程序)。所以用模块制作父 POM 不是这里的选择。 SBT 项目有一个 build.scala 文件,它指定远程 Maven 存储库上的库 JAR 文件。但我肯定不想每次都将这些 JAR 推送到存储库中我对它们进行代码更改(请记住,它们也在积极开发中)。
在一本最喜欢的书中必须有一个简单的章节从概念上解释这一切,是吗?我可能错过了这种开发的明显“最佳实践”。
在过去的五六年里,我一直在做网络开发和单一单体项目,所以这对我来说是一个范式转变。我得到的代码。项目管理和构建实践让我需要一些追赶。
非常感谢任何成人监督! ;)
【问题讨论】: