多项目Maven和AWS代码构建

多项目Maven和AWS代码构建,maven,amazon-web-services,aws-codebuild,Maven,Amazon Web Services,Aws Codebuild,我是Maven的新手,我正在从事一个与我的其他项目有一个或多个依赖关系的项目 我有3个maven项目 我的项目 MyProjectOther MyProjectCommon MyProject和MyProjectOther彼此独立,彼此之间没有太多关系,但它们都依赖于MyProjectCommon。(MyProjectOther与这个问题没有多大关系,只是将其包括在内以表明MyProjectCommon用于其他项目) 在本地我可以做到这一点,我有一个工作区,我有两个包。我理解这是因为Mave

我是Maven的新手,我正在从事一个与我的其他项目有一个或多个依赖关系的项目

我有3个maven项目

  • 我的项目
  • MyProjectOther
  • MyProjectCommon
MyProject和MyProjectOther彼此独立,彼此之间没有太多关系,但它们都依赖于MyProjectCommon。(MyProjectOther与这个问题没有多大关系,只是将其包括在内以表明MyProjectCommon用于其他项目)

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

这两个项目(MyProject和MyProjectCommon)都有自己的GitHub存储库,MyAWS CodeBuild用于构建MyProject存储库。此操作失败,因为AWS代码构建不存在MyProjectCommon dose

  • 我如何让这个版本与AWS CodeBuild一起工作,让CodeBuild在构建MyProject之前下载并构建MyProjectCommon
MyProject
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>
 <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系统,都没有简单的方法可以做到这一点

不过,你在这里有两个选择。第一个选项是从库构建发布您的工件。在这种情况下,您必须在CodeBuild中设置多个项目,一个用于MyProject,另一个用于MyProjectCommon。MyProjectCommon的构建可以将工件发布到S3(codebuild可以做到这一点),然后MyProject的构建可以从S3下载发布的工件(您也可以用maven存储库替换S3,但您必须发布工件)

另一个更明智的选择是使用maven模块来解决这个问题(maven reactor),并为MyProjectCommon和MyProject创建单个存储库。基本上,您的项目最终位于同一个存储库中,并按照各个项目的pom中指定的依赖顺序构建。这里有更多关于maven模块的文档

在您的示例中,您仍将保留MyProject和MyProjectCommon的pom文件,但创建另一个将MyProject和MyProjectCommon定义为模块的父pom。然后,您可以为此存储库创建CodeBuild项目,并运行例如“mvn安装”,它将按照依赖关系顺序编译MyProjectCommon和MyProject。您可以选择从内置代码中发布多个工件,或者使用MyProject和MyProjectCommon的工件发布单个zip


我希望这能有所帮助。

谢谢@awsnitin这帮了大忙,我还没有看到你提供的链接。但是,如果使用一个存储库,我的另一个包将如何工作,MyProjectOther也依赖于MyProjectCommon。我并不局限于Maven,还有其他的构建系统可以为我解决这个问题吗?您需要使用能够在本机上理解您正在使用的其他构建工具的依赖关系管理的构建工具。gradle就是这样一个例子,它可以插入您的工具中。我以前没有用gradle+monorepo玩过多个子模块,但听起来是可行的。我建议阅读gradle+依赖关系管理。仅供参考,当然还有更多的工具和/或方法来处理依赖关系管理,如果你不想把自己束缚在单一构建工具上,我建议多探索一点。我调查了Gradle,这能够解决我的问题,即拥有多个代表和项目。仍然在寻找如何使用AWS代码构建:)@Androme你在AWS代码构建中使用过这个吗?