Подтвердить что ты не робот

Сбор транзитных зависимостей зависимостей на основе Maven с не-Maven-классом

Я использую библиотеку, которая использует Maven для компиляции и тестирования.
Я смог скомпилировать библиотеку без проблем. При компиляции казалось, что он загружает все зависимости библиотеки.

Теперь я пытаюсь использовать библиотеку в своем проекте. Когда я скомпилировал библиотеку, я обнаружил, что в папке библиотеки была создана папка с именем target и внутри этой папки была другая папка с именем classes. Я добавил папку classes в свой путь к классам. Однако всякий раз, когда я пытаюсь использовать эту библиотеку в своем проекте, который не использует Maven, он говорит, что не может найти эти зависимости в библиотеке.

Как добавить все связанные с библиотекой зависимости в мой путь к классам? Нужно ли мне вручную загружать все зависимости в библиотеке и добавлять их в путь к классам? Есть ли способ, которым я могу заставить Maven сделать это для меня?
Что мне нужно сделать, чтобы я мог использовать библиотеку в моем проекте?

Мой проект находится в полностью отдельной директории, чем библиотека. Прямо сейчас, мой проект, похоже, правильно загружает файлы библиотеки, но не зависит от библиотек.

4b9b3361

Ответ 1

Когда вы выполнили mvn install для этой библиотеки, он должен был создать файл jar и поместить его в target/libaryname-version.jar. Лучше было бы зависеть от этой последней баночки вместо содержимого папки classes. У Maven также есть цель загрузить все зависимости проекта. Вы можете выполнить

mvn dependency:copy-dependencies

Внутри папки библиотек и скопируйте все банки зависимостей на target/dependency. По умолчанию это также включает в себя банки, которые нужны только для тестов, чтобы исключить их, вы могли бы использовать

mvn dependency:copy-dependencies -DincludeScope=runtime

Ответ 2

Ну, здесь есть пара проблем. Maven делает тяжелую работу по выяснению всех зависимостей, необходимых для создания вашей библиотеки и их загрузки. Эти зависимости хранятся локально в вашем репозитории Maven (<user home>/.m2/repository), но если они не нужны как часть сборки, вы не найдете их в папке target. По крайней мере, не по умолчанию. Сначала вам нужно получить Maven для хранения всех зависимостей в папке сборки (этот отрывок POM был выровнен из другого сообщения SO):

<project>
...
    <profiles>
        <profile>
            <id>qa</id>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-dependency-plugin</artifactId>
                            <executions>
                                <execution>
                                    <phase>install</phase>
                                    <goals>
                                        <goal>copy-dependencies</goal>
                                    </goals>
                                    <configuration>
                                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
                                    </configuration>
                                </execution>
                            </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

С приведенными выше изменениями POM вы должны теперь получить все зависимости JAR, необходимые вашей библиотеке, и включить их в свой путь к классам (от target/lib). Я бы рекомендовал скопировать их в другую папку на вашей рабочей станции, так как папка target будет запускаться каждый раз, когда вы выполняете цель clean для библиотек Maven build.

Теперь, сказав все это, почему бы не адаптировать ваш проект к использованию Maven? Тогда все, что вам нужно сделать, это включить JAR верхнего уровня в зависимости от вашего POM, а Maven будет обрабатывать все его зависимые от него зависимости. В конце концов, это сила Maven - вам было бы выгодно использовать ее.

В любом случае, удачи в зависимости от выбранного вами двух подходов.