【问题标题】:Maven: Custom external jar as a dependency for a microservice architectureMaven:自定义外部 jar 作为微服务架构的依赖项
【发布时间】:2022-01-05 17:27:02
【问题描述】:

我正在尝试使用 springboot 创建一个微服务 java 项目。 我的想法是创建一个单独的 maven 项目,该项目将包含所有微服务共有的所有 DTO 和 utils 类。 (我知道很多人会批评这个选择,但我现在决定这样做)。

所以我创建了 lib 项目和 base 项目。在基础项目上工作,我的 IDE 可以正确读取 lib 模块中包含的类。 在编译阶段,我对 lib 项目进行了全新安装,然后对 base 项目进行了全新安装:此时我收到以下错误:

[ERROR] symbol:   class Test
[ERROR] location: interface slt.mytest.base.services.TestsService
[ERROR] /C:/workspace/mytest/slt-base-be/src/main/java/slt/mytest/base/services/impl/TestsServiceImpl.java:[8,47] package slt.mytest.libs.entities.base does not exist
[ERROR] /C:/workspace/mytest/slt-base-be/src/main/java/slt/mytest/base/services/impl/TestsServiceImpl.java:[9,45] package slt.mytest.libs.models.base does not exist
[ERROR] /C:/workspace/mytest/slt-base-be/src/main/java/slt/mytest/base/repositories/TestsRepository.java:[5,47] package slt.mytest.libs.entities.base does not exist
[ERROR] /C:/workspace/mytest/slt-base-be/src/main/java/slt/mytest/base/repositories/TestsRepository.java:[10,60] cannot find symbol
[ERROR] symbol: class TestEntity

如何使 lib 成为可见的基础项目? 有没有办法在每次基本安装时自动开始编译库?

一般...您将如何处理此案?

谢谢

lib 项目 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>slt.mytest</groupId>
    <artifactId>libs</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>libs</name>
    <description>Libs Module of mytest</description>
    <properties>
        <java.version>1.8</java.version>
        <org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
        <org.projectlombok.version>1.18.22</org.projectlombok.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

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

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>${org.projectlombok.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

基础项目 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>slt.mytest</groupId>
    <artifactId>base</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>base</name>
    <description>Base Module of mytest</description>
    <properties>
        <java.version>1.8</java.version>
        <org.mapstruct.version>1.2.0.Final</org.mapstruct.version>
        <org.projectlombok.version>1.18.22</org.projectlombok.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
            <version>${org.projectlombok.version}</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-jdk8</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

        <dependency>
            <groupId>slt.mytest</groupId>
            <artifactId>libs</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

【问题讨论】:

  • 如果你想创建 lib 是个好主意,不要让它被 spring-boot-maven-plugin 打包,因为它会产生一个不能被其他人使用的 jar...
  • 创建一个单独的 maven 项目并在其中添加 dto 和其他实用程序。将 spring boot starter 添加为依赖项,但不添加为 lib 中的父项。导入并在您的客户端中创建配置类,您将在其中导入要包含的 Spring Boot 包。看看 Spring Boot 中的 @import 。 Lib 将作为 jar 添加,因此请确保它独立编译
  • 这是一种标准做法,@khmarbaise 是对的

标签: java spring-boot maven microservices


【解决方案1】:

TL;DR:您可能需要将 lib 项目安装到本地存储库 (.m2/repository)。您可以通过在lib 项目中执行mvn install(或使用IDE 的GUI 功能)来完成此操作。如果base 仍然无法编译,则在base 上执行mvn dependency:resolve

您的 IDE 可能会识别依赖项,这就是为什么您的代码编辑器中没有错误的原因,但 Maven 不会,除非它可以解决依赖项。它将尝试从您的本地存储库和远程存储库中解析(在您的情况下,由于您没有在 POM 中定义任何内容,因此只是 Maven Central)。

【讨论】:

  • 嗨 Oliver,在编译基础项目之前,我已经在 libs 项目中执行了 mvn clean install。不幸的是,它没有工作
  • 您是否检查了本地存储库以确保已放置 jars?
  • 是的,我确认我的 libs-0.0.1-SNAPSHOT.jar 在我的 .m2 目录中
  • 在 lib 和客户端项目中尝试不带 -SNAPSHOT 位
猜你喜欢
  • 2017-09-08
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
相关资源
最近更新 更多