Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 积极开发JAR和相关JAR时的开发实践?_Java_Maven_Jenkins - Fatal编程技术网

Java 积极开发JAR和相关JAR时的开发实践?

Java 积极开发JAR和相关JAR时的开发实践?,java,maven,jenkins,Java,Maven,Jenkins,是的,我知道,这个标题糟透了-它是我能得到的最具描述性的 我正试图让我的大脑了解开发一个JAR的概念,当你有依赖的JAR也在开发中,以及如何在本地构建以及使用CI(Jenkins)。以下是设置: 假设我有一个Maven项目(Java代码),它创建了一个漂亮的自部署JAR,名为KillerApplicationSpaceship。在许多第三方库(作为托管依赖项)中,这个项目依赖于我正在开发的几个JAR。叫他们KillerLibraryLister和KillerLibraryRimmer。他们有自己

是的,我知道,这个标题糟透了-它是我能得到的最具描述性的

我正试图让我的大脑了解开发一个JAR的概念,当你有依赖的JAR也在开发中,以及如何在本地构建以及使用CI(Jenkins)。以下是设置:

假设我有一个Maven项目(Java代码),它创建了一个漂亮的自部署JAR,名为KillerApplicationSpaceship。在许多第三方库(作为托管依赖项)中,这个项目依赖于我正在开发的几个JAR。叫他们KillerLibraryLister和KillerLibraryRimmer。他们有自己的Maven项目。我可以在我喜欢的任何时候进入它们中的任何一个,“mvn编译”,而且生活是美好的

我在一台机器上安装了一个Jenkins,该机器监视所有三个项目的GitHub存储库。每当推送代码更改时,就会触发生成。每当KillerLibraryLister或KillerLibraryRimmer成功构建时,也会触发KillerApplicationSpace进行构建。构建这三个JAR时,它们都被推送到Maven存储库中,KillerApplicationSpace将这两个库指定为该存储库中的托管依赖项。生活是美好的,除了在启动KillerApplicationSpaceship构建的同时对任何一个库进行更改,都不会对库进行更改!它们的版本号不会更改,因此始终使用库的缓存版本

在我们生活的这个现代世界中,如何正确地对图书馆进行开发,并确保图书馆的每一个构建在构建时都能被KillerApplicationSpace所接受?有没有办法说“总是从存储库中检索这个JAR。总是,总是?”

现在让我们更进一步。当然,我也能够在本地构建这些项目。我希望能够在本地计算机上实现“mvn clean package”KillerApplicationSpace,但POM指定这两个库是Maven存储库中的托管依赖项。正如我提到的,在成功构建时,我的Jenkins box会将它们推送到我的开发存储库中,但这在开发过程中是有问题的,原因有两个:

首先,如上所述,即使有更改,我似乎也没有得到最新版本,因为版本号没有更改

第二,也是更重要的一点,在进行开发时,我并不是每一个小的改变都要推动GitHub,而是希望经常在本地编译和测试。在当地

我如何引用本地构建的KillerLibraryLister和KillerLibraryRimmer项目?如果我在KillerApplicationStarship中使它们处于非托管状态,那么我的Jenkins box也希望它们处于非托管状态—因为我们都使用相同的POM

在我看来,我想要的是本地机器上的本地构建引用两个库中每个库的最新本地构建,但是如果构建在Jenkins box上,则引用Maven存储库中的最新版本,因为这是最后签入的版本。当然,我不知道该怎么做

这可能会受到更大的限制,因为库jar被其他应用程序使用,例如,其中一个应用程序是使用SBT构建的(它是使用Scalatra的Scala应用程序)。因此,使用模块创建父POM在这里不是一个选项。SBT项目有一个build.scala文件,用于指定远程Maven存储库上的库JAR文件。但我当然不想每次对这些JAR进行代码更改时都将其推送到存储库中(记住,它们也在积极开发中)

在我最喜欢的一本书中,一定有一个简单的章节“从概念上讲,是吗?”?我可能错过了这种开发的“最佳实践”

在过去的五、六年中,我一直在做web开发和单个单片项目,所以这对我来说是一个范式转变。我得到的密码。项目管理和构建实践让我需要一些跟进


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

您的问题有两种解决方案

  • 或者将所有项目放在一个maven项目树中,并一次性构建它们,这样就不会出现不同步的情况
当然,如果你不能做到以上

  • 根据版本而不是快照进行开发,因此,例如,当您希望更改B的代码时,项目A将B作为依赖项使用,并在项目A中发布一个版本,以获得特定的生成

这对我来说毫无意义。一个人是如何做到这一点的?这考虑了准备发布的代码。记住,问题是同时开发应用程序和库。因此,我正在对库和使用库的应用程序进行更改。为了将二者缩小为一,假设应用程序是使用SBT在Scala中构建的,并且包括使用Maven从Java构建的多个JAR。现在我们不能把它们结合起来(我把这个作为一个例子,集中讨论当你有不同的项目时如何进行开发,两个项目都在开发中),第二个选项对你来说没有意义。它假定每次我在B中进行代码更改时,我都必须推动发布版本。在开发过程中,当我编写代码、调试、测试等时,这可能是每天数百次。这肯定是站不住脚的。这是用于主动开发的。如果这种开发过于频繁,您应该将它们作为单个maven项目树的一部分,您只需构建一次就可以构建所有项目