Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Java > Maven и IDEA


Автор: VisualProg 14.08.20, 11:02
Всем привет)
Вернулся я значит на java, вникал в Maven, Spring и прочие прелести java-мира, которые прошли мимо меня пока занимался шарпом и плюсами. Так же, начал осваивать IDEA, которая кажется очень непривычной, вроде как, тут есть многое, но, найти это довольно сложно, возможно, я слишком привязался к eclipse и vs, поэтому многие нововведения от IDEA для меня не очевидны.
Почему то, мне довольно сложно искать конкретные ответы на вопросы по Maven-у, сейчас уже тонны различных статей, но, очень нужной информации либо нет, либо упоминается вскользь без разжёвываний. Я постарался собрать наиболее острые вопросы, и задать их тут, может wind, Данила или другие гуру примудростей java смогут мне помочь или натолкнуть на правильный путь, буду очень признателен!

1. Maven.

В мавене всё строится на pom-ника, которые подключают нам артефакты нужной версии. Пока у нас один pom.xml файл - тут всё довольно прозрачно, даже с учётом того что помник может содержать нечто на вроде переменных, какие то сложных конфигураций и т.д.

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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 http://maven.apache.org/maven-v4_0_0.xsd">
     
        <modelVersion>4.0.0</modelVersion>
        <groupId>ru.my.project</groupId>
        <artifactId>MyProject</artifactId>
        <version>1.0.0.0</version>
        
        <dependencies>
            <dependency> <!-- Добавляем зависимость от одной библиотеки -->
                <groupId>ru.test</groupId>
                <artifactId>test</artifactId>
                <version>1.0.0.0</version>
            </dependency>
        </dependencies>
        
    </project>



Но, как только мы создаём второй зависимый проект, со своим вторым pom-ником, в наш проект вторгаются захватчики из параллельного мира и начинают чинить бедствия, смерти и разруху. В помниках появляются зависимости от зависимостей (так называемые, косвенные зависимости). Естественно, в наших проектах появляется один родительский помник и один дочерний. Дочерний помник знает о зависимостях родителя, обязан зависить от них и в этом проекте + свои зависимости.

Родительский проект
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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 http://maven.apache.org/maven-v4_0_0.xsd">
     
        <groupId>ru.my.project</groupId>
        <artifactId>MyProject</artifactId>
        <version>1.0.0</version>
        
        <dependencies>
            <dependency> <!-- Добавляем зависимость от одной библиотеки -->
                <groupId>ru.test</groupId>
                <artifactId>test</artifactId>
                <version>1.0.0</version>
            </dependency>
        </dependencies>
        
    </project>


Дочерний проект
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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 http://maven.apache.org/maven-v4_0_0.xsd">
     
        <parent>
            <groupId>ru.my.project</groupId>
            <artifactId>MyProject</artifactId>
            <version>1.0.0</version>
        </parent>
     
        <groupId>ru.my.module1</groupId>
        <artifactId>MyModule1</artifactId>
        <version>1.0.0</version>
        
        <dependencies> <!-- У нас уже есть косвенная зависимость от ru.test -->
        </dependencies>
        
    </project>


И тут я не понимаю как правильно нужно поступать.
Нужно ли как то обозначать подобную косвенную зависимость? Как это сделать - добавлять ту же зависимость, но без версии, а в родительском помнике оставлять версию?

2. Maven + сторонние артефакты

Представим такую ситуацию, у меня есть два проекта

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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 http://maven.apache.org/maven-v4_0_0.xsd">
     
        <groupId>ru.my.project</groupId>
        <artifactId>MyProject</artifactId>
        <version>1.0.0</version>
        
        <dependencies>
            <dependency> <!-- Добавляем зависимость от одной библиотеки -->
                <groupId>ru.test</groupId>
                <artifactId>test</artifactId>
                <version>1.0.0</version> <!-- Версия 1.0.0 -->
            </dependency>
        </dependencies>
        
    </project>


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    <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 http://maven.apache.org/maven-v4_0_0.xsd">
     
        <parent>
            <groupId>ru.my.project</groupId>
            <artifactId>MyProject</artifactId>
            <version>1.0.0</version>
        </parent>
     
        <groupId>ru.my.module1</groupId>
        <artifactId>MyModule1</artifactId>
        <version>1.0.0</version>
        
        <dependencies>
            <dependency> <!-- Добавляем зависимость от одной библиотеки -->
                <groupId>ru.test</groupId>
                <artifactId>test</artifactId>
                <version>2.0.1</version> <!-- Версия 2.0.1 -->
            </dependency>
        </dependencies>
        
    </project>


Если бы я работал в Visual Studio на шарпе, я бы сразу пошёл в свойства солюшена, и начал бы делать Consolidation решения
screen1.png (, : 5080)
screen2.png (, : 4943)

Где я увидел бы что у меня есть одна библиотека, которая используется в двух проектах, однако, в одном проекте она одной версии, во втором проекте - совершенно другой. Далее я привошу библиотеку во всех проектах что её используют к одной версии (как правило, к наибольшей), и таким образом, избавляюсь от кучи потенциальных проблем.

Нужно ли делать подобное в Maven? Есть ли у Maven средства для анализа и консолидации одинаковых зависимостей разных версий? Можно ли подобное делать средствами IDEA?

3. Maven + сторонние артефакты + косвенные зависимости у сторонних артефактов

Буквально сегодня я узнал о таком термине как JAR-Hell, если я правильно его понял (прошу поправить если что), суть заключается в косвенных зависимостях подключаемых артефактов. Например, в IDEA у плагина Maven, есть такой интересный инструмент "Show Dependencies...", который анализирует зависимости (почему то, я вижу только зависимости у артефактов, но не вижу зависимости между своими проектами), и на основнии анализа, строит граф, в котором показывает ошибки (цикличные зависимости, или использование разных версий артефакта внутри артефактов).

screen3.png (, : 4875)

Он действительно находит разные версии артефактов, однако, делает он это, почему то, в моём локальном репозитории, вместо того, чтобы подсказывать как мне правильно делать зависимости в моих помниках.
Подскажите, нужно ли как то исправлять то что я вижу на этой картине (красные стрелочки)? Как мне сделать подобную консолидацию между моими десятками помников? Есть ли встроенные средства для этого в Maven/IDEA? Может быть, нужно поставить какие то плагины?


Почему то, мне кажется, что то что я спрашиваю решалось уже многими людьми, и ответ для них очевиден, поэтому надеюсь что вы подскажите как правильно решать всё эти перечисленные проблемы.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)