Импорт двух разных классов из двух модулей с одинаковым путем к пакету

#java #maven #kotlin #module #dependencies

Вопрос:

У меня есть проект maven, в котором есть основной модуль POM, например Main. Main содержит два pom-модуля: «core» и «app». «ядро» содержит jar-модуль «A», «приложение» содержит jar-модуль «B» У меня есть следующие классы:

  1. app.B.src.main.java.di.AModule.kt // модуль внедрения зависимостей
  2. app.B.src.main.java.domain.App.java // основное приложение
  3. core.A.src.main.java.domain.BModule.kt // другие инъекции

Когда я импортирую модуль.kt и BModule.kt в App.java , это выглядит как

 import di.AModule;
import di.BModule;
 

Maven не может завершить этап установки и сообщает «Не удается найти символ», указывающий на модуль импорта, который семантически ближе к App.java

Что мне делать с pom-файлами или пакетами, чтобы решить эту проблему?

PS Также у меня проблема с тем, что maven не видит core.A.src.test.java.SomethingTest.kt на этапе тестирования

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

1. Откуда берется di.BModule второй импорт? Вы упоминаете только a di.AModule (1.) и a domain.BModule (3.).

2. Вы объявили A себя <dependency> в B качестве ПОМ?

3. @GeroldBroser core.A.src.main.java.di.BModule.kt*

4. Является app.B.src.main.java.di ли и т.д. действительно вашей структурой пакета?

Ответ №1:

Ваши проекты (в соответствии с тем, что можно извлечь из вашего вопроса):

  - Main
    - core
       - src/main/java
      |   - di
      |      - AModule.kt
       - target
      |   - A.jar
       - pom.xml ... <artifactId>A
    - app
       - src/main/java
      |   - domain
      |      - App.java
      |      - BModule.kt
       - target
      |   - B.jar
       - pom.xml ... <artifactId>B
 

Проекты A и B независимы друг от друга. Будучи одновременно a <module> of Main , вы можете создавать их за один раз (через сборку Main ).

Чтобы иметь возможность ссылаться AModule на in App , вы должны объявить его JAR A как <dependency> in’ B s POM:

     ...
    <artifactId>B</artifactId>
    ...
    <dependencies>
        <dependency>
            <groupId>...</groupId>
            <artifactId>A</artifactId>
            <version>...</version>
        </dependency>
    ...
 

<packaging> Тип проектов, которые содержат код и должны создавать артефакт, должен быть jar , war , и т.д., не . pom

Также рекомендуется разделять разные типы источников, такие как:

    ...
    - app
   |   - src/main
   |      - java
   |     |   - domain
   |     |      - App.java
   |      - kotlin
   |         - domain
   |            - BModule.kt
   ...
 

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

1. Хотите исправить свою нарисованную структуру: ядро содержит jar-упаковочный модуль A , который имеет src… Модуль и ядро — это pom-упаковка. приложение содержит jar-упаковку B с src… BModule и App , а приложение — это pom-упаковка. Я объявил зависимость от всего основного модуля в app/pom.xml а также объявленная зависимость от A -модуля в app/B/pom.xml

2. @ShpilevojArsenij Код в проектах с <packaging>pom не компилируется, Не тестируется и т. Д. И артефакт не создается. Этот тип упаковки предназначен только для родительских проектов, которые содержат объявления для наследования (суб-) <module> s. Измените тип упаковки A и B на jar .