Многомодульный проект jar пакета Maven

У меня многомодульный проект. Я хочу сделать исполняемую банку из одного из этих модулей. корень пом

    <groupId>ru.netCracker</groupId>
    <artifactId>root</artifactId>
    <!--todo:Version-->
    <version>1.1.0</version>
    <packaging>pom</packaging>

    <properties>...</properties>

    <modules>
        <module>client</module>
        <module>serverRoot</module>
    </modules>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${maven.compiler.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin> 
        </plugins>
    </build>
</project>

В дочернем pom указаны настройки упаковки jar и некоторые зависимости.

    <artifactId>client</artifactId>
    <!--todo:Version-->
    <version>1.1.0</version>

    <parent>
        <groupId>ru.netCracker</groupId>
        <artifactId>root</artifactId>
        <version>1.1.0</version>
    </parent>

    <properties>
        <maven.jar.version>3.0.2</maven.jar.version>
        <jfoenix.version>1.11.1</jfoenix.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>ru.netCracker</groupId>
            <artifactId>root</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>${maven.jar.version}</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>sample.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Но компилятор maven говорит:

[ОШИБКА] Не удалось выполнить цель на клиенте проекта: не удалось разрешить зависимости для проекта ru.netCracker: client: jar: 1.1.0: не удалось найти ru.netCracker: root: jar: 1.1.0 в https://repo.maven.apache.org/maven2 был кэширован в локальном репозитории, разрешение не будет повторяться до тех пор, пока истек интервал обновления центрального сервера или обновления выполняются принудительно -> [Справка 1]

Какие команды я должен написать в maven, чтобы упаковать эту банку?


person Gordeev Pavel    schedule 07.01.2018    source источник
comment
какова ваша цель maven? если вы будете использовать цель 'package', просто добавьте <packaging>jar</packaging> рядом с тегом version.   -  person amir110    schedule 07.01.2018


Ответы (1)


Maven просто жалуется, что не может найти зависимость для модуля root, поскольку он еще не построен.

Предлагаю внести следующие изменения -

  1. Измените родительский тег в модуле client на

    <parent>
        <groupId>ru.netCracker</groupId>
        <artifactId>root</artifactId>
        <version>1.1.0</version>
        <relativePath>../</relativePath>
    </parent>
    
  2. Удалите следующий код, поскольку у вас root в качестве родителя.

    <dependencies>
        <dependency>
            <groupId>ru.netCracker</groupId>
            <artifactId>root</artifactId>
            <version>1.1.0</version>
        </dependency>
    </dependencies>
    
person Kedar Joshi    schedule 07.01.2018
comment
Ах хорошо. В relativePath записать путь к корневому файлу Pom.xml или к корневой папке корневого модуля? - person Gordeev Pavel; 07.01.2018
comment
Вы можете писать как угодно, поддерживаются оба метода. Если вы укажете путь к папке, тогда maven будет искать и использовать pom.xml в этой папке, что аналогично явному указанию относительного пути к pom.xml вашего родительского модуля. - person Kedar Joshi; 07.01.2018
comment
но все же идея IntelliJ не может импортировать классы из корневого модуля, весь импорт невидим, и IDE рекомендует мне добавить зависимость модуля к клиентскому pom. вместо этого компиляция недоступна. если я добавлю зависимость, maven снова не сможет увидеть это в центральном репо - person Gordeev Pavel; 07.01.2018
comment
В модуле root нет зависимостей для импорта в client. Какую зависимость вам нужно импортировать из root? - person Kedar Joshi; 07.01.2018
comment
Я использую некоторые классы, которые определены в корневом модуле. Но также эти классы используются в другом дочернем модуле, поэтому они находятся в корневом модуле, чтобы устранить дублирование кода. Но я все же хочу написать все эти модули в одном проекте. - person Gordeev Pavel; 07.01.2018
comment
packaging вашего root модуля - это pom, поэтому он не может иметь никаких собственных классов. Я бы предложил создать модуль common, а затем добавить его зависимость в client. Этот общий модуль будет обслуживать все классы, которые в настоящее время находятся в модуле root. - person Kedar Joshi; 07.01.2018
comment
так что я должен создать новый дочерний модуль root со всеми этими общими классами, упаковать его в jar и только затем поместить эту зависимость в мой клиентский модуль, верно? - person Gordeev Pavel; 07.01.2018
comment
Спасибо! :) Раньше я думал, что могу определять общие классы в корневом модуле. - person Gordeev Pavel; 07.01.2018