Сбор транзитивных зависимостей на основе Maven к пути к классам не-Maven проекта - PullRequest
22 голосов
/ 22 февраля 2012

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 22 февраля 2012

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

mvn dependency:copy-dependencies

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

mvn dependency:copy-dependencies -DincludeScope=runtime
4 голосов
/ 22 февраля 2012

Ну, есть пара проблем на работе здесь. 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.

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

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

...