【问题标题】:Development practices when actively developing both JAR and dependent JARs?积极开发 JAR 和依赖 JAR 时的开发实践?
【发布时间】: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 推送到存储库中我对它们进行代码更改(请记住,它们也在积极开发中)。

在一本最喜欢的书中必须有一个简单的章节从概念上解释这一切,是吗?我可能错过了这种开发的明显“最佳实践”。

在过去的五六年里,我一直在做网络开发和单一单体项目,所以这对我来说是一个范式转变。我得到的代码。项目管理和构建实践让我需要一些追赶。

非常感谢任何成人监督! ;)

【问题讨论】:

    标签: java maven jenkins


    【解决方案1】:

    您的问题有两种解决方案

    • 要么将所有项目放在一个 maven 项目树中,然后全部构建一次,这样就不会出现不同步的情况

    如果你不能做到以上几点

    • 针对发布而不是快照进行开发,因此例如,当您想更改 B 的代码时,您的项目 A 将 B 作为依赖项进行发布并在项目 A 中调整依赖项版本以获得特定的构建

    【讨论】:

    • 这对我来说没有意义。这样的开发怎么做?这考虑了可以发布的代码。请记住,问题在于同时开发应用程序库。所以我正在对库进行更改使用它们的应用程序。
    • 为了将两个缩小为一个,假设应用程序是使用 SBT 在 Scala 中构建的,并且包含多个使用 Maven 的 Java 构建的 JAR。现在我们不能将它们结合起来(我把它作为一个例子扔在那里,以专注于当你有不同的项目时如何进行开发,两者都在开发中)
    • 哪个选项对你没有意义
    • 第二个。它假定每次我在 B 中进行代码更改时,我都必须推送发布版本。在开发过程中,我每天编写代码、调试、测试等可能会执行数百次。这肯定是站不住脚的。这是为了积极发展
    • 如果过于频繁,您应该将它们作为单个 maven 项目树的一部分,您构建一次,然后全部构建
    猜你喜欢
    • 2011-01-28
    • 2016-05-09
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2019-10-09
    • 2014-10-26
    • 2021-02-19
    • 2010-09-06
    相关资源
    最近更新 更多