6

Вопрос по java, inheritance, maven – Maven включает родительские классы

У меня довольно простой Java-проект, созданный с использованием технологии mavenisized, но я не могу разобраться с ним.

Мой родительский модуль определяет множество Java-классов (и зависимостей), которые, как я ожидаю, будут полезны для нескольких дочерних модулей. Один из дочерних модулей предназначен для развертывания веб-приложения, поэтому ему нужно несколько дополнительных классов (сервлетов), а также все из родительского модуля.

Структура файла выглядит следующим образом

 - parent
   - src
   - pom.xml
   - child
     - src
     - pom.xml

Мой родительский пом выглядит так:

<project>
  <groupId>my.group</groupId>
  <artifactId>parent</artifactId>
  <version>0.0.1</version>
  <packaging>pom</packaging>

  ...

  <modules>
    <module>child</module>
  </modules>
</project> 

И ребенок выглядит так:

<project>
  <artifactId>child</artifactId>
  <packaging>war</packaging>
  <parent>
    <artifactId>parent</artifactId>
    <groupId>my.group</groupId>
    <version>0.0.1</version>
  </parent>

  ...

</project>

Это все, что мне нужно, чтобы ребенок знал о классах и зависимостях, определенных в parent? Похоже, это не так: eclipse выдает ошибки компиляции и выполняетmvn clean package из результатов родительской папки или дочерней папки & quot; не удается найти символ & quot; сообщения каждый раз, когда упоминается класс от родителя.

Что я делаю неправильно?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от Dave
  • Я & APOS; дmvn clean install на родительском элементе, поэтому все модули создаются автоматически в правильном порядке на основе зависимостей.

    от
  • Кроме того, вам нужно будет выполнить mvn clean install основной проект, прежде чем вы сможете собрать дочерний

    от
  • ура, эта установка работала хорошо.

    от Dave
  • 14

    Я бы изменил структуру вашего проекта следующим образом:

    parent (pom) core (jar, with all the classes that used to be in parent) child (war, depends on core)

    родитель:

    <project>
      <groupId>my.group</groupId>
      <artifactId>parent</artifactId>
      <version>0.0.1</version>
      <packaging>pom</packaging>
    
      <modules>
        <module>core</module>
        <module>child</module>
        <!-- possibly more modules... -->
      </modules>
    </project>
    

    Core:

    <project>
      <parent>
        <groupId>my.group</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1</version>
      </parent>
      <artifactId>core</artifactId>
      <packaging>jar</packaging>
    </project>
    

    Ребенок:

    <project>
      <parent>
        <groupId>my.group</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1</version>
      </parent>
      <artifactId>module1</artifactId>
      <packaging>war</packaging>
    
      <dependencies>
        <dependency>
          <groupId>my.group</groupId>
          <artifactId>core</artifactId>
          <version>${project.version}</version>
        </dependency>
      </dependencies>
    </project>
    

  • 1

    Попробуйте добавить внутреннюю зависимость в дочерний модуль pom

    чтобы он был знаком с его родителем

    <dependency>
       <groupId>my.group</groupId>
       <artifactId>parent</artifactId>
       <version>0.0.1</version>
    </dependency>
    

  • 0

    Первое, что вы должны сделать, это определить ваши зависимости внутри

    dependencyManagmeent заблокировать в вашем родителе, как это:

    <dependencyManagement>
       <dependencies>
         <dependency>
           <groupId>group-a</groupId>
           <artifactId>artifact-a</artifactId>
           <version>1.0</version>
         </dependency>
         ...
       </dependencies>
    </dependencyManagement>
    

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

       <dependencies>
         <dependency>
           <groupId>group-a</groupId>
           <artifactId>artifact-a</artifactId>
           <!-- No version given. See dependencyManagement -->
         </dependency>
         ...
       </dependencies>
    

  • 3

    Поскольку упаковка вашего родительского модуля является "pom"

    файл jar предоставлен не будет, и файл .class из этого не будет доступен для других модулей. Попробуйте изменить его на «jar» и дать ему еще одну попытку.

    Хотя это не очень хорошая практика, чтобы иметь родителя в качестве «jar». Я придерживаюсь "пом" родитель и, вероятно, создать новое «ядро» или "общий" дитя и сделай мою "войну" зависит от этого.