Maven: Пользовательский внешний jar как зависимость для архитектуры микросервисов

#java #spring-boot #maven #microservices

Вопрос:

Я пытаюсь создать java — проект микрослужб с помощью springboot. Моя идея состоит в том, чтобы создать отдельный проект maven, который будет содержать все классы DTOs и utils, общие для всех микросервисов. (Я знаю, что многие будут критиковать этот выбор, но именно так я решил поступить в данный момент).

Поэтому я создал проект lib и базовый проект. Работая над базовым проектом, моя среда IDE может правильно считывать классы, содержащиеся в модуле lib. На этапе компиляции я выполняю чистую установку проекта lib, а затем чистую установку базового проекта: на этом этапе я получаю следующую ошибку:

 [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

 lt;?xml version="1.0" encoding="UTF-8"?gt; lt;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"gt;  lt;modelVersiongt;4.0.0lt;/modelVersiongt;  lt;parentgt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-parentlt;/artifactIdgt;  lt;versiongt;2.6.0lt;/versiongt;  lt;relativePath/gt; lt;!-- lookup parent from repository --gt;  lt;/parentgt;  lt;groupIdgt;slt.mytestlt;/groupIdgt;  lt;artifactIdgt;libslt;/artifactIdgt;  lt;versiongt;0.0.1-SNAPSHOTlt;/versiongt;  lt;namegt;libslt;/namegt;  lt;descriptiongt;Libs Module of mytestlt;/descriptiongt;  lt;propertiesgt;  lt;java.versiongt;1.8lt;/java.versiongt;  lt;org.mapstruct.versiongt;1.2.0.Finallt;/org.mapstruct.versiongt;  lt;org.projectlombok.versiongt;1.18.22lt;/org.projectlombok.versiongt;  lt;/propertiesgt;  lt;dependenciesgt;  lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-data-jpalt;/artifactIdgt;  lt;/dependencygt;  lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-weblt;/artifactIdgt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-devtoolslt;/artifactIdgt;  lt;scopegt;runtimelt;/scopegt;  lt;optionalgt;truelt;/optionalgt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-testlt;/artifactIdgt;  lt;scopegt;testlt;/scopegt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;org.apache.commonslt;/groupIdgt;  lt;artifactIdgt;commons-lang3lt;/artifactIdgt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;org.projectlomboklt;/groupIdgt;  lt;artifactIdgt;lomboklt;/artifactIdgt;  lt;optionalgt;truelt;/optionalgt;  lt;versiongt;${org.projectlombok.version}lt;/versiongt;  lt;/dependencygt;  lt;dependencygt;  lt;groupIdgt;org.mapstructlt;/groupIdgt;  lt;artifactIdgt;mapstruct-jdk8lt;/artifactIdgt;  lt;versiongt;${org.mapstruct.version}lt;/versiongt;  lt;/dependencygt;    lt;/dependenciesgt;   lt;buildgt;  lt;pluginsgt;  lt;plugingt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-maven-pluginlt;/artifactIdgt;  lt;configurationgt;  lt;excludesgt;  lt;excludegt;  lt;groupIdgt;org.projectlomboklt;/groupIdgt;  lt;artifactIdgt;lomboklt;/artifactIdgt;  lt;/excludegt;  lt;/excludesgt;  lt;/configurationgt;  lt;/plugingt;  lt;/pluginsgt;  lt;/buildgt;  lt;/projectgt;  

базовый проект pom.xml

 lt;?xml version="1.0" encoding="UTF-8"?gt; lt;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"gt;  lt;modelVersiongt;4.0.0lt;/modelVersiongt;  lt;parentgt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-parentlt;/artifactIdgt;  lt;versiongt;2.6.0lt;/versiongt;  lt;relativePath/gt; lt;!-- lookup parent from repository --gt;  lt;/parentgt;  lt;groupIdgt;slt.mytestlt;/groupIdgt;  lt;artifactIdgt;baselt;/artifactIdgt;  lt;versiongt;0.0.1-SNAPSHOTlt;/versiongt;  lt;namegt;baselt;/namegt;  lt;descriptiongt;Base Module of mytestlt;/descriptiongt;  lt;propertiesgt;  lt;java.versiongt;1.8lt;/java.versiongt;  lt;org.mapstruct.versiongt;1.2.0.Finallt;/org.mapstruct.versiongt;  lt;org.projectlombok.versiongt;1.18.22lt;/org.projectlombok.versiongt;  lt;/propertiesgt;  lt;dependenciesgt;  lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-data-jpalt;/artifactIdgt;  lt;/dependencygt;  lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-weblt;/artifactIdgt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-devtoolslt;/artifactIdgt;  lt;scopegt;runtimelt;/scopegt;  lt;optionalgt;truelt;/optionalgt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-starter-testlt;/artifactIdgt;  lt;scopegt;testlt;/scopegt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;org.projectlomboklt;/groupIdgt;  lt;artifactIdgt;lomboklt;/artifactIdgt;  lt;optionalgt;truelt;/optionalgt;  lt;versiongt;${org.projectlombok.version}lt;/versiongt;  lt;/dependencygt;  lt;dependencygt;  lt;groupIdgt;org.mapstructlt;/groupIdgt;  lt;artifactIdgt;mapstruct-jdk8lt;/artifactIdgt;  lt;versiongt;${org.mapstruct.version}lt;/versiongt;  lt;/dependencygt;   lt;dependencygt;  lt;groupIdgt;slt.mytestlt;/groupIdgt;  lt;artifactIdgt;libslt;/artifactIdgt;  lt;versiongt;0.0.1-SNAPSHOTlt;/versiongt;  lt;/dependencygt;   lt;/dependenciesgt;   lt;buildgt;  lt;pluginsgt;  lt;plugingt;  lt;groupIdgt;org.springframework.bootlt;/groupIdgt;  lt;artifactIdgt;spring-boot-maven-pluginlt;/artifactIdgt;  lt;configurationgt;  lt;excludesgt;  lt;excludegt;  lt;groupIdgt;org.projectlomboklt;/groupIdgt;  lt;artifactIdgt;lomboklt;/artifactIdgt;  lt;/excludegt;  lt;/excludesgt;  lt;/configurationgt;  lt;/plugingt;  lt;/pluginsgt;  lt;/buildgt;  lt;/projectgt;  

Комментарии:

1. Если вы хотите создать lib, что является хорошей идеей, не делайте его упакованным с помощью плагина spring-boot-maven, потому что он создаст банку, которую не смогут использовать другие…

2. Создайте отдельный проект maven и добавьте в него dto и другие утилиты. Добавьте spring boot starter в качестве зависимости, но не в качестве родителя в свою библиотеку. Импортируйте и в своем клиенте создайте класс конфигурации, в который вы будете импортировать пакеты spring boot, которые хотите включить. Взгляните на @import в весенней загрузке. Библиотека будет добавлена в виде банки, поэтому убедитесь, что она компилируется независимо

3. Это стандартная практика, и @khmarbaise прав

Ответ №1:

TL;DR: Возможно, вам потребуется установить свой lib проект в локальное хранилище ( .m2/repository ). Вы можете сделать это, выполнив mvn install (или используя функции графического интерфейса вашей среды разработки) в lib проекте. Если base все еще не компилируется, выполните mvn dependency:resolve on base .

Ваша среда IDE может идентифицировать зависимость, и именно поэтому в редакторе кода нет ошибок, но Maven не будет этого делать, если он не сможет устранить зависимость. Он попытается разрешить из вашего локального репозитория и удаленных репозиториев (которые в вашем случае, поскольку вы не определили их в своем POM, являются просто Maven Central).

Комментарии:

1. Привет, Оливер, я уже выполняю чистую установку mvn в проекте libs перед компиляцией базового проекта. К сожалению, это не сработало

2. Вы проверили свое локальное хранилище, чтобы убедиться, что банки были размещены?

3. Да, я подтверждаю, что мой libs-0.0.1-SNAPSHOT.jar находится в моем каталоге .m2

4. Попробуйте сделать это без бита-SNAPSHOT, как в библиотеке, так и в клиентском проекте