Maven包括父类

时间:2012-04-05 07:28:57

标签: java inheritance maven

我有一个相当简单的maven-ized Java项目,但我很难理解它。

我的父模块定义了许多我希望对多个子模块有用的Java类(和依赖项)。其中一个子模块专门用于部署Web应用程序,因此它需要一些额外的类(servlet)以及来自父模块的所有内容。

文件结构如下所示

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

我的父母pom看起来像这样:

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

这是否需要让孩子知道父母中定义的类和依赖关系?它似乎不是:eclipse给出编译错误,并且从父文件夹或子文件夹运行 mvn clean package 会在提到父类的任何时候产生“找不到符号”消息。

我做错了什么?

4 个答案:

答案 0 :(得分:14)

我会改变你的项目结构:

  • 父母(pom)
    • 核心(jar,包含以前在父级中的所有类)
    • 孩子(战争,取决于核心)

父:

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

核心:

<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 :(得分:3)

由于您父模块的打包是“pom”,因此不会提供任何jar文件,其他模块也无法访问其中的.class文件。尝试将其更改为“jar”并再试一次。

虽然将父母视为“jar”并不是一个好习惯。我坚持“pom”的父母,可能会创建一个新的“核心”或“普通”孩子,让我的“战争”依赖于它。

答案 2 :(得分:1)

尝试在子模块pom中添加内部依赖项,因此熟悉其父模块

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

答案 3 :(得分: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>