Как настроить зависимость подпроекта в Maven без развертывания jar-файлов? - PullRequest
18 голосов
/ 06 апреля 2010

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

У меня есть следующая структура проекта:

parent
   ---sub-project1
   ---sub-project2

Подпроект2 должен иметь под-проект1 в качестве зависимости.

Итак, у меня есть это в pom sub-project2:

 <dependencies>
    <dependency>
         <artifactId>sub-project1</artifactId>
        <groupId>mygroup</groupId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

....

Когда я делаю это, Maven пытается загрузить файл sub-project1.jar, который не существует, поскольку он еще не готов к репо.

Я пытался поместить <scope>import</scope> в зависимость, но это тоже не сработало - тот же результат.

Итак, что мне нужно сделать, чтобы Maven смотрел на подпроект1 при создании подпроекта 2?

РЕДАКТИРОВАТЬ Вот некоторые фрагменты пом:

Родитель:

<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>
   <prerequisites>
      <maven>2.0.9</maven>
   </prerequisites>
   <modules>
    <module>sub-project1</module>
    <module>sub-project2</module>
   </modules>
 ....

суб-project1:

<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">
  <parent>
    <artifactId>parent</artifactId>
    <groupId>mygroup</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>sub-project1</artifactId>
....

суб-project2:

<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">
  <parent>
    <artifactId>parent</artifactId>
    <groupId>mygroup</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

   <artifactId>sub-project1</artifactId>

    <dependencies>
     ....
       <dependency>
          <artifactId>sub-project2</artifactId>
          <groupId>mygroup</groupId>
          <version>1.0-SNAPSHOT</version>
          <scope>import</scope>
      </dependency>
  </dependencies>

Ошибка, которую я получаю, когда получаю mvn clean install от родителя:

[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure

При большом количестве классов / пакетов не найдено ошибок

Ответы [ 3 ]

18 голосов
/ 06 апреля 2010

У вас должен быть мастер-класс на уровне родителей, в котором вы будете перечислять модули вашего проекта.

  <modules>
    <module>sub-project1</module>
    <module>sub-project2</module>>
  </modules>

В каждом подпроекте вы должны указать своего родителя:

<parent>
    <artifactId>parent</artifactId>
    <groupId>mygroup</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

И вы указываете зависимости между проектом так же, как и вы. Я думаю, что вы пропустили некоторые шаги, которые я описал.

Редактировать: вы должны выполнить mvn clean install на родительском уровне.

9 голосов
/ 06 апреля 2010

Когда я делаю это, Maven пытается загрузить файл sub-project1.jar, который не существует, поскольку он еще не готов к репо.

Это нормальное поведение, Maven разрешает зависимости через локальный репозиторий, поэтому сначала вам нужно install sub-project1. На самом деле, обычный способ справиться с подобной ситуацией - запустить сборку реактора (сборку из нескольких модулей) из родительского узла.

Предполагается, что вы агрегируете модули в родительском объекте, т.е. у вас есть что-то вроде этого, объявленное в "родительском" pom.xml:

<modules>
  <module>sub-project1</module>
  <module>sub-project2</module>>
</modules>

Просто cd в родительский каталог и запустите сборку реактора:

$ cd parent
$ mvn install

Затем Maven вычислит порядок сборки (вычитается из ориентированного графа, составленного из модулей и их зависимостей) и запустит install на всех модулях в вычисленном порядке (сначала родительский) затем подпроект1 и, наконец, подпроект2 для вашего конкретного примера).

Но не используйте scope типа import, вы его здесь неправильно используете. Убери это.

Обновление: Вопрос был обновлен, когда я отвечал, и показанные POM не иллюстрируют ситуацию, описанную в исходном вопросе (обратная зависимость, вероятная ошибка в идентификаторе артефакта). Но предложенный подход все еще применяется. Удалите <scope>import</scope> на зависимости и начните сборку реактора с родительского.

0 голосов
/ 06 апреля 2010

И Паскаль, и Максимилиано правы. Когда я получил все фрагменты POM, я заметил, что мои модули смешаны - sub-project2 был до sub-project1. Я переключил их, и все равно получил класс не найденных ошибок. Я вынул прицел, как предложил Паскаль, и это сработало.

Спасибо за помощь новичку в Maven.

...