2012-02-21 3 views
22

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

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

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

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

+4

+1, очень важный вопрос для новичков maven. –

ответ

14

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

mvn dependency:copy-dependencies 

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

mvn dependency:copy-dependencies -DincludeScope=runtime 
+2

Прохладный хак!Это работало для меня, но моя потребность была немного иной. В моем случае этого было достаточно, чтобы получить classpath. Вы можете сгенерировать путь к классам и вывести его в некоторый файл в ресурсах, который вы можете использовать позже. код здесь ' \t \t \t \t org.apache.maven.plugins \t \t \t \t Maven-зависимость-плагин \t \t \t \t порождающие-источники наращивание путь к классам <конфигурация> \t \t \t $ {project.basedir}/src/main/resourc es/classpath ' – raxith

+0

@raxith submit это как ваш собственный ответ, секция кода слишком длинная для интерпретации. –

+0

@ Jörn Horstmann Итак, после запуска цели зависимости от копирования, чтобы запустить код, мы должны выполнить «java -cp» target \ *; target \ dependency \ * «com.myCompany.App' из папки проекта? –

4

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

<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> 

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

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

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