Зависимость Maven от другого локального проекта: все в порядке, но компилятор не видит jar

У меня есть два проекта, скажем, A и B, в одном каталоге dir. B является родительским проектом для своего модуля C. C зависит от A. Структура каталога:

dir/
    A/
    B/
       C/

Я использую метод этот, создаю проект с модулями и показываю, что C зависит от A. После этого Netbeans запускается чтобы увидеть пакеты A в C, например. он не показывает отсутствующих пакетов, дает подсказки по использованию классов из A в C. Если я ставлю A как модуль B, mvn clean install говорит, что maven реактор нашел правильный порядок компиляции проектов и компилирует их в порядке A, B, C. mvn dependency:tree показывает, что groupB:C:jar:0.0.1 имеет дочерний узел groupA:A:jar:0.0.1:compile.

Я не уверен, может ли A быть модулем B, потому что у A есть другой родитель (Spring boot). Таким образом, я пробую другой вариант: удалить A из модулей B, затем mvn clean install в A, чтобы (я предполагаю) созданный им jar попал в локальное репо. Оба варианта подходят для maven и Netbeans, но не для компилятора. Во время компиляции C не видит пакеты A.

Я сделал mvn clean install в любом из трех проектов. Зависимость в C должна иметь точные свойства A, иначе в Maven возникнет ошибка зависимости. Кажется, что и механизм подсказок Netbeans, и Maven думают, что A является библиотекой C. Только компилятор этого не видит. Я предполагаю, что я сделал ошибку новичка. Что это может быть?

Соответствующие фрагменты pom.xml вовлечены:

A:

   <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.1</version>
            <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>groupA</groupId>
    <artifactId>A</artifactId>
    <packaging>jar</packaging>
    <version>0.0.1</version>
    <name>projectA</name>
    <description>project A</description>

B: (я пробовал варианты с A, являющимся модулем B, закомментированным или нет)

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/>
</parent>
<groupId>groupB</groupId>
<artifactId>B</artifactId>
<packaging>pom</packaging>
<version>0.0.1</version>
<name>projectB</name>
<description>project B</description>

<modules>
        <!--module>../A</module-->
        <module>C</module>
</modules>

C:

<parent>
        <groupId>groupB</groupId>
        <artifactId>B</artifactId>
        <version>0.0.1</version>
        <relativePath>../</relativePath>
</parent>
<groupId>groupB</groupId>
<artifactId>C</artifactId>
        <packaging>jar</packaging>
<version>0.0.1</version>
<name>projectC</name>
<description>project C</description>
<dependencies>
        <dependency>
            <groupId>groupA</groupId>
            <artifactId>A</artifactId>
            <version>0.0.1</version>
        </dependency>
</dependencies>

person scriptfoo    schedule 25.01.2021    source источник
comment
Лучше всего было бы создать пример проекта/установки на github или подобном...   -  person khmarbaise    schedule 26.01.2021


Ответы (1)


Увидев, что jar A находится в дереве зависимостей, я искал классы A в этом jar. Оказалось, их нет. Вместо этого они упакованы отдельно в groupA.A.jar.original. Как оказалось, можно было сделать Spring Boot родителем A, даже если A — это просто библиотека. Благодаря этому все зависимости Spring автоматически получают версии от родителя. Однако я также включил spring-boot-maven-plugin в A, не зная, для чего это нужно. Этот плагин имеет цель repackage, которая подготавливает приложение Spring Boot. Это было причиной создания этих двух банок, и, по сути, C не видел классов A. См. этот вопрос для получения дополнительной информации. Детали.

Сохранение Spring Boot в качестве родителя, но удаление плагина заставило C увидеть классы A.

person scriptfoo    schedule 26.01.2021