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

Как настроить суб-проекты maven с взаимозависимостями?

Мне сложно настроить набор связанных проектов maven с взаимозависимостями между ними.

Здесь мой упрощенный случай:

pom.xml     -- parent pom
\base\
    pom.xml
    src\main\java\Base.java     -- this is just a simple class
\derived\
    pom.xml
    src\main\java\Derived.java  -- this is a simple class that needs Base class to compile successfully, and has a main function

Мои цели:

  • уметь компилировать на моей машине все проекты:
    • то есть. mnv clean compile успешна в \
  • уметь компилировать на моей машине только один проект:
    • то есть. mnv clean compile успешна в\base\и\производном\(хотя это может не работать по дизайну: Зависимости между проектами в Maven)
      [edit: нашел ответ для этого: база должна быть опубликована локально до производной в скомпилированном виде: например, в \base, do mvn clean compile install вместо того, чтобы делать только mvn clean compile. Как только это будет сделано, выполнение mvn clean compile в\производном отлично работает. Тем не менее, было бы здорово это сделать, не касаясь глобального состояния, то есть без необходимости устанавливать базу, поэтому, если кто-то знает способ достижения этого, добавьте его в качестве ответа]
  • иметь возможность запускать производный проект на моем компьютере (mvn exec: запустить или эквивалентно) прямо из исходного дерева:
    • то есть. mvn exec:run в\производном\необходимо скомпилировать (если необходимо) и запустить файл производной .jar
  • вариант использования "общего компонента": нажмите базовый артефакт в общий репозиторий, где другие люди могут использовать его как зависимость от maven (т.е. зависимость времени компиляции):
    • то есть. mvn clean compile ??? переместит это в общий репозиторий, указанный в ~/.m2/config.xml
  • пример использования "образ-каталог": нажмите производный артефакт и его параметры в локальный каталог, где он может быть запущен через "java -jar..." или он может отображаться как общий ресурс ftp/http для других людей чтобы получить его. I.e., варианты использования, такие как:
    • mvn clean compile ??? будет толкать output.jar и зависимости (например, base.jar) до ~/.m2/maven.repo/.../, полученные или эквивалентные, а затем я могу cd ~/.m2/maven.repo/.../derived и запустите java -jar derived.jar, чтобы запустить его.
    • mvn clean compile ??? будет выталкивать base.jar в ~/.m2/maven.repo/.../base (или output.jar в соответствующий соответствующий каталог), который уже отображается как точка загрузки через локальную сеть или ftp сервер.

Как я могу сделать цели выше?

Здесь соответствующий раздел из родительского pom:

...
<modelVersion>4.0.0</modelVersion>
<groupId>com.foo</groupId>
<artifactId>parentpom</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<name>parentpom</name>

<modules>
    <module>base</module>
    <module>derived</module>
</modules>
...

Здесь соответствующий раздел из базы pom.xml:

...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.base</groupId>
<artifactId>base</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>base</name>
...

Здесь соответствующий раздел из производного pom.xml:

...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<modelVersion>4.0.0</modelVersion>
<groupId>com.foo.derived</groupId>
<artifactId>derived</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>derived</name>

<dependencies>
    <dependency>
        <groupId>com.foo</groupId>
        <artifactId>base</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>

...

Заранее благодарим вас за помощь.

4b9b3361

Ответ 1

Ваш родительский pom выглядит неплохо, но ваши модули/производные poms не имеют: Есть несколько проблем, которые могут вызвать некоторые проблемы и т.д.

Сначала вы используете разные groupId для производного/базового модуля. Если у вас есть multi-module build, вы не должны этого делать. Кроме того, версия производной/базы наследуется родителем и не должна указываться явно, что означает, что вы должны иметь что-то вроде следующего:

<modelVersion>...</...>
...
<parent>
    <groupId>com.foo</groupId>
    <artifactId>parentpom</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>base</artifactId>
<packaging>jar</packaging>

<name>base</name>

Обычно GroupId унаследован. Но иногда у вас есть большее количество модулей, которые могут быть подмодулями подмодулей, что приводит к такой структуре:

+--- parent (pom.xml)
       +--- mod1 (pom.xml)
              +--- mod11 (pom.xml)
              +--- mod12 (pom.xml)
       +--- mod2 (pom.xml)

В таких случаях сам mod1 является модулем упаковки pom:

<modelVersion>...</...>
...
<groupId>com.company.project<groupId>  
<artifactId>parent</artifactId>
<packaging>pom</packaging>
<modules>
  <module>mod1</module>
  <module>mod2</module>
</modules>

mod1:

<parent>
    <groupId>com.company.project<groupId>  
    <artifactId>parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<groupId>com.company.project.mod1</groupId>
<artifactId>mod1</artifactId>
<packaging>pom</packaging>

<modules>
  <module>mod11</module>
  <module>mod12</module>
</modules>

mod11:

<parent>
    <groupId>com.company.project.mod1</groupId>
    <artifactId>mod1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>mod11</artifactId>
<packaging>pom</packaging>

<modules>
  <module>mod11</module>
  <module>mod12</module>
</modules>

Если вам нужна зависимость между модулями, решение:

<parent>
    <groupId>com.company.project.mod1</groupId>
    <artifactId>mod1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</parent>

<artifactId>mod11</artifactId>
<packaging>jar</packaging>

<dependencies>
  <dependency>
    <!-- This shouldn't be a dep which is packaging: pom -->
    <groupId>${project.groupId}</groupId>
    <artifactId>mod2</artifactId>
    <version>${project.version}</version>
  </dependency>

</dependencies>    

Чтобы скомпилировать весь проект со всеми дополнительными модулями в одном, просто перейдите в родительскую папку и:

mvn clean package

будет компилироваться и т.д. Если вам нравится компилировать только один проект, вы можете сделать это с помощью (от родителя):

mvn -pl mod1

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

mvn -am -pl mod1

Чтобы сделать артефакты доступными для других, самым простым решением является установка диспетчера репозитория и выполните следующие действия:

mvn deploy

Все остальные могут использовать и артефакты как зависимость SNAPSHOT.