Основной вопрос maven: устанавливает ли maven транзитивно зависимости? - PullRequest
0 голосов
/ 02 ноября 2018

Я посмотрел здесь https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/, и это действительно так.

Однако я попытался поэкспериментировать с установкой mvn, и я не уверен, что она работает так, как ожидалось. Вот что я сделал

(1) Я создал библиотеку.

(2) Запустил установку mvn из командной строки

(3) Скопировал путь моей только что созданной банки

(4) Открыл новый проект maven, вставил путь в мой pom.xml

Я могу повторно использовать мои библиотечные методы, НО: один из моих библиотечных методов возвращает TransportClient, который является частью elasticsearch API. Используя intellij внутри моего нового проекта, кажется, что у меня нет elasticsearch, хотя я ссылаюсь на банку.

Это ожидается? Я ожидал, что он установил транзитивно elasticsearch, когда он ссылался на мою банку.

Я бы хотел указатель или два в правильном направлении, я совершенно новичок в этом. :)

Мой pom.xml для библиотеки, в которой в качестве зависимости используется эластичный поиск.

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <groupId>estutorial</groupId>
    <artifactId>estutorial</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.4.2</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>

    </dependencies>

</project>

Мой pom.xml для нового проекта maven, который пытается сослаться на lib для вышеуказанного pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>


    <groupId>sth</groupId>
    <artifactId>sth</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>estutorial</groupId>
            <artifactId>estutorial</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>/home/dell/.m2/repository/estutorial/estutorial/1.0-SNAPSHOT/estutorial-1.0-SNAPSHOT.jar
            </systemPath>
        </dependency>
    </dependencies>

</project>

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Нет. mvn install - это почти бесполезная команда. Он вставляет файл jar в ваш локальный репозиторий для последующего использования другими сборками maven. Вы используете термин «путь». Если вы запустите mvn install: install-file, чтобы поместить jar в локальный репозиторий под некоторыми координатами, вы можете ссылаться на эти координаты из другого pom; но это, как правило, приведет к будущим проблемам по сравнению с развертыванием JAR-файла в правильном менеджере хранилища.

0 голосов
/ 02 ноября 2018

Итак, если я понимаю ваши шаги, ваше объявление зависимостей в вашем приложении ссылок использует прямой путь к файлу jar в вашем локальном репозитории? Если это так, это необычно. Вам не нужно знать прямое расположение файлов для любых ваших зависимостей проекта Maven. Что вы должны делать.

В ссылочном проекте (для которого требуется библиотека Elasticsearch) его файл pom.xml определил бы саму зависимость эластичного поиска. Это должно соответствовать стандартам maven для объявления зависимостей (groupId, artifactId и artifactVerion). Если у вас нет артефакта эластичного поиска, maven попытается найти его и сохранить в вашем локальном хранилище. Вам не нужно указывать путь в файле pom.xml.

Когда вы устанавливаете указанный проект, он устанавливает в локальный репозиторий как файл JAR, так и файл pom.xml.

В ссылочном проекте вы должны определить зависимость от ссылочного артефакта в его pom-файле. Тот же формат: groupId, artifactId и artifactVersion. Вам не нужно указывать конкретный путь. Maven сделает то, что найдет ваш jar, на который ссылаются, но также использует установленный файл POM.xml для jar, на который ссылаются, чтобы найти переходные зависимости и включить их в ваш путь к классам.

Из того, что вы описали, ваши объявления зависимостей неверны. Если вы можете предоставить свой файл POM, можно предоставить более подробную информацию. В противном случае, просмотрите вступление maven с зависимостями .

...