2

我是 Maven 新手,我正在开发一个项目,该项目对我的其他项目有一个或多个依赖项。

示例:我有 3 个 Maven 项目。

  • 我的项目
  • 我的项目其他
  • MyProjectCommon

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

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

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

  • 我怎样才能让这个构建与 AWS CodeBuild 一起使用,让 CodeBuild 在构建 MyProject 之前下载并构建 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>

MyProjectCommonpom.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>
4

1 回答 1

1

不幸的是,在任何不了解如何解决底层构建依赖项和/或具有“始终一致”的缓存工件的 CI 系统上,都没有简单的方法可以做到这一点。

不过,您确实有几个选择。第一种选择是从库构建中发布您的工件。在这种情况下,您必须在 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。

我希望这有帮助。

于 2017-04-12T20:12:09.457 回答