【问题标题】:Spring boot multi module maven projects without repository没有存储库的 Spring Boot 多模块 Maven 项目
【发布时间】:2021-05-27 02:09:45
【问题描述】:

我有多个spring boot项目,每个项目都是独立的,有自己的CICD管道。

这些项目需要一些通用类,我已经创建了一个带有通用类的单独项目。

Parent
   pom.xml (with packaging)
   lib-project
      pom.xml
   project-1
      pom.xml
   project-2
      pom.xml
    

我可以轻松地从父目录构建项目,它会构建所有项目

parent$ mvn clean package

它会生成所有的jar文件并将它们放在各自的项目目标文件夹中

我的问题是我无法在父级别启动此操作,这必须从每个项目的自己的管道中启动。

我不能使用任何本地或远程存储库,使用 mvn clean install 将依赖 jar 放入 m2 中,然后将其称为依赖项

我想从相关项目目录构建它

parent/project-1$ mvn clean package

它显示以下错误:

Could not resolve dependencies for project com.test.multiple:project-1:jar:0.0.1-SNAPSHOT: Could not find artifact com.test.multiple:lib-project:jar:0.0.1-SNAPSHOT

我对 project-1 编译的期望

  1. 检查 project-1 是否存在依赖项
  2. 转到 ../lib-project
  3. 在目标文件夹(或与我们的项目相关的任何位置)中编译并构建它
  4. 将此生成的 jar 添加到“project-1”依赖项中
  5. 编译并构建“project-1”jar 文件。

父 Pom 配置

<project ...>
   <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.test.multiple</groupId>  
    <artifactId>parent</artifactId>  
    <version>0.0.1-SNAPSHOT</version>  

    <packaging>pom</packaging>
    
    <modules>
        <module>lib-project</module>
        <module>project-1</module>
    </modules>
</project>

** Lib 项目 pom **

<project ...>
    
    <parent>  
        <groupId>com.test.multiple</groupId>  
        <artifactId>parent</artifactId>  
        <version>0.0.1-SNAPSHOT</version>  
    </parent>
    
    <groupId>com.test.multiple</groupId>
    <artifactId>lib-project</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>lib-project</name>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

Project-1 pom

<project ...>
    
    <parent>  
        <groupId>com.test.multiple</groupId>  
        <artifactId>parent</artifactId>  
        <version>0.0.1-SNAPSHOT</version>  
    </parent>
    
    <groupId>com.test.multiple</groupId>
    <artifactId>project-1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>project-1</name>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>com.test.multiple</groupId>
            <artifactId>lib-project</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

【问题讨论】:

  • "我不能使用任何本地或远程存储库,使用 mvn clean install 将依赖的 jar 放在 m2 中,然后将其称为依赖" 然后你需要解决这个问题。其他一切都只是一个丑陋的黑客。

标签: java spring-boot maven multi-module


【解决方案1】:

我有多个spring boot项目,每个项目都是独立的,有自己的CICD管道。

这些项目需要一些通用类,我已经创建了一个带有通用类的单独项目。

恭喜,您的项目不再独立了!

鉴于上述定义,以下是依赖项:

  • lib-project 依赖于parent
  • project-1 依赖于parent
  • project-1 依赖于 lib-project

请查看Introduction to the POMGuide to Working with Multiple Modules 了解有关Maven 项目中依赖关系的讨论。


我不能使用任何本地或远程存储库,使用 mvn clean install 将依赖 jar 放入 m2 中,然后将其称为依赖项

鉴于此限制以及上面列出的依赖项,所有项目的 POM 和源文件必须存在于磁盘上以用于构建目的。构建过程必须从parent 文件夹开始。构建过程必须一次构建所有模块。

另外,请考虑使用mvn clean verify 而不是mvn clean install 以避免使用您正在构建的工件填充本地存储库

【讨论】:

    【解决方案2】:

    maven 项目并非旨在按需构建其依赖项。但是,jenkins 可以配置为在将更改推送到上游依赖项时构建下游项目。

    我还通过在相关 jenkinsfile 中的父 pom 上使用 -pl 选项来构建子项目的子集,从而解决了这个问题

    詹金斯文件

    clone parent project
    mvn clean package -pl core,deployable
    

    【讨论】:

    • 抱歉,限制是只能从项目文件夹内启动。
    • 这听起来不像 maven 可以按照你想要的方式做你想做的事。这就是为什么您可能需要以不同的方式解决问题。
    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 2017-05-31
    • 2014-06-02
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2017-02-02
    相关资源
    最近更新 更多