【问题标题】:Resolve Local Maven Project as Dependency in Jenkins [closed]将本地 Maven 项目解决为 Jenkins 中的依赖项 [关闭]
【发布时间】:2021-08-05 06:44:01
【问题描述】:

我有两个 maven 项目,分别称为 MainProjectDependnecyProject。我在 MainProject 项目中使用 DependnecyProject 函数,这意味着 DependnecyProjectMainProject 项目的依赖项。

MainProject pom.xml

    <dependency>
        <groupId>testgroup</groupId>
        <artifactId>DependnecyProject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>compile</scope>
    </dependency>

在我本地的eclipse中,这是完全完美的,执行没有任何问题。

我在 Git 中拥有这两个项目,并且在 Jenkins 中创建了两个作业,分别名为 MainDependency。我在 Main 作业中有一个 Pre Step,首先构建 Dependency,然后构建 Main

Dependency 作业成功,但 Main 作业失败,说明上述依赖项 (DependnecyProject) 无法解决。这可以理解为 Jenkins 和 Maven 无法找到依赖关系。有没有办法确保 Jenkins 解决依赖关系?

或者,我尝试了另一种解决方案 在我的本地,我尝试在 MainProject POM.XML

中使用
    <dependency>
        <groupId>testgroup</groupId>
        <artifactId>DependnecyProject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <scope>system</scope>
        <systemPath>C:\Users\cpratap\New-Workspace\Child\target\Parent-0.0.1-SNAPSHOT.jar</systemPath>
    </dependency>

这在本地运行良好,但不确定如何使其在 Jenkins 中同样运行?

更新: 在 Jenkins Main 工作中,我做了以下配置(如@Ian W 所建议)。尽管如前所述,这是一个糟糕的解决方法,但这确实有效。

  1. 遵循相同的配置
  2. Main Jenkins 工作中,我有三个 Pre-Steps
  3. 一个前置步骤是触发Dependency作业
  4. 第二个前置步骤是将工件从 Dependency 复制到 Main
  5. 第三步是使用“调用顶级 Maven 目标”将依赖项安装到本地存储库中,并在下面的目标中使用 install:install-file -Dfile= -DgroupId= -DartifactId= -Dversion= -Dpackaging=jar

这完全解决了我的问题,我可以毫无问题地运行构建并运行我的测试用例。谢谢大家的支持

【问题讨论】:

  • 你能展示一下 maven 工作的样子吗?工件(jar)必须在本地存储库中可用,否则主项目构建将始终失败。我看到创建了依赖项目的jar,所以主项目可以指向它,这就是为什么在使用定义完整路径的第二种情况时它成功的原因。您是否至少在 DependencyProject Maven 作业中定义了“安装”目标?
  • 通常,您使用一个 Maven 存储库管理器,您可以在其中部署您的工件。这样,没有环境会被强制安装依赖项。
  • @Seelenvirtuose 没错。但是,他定义了两个不同的作业,分别启动,这意味着主项目的构建必须以某种方式获得所有可用的依赖项才能成功,并且必须将它们安装在本地存储库中。
  • 这两个作业必须都使用相同的节点/代理,而不是私有仓库。第一项工作必须使用目标“安装”发布到本地仓库。您不需要指定“范围”或“系统路径”。但最好选择合适的 repo mgr。
  • 一个(糟糕的)解决方法是让提供者作业归档Artifacts。消费者作业可以使用copyartifact plugin 检索到工作区,然后使用mvn install:install-file 添加到本地存储库。

标签: java maven jenkins jenkins-pipeline maven-dependency


【解决方案1】:

如果你把一个jar和你的源代码一起放在vcs中,那么这样做的方法是在你的pom.xml文件中声明你的存储库,并使用你的jar作为依赖。

例如,如果您将 jar 放入项目的 lib 目录,这就是您在项目中使用它的方式。假设你的 jar 名称是 hello-world-library-1.0-SNAPSHOT.jar,你希望你的 groupId 是 com.local ,你的 artifactId hello-world-library-local版本是1.0-SNAPSHOT

首先,您应该在项目目录中创建本地存储库并将您的 jar 放在那里。

mvn \
deploy:deploy-file \
-Durl=file:./lib \
-Dfile=hello-world-library-1.0-SNAPSHOT.jar \
-DgroupId=com.local \
-DartifactId=hello-world-library-local \
-Dpackaging=jar \
-Dversion=1.0-SNAPSHOT

然后将本地存储库添加到你的 pom.xml

<repositories>
    <repository>
        <id>localrep</id>
        <name>local repository</name>
        <url>file:${project.basedir}/lib</url>
    </repository>
</repositories>

然后,将您的 jar 添加为 pom.xml 文件中依赖项块的依赖项

    <dependencies>
        <dependency>
            <groupId>com.local</groupId>
            <artifactId>hello-world-library-local</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

如果您想将 jar 与源代码一起分发,并且不想每次在新机器上构建时都弄乱您的项目设置,则可以使用它。

但不建议在企业环境中使用。你从不将存储库块放在你的 pom.xml 中,除非那是你的玩具项目,或者你真的知道你在做什么

如果您不想每次都将 jar 复制到项目目录中,则应考虑将项目转换为单个多模块 maven 项目

【讨论】:

  • 将二进制文件添加到 repo 是一个非常糟糕的主意,尤其是在 CI 构建作业的一部分时。由于每个二进制提交都是一个全新的副本,因此它将扩大您的 repo 大小。修改源代码中的 1 个字符,将 x MB 添加到您的存储库中。哎呀,每个构建都会添加一个相同的副本,其中包含带有更新时间戳的新 MANIFST.MF!此外,一个 milti-module maven 项目建议 OP'd 始终构建两者,而这可能不是本意。恕我直言,签入二进制文件是一种反模式,不应该被推荐;不良做法就是这样诞生和延续的。建议删除答案。
  • 如果您每次构建项目时都更新您的 jar,那就对了。但是如果你很少这样做,那么每次提交的新二进制副本的问题就不存在了。对于玩具项目,这很好,因为它教您如何分解代码,从而减轻使用工件存储库的负担。永远不要在生产中这样做。如果您需要经常更新库,多 maven 项目是一种方式。因此,如果在阅读后,您仍然认为我应该删除我的答案,我会很乐意这样做
  • @IanW 这就是为什么可重现的构建是好的,并且 Maven 被教导这样做 - maven.apache.org/guides/mini/guide-reproducible-builds.html
猜你喜欢
  • 2022-10-04
  • 2014-09-05
  • 2015-06-04
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
相关资源
最近更新 更多