多项目 Maven 和 AWS CodeBuild

Multi Project Maven and AWS CodeBuild

我是 Maven 的新手,我正在处理一个与我的其他项目有一个或多个依赖项的项目。

示例:我有 3 个 Maven 项目。

MyProject和MyProjectOther都是相互独立的,没有太大关系,但是它们都依赖于MyProjectCommon。 (MyProjectOther 与这个问题无关紧要,只是包含它以表明在其他项目中使用了 MyProjectCommon)

我可以在本地完成这项工作,我有一个工作区,我有两个包。我理解这是因为 Maven 将 MyProjectCommon 存储在本地存储库中。

两个项目(MyProject 和 MyProjectCommon)都有自己的 GitHub 存储库,我的 AWS CodeBuild 被定向到构建 MyProject 存储库。这失败了,因为 AWS CodeBuild 不存在 MyProjectCommon。

我的项目pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myproject</groupId>
  <artifactId>myproject</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>myproject</name>
  <url>http://maven.apache.org</url>

  <dependencies>
    <dependency>
      <groupId>com.myproject</groupId>
      <artifactId>myproject.common</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
</project>

MyProjectCommon pom.xml

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myproject</groupId>
  <artifactId>myproject.common</artifactId>
  <packaging>jar</packaging>
  <version>1.0</version>
  <name>myproject.common</name>
  <url>http://maven.apache.org</url>
</project>

不幸的是,在任何 CI 不了解底层构建依赖关系如何解析的系统上都没有简单的方法来执行此操作and/or 具有 'always consistent' 缓存工件。

虽然你在这里有几个选择。第一个选项是从库构建中发布您的工件。在这种情况下,您必须在 CodeBuild 中设置多个项目,一个用于 MyProject,另一个用于 MyProjectCommon。 MyProjectCommon 的构建会将工件发布到 S3(codebuild 可以执行此操作),然后 MyProject 的构建可以从 S3 下载已发布的工件(您也可以将 S3 替换为 Maven 存储库,但您必须发布工件)。

其他更明智的选择是使用 maven 模块来解决这个问题 (maven reactor) 并为 MyProjectCommon 和 MyProject 创建单个存储库。本质上,您的项目最终位于同一存储库下,并按照各个项目的 pom 中指定的依赖顺序构建。这里有更多关于 Maven 模块的文档 https://maven.apache.org/guides/mini/guide-multiple-modules.html

在您的示例中,您仍将保留 MyProject 和 MyProjectCommon 的 pom 文件,但创建另一个将 MyProject 和 MyProjectCommon 定义为模块的父 pom。然后,您可以为此存储库和 运行 创建 CodeBuild 项目,例如 'mvn install',这将按依赖顺序编译 MyProjectCommon 和 MyProject。您可以选择在 CodeBuild 中发布来自您的构建的多个工件,或为 MyProject 和 MyProjectCommon 发布带有工件的单个 zip。

希望对您有所帮助。