三级pom(公司 - 项目 - 模块) - 模块项目的问题

时间:2012-03-24 21:39:58

标签: maven pom.xml multi-module

我正在使用带有m2e的Eclipse Indigo(它连接到Maven 3.0.3的外部二进制文件)。

目前,我的应用程序的预期结构如下:

Company-parent
--Project-parent
----Module1
----Module2
----ModuleN

我设置了我的poms,使得Company-parent是Project-parent的项目,而Project-parent是所有模块的父项。公司父母和项目父母似乎没问题。两者都是包装类型POM。

第三级是我开始遇到问题的地方。即使最简单的模块项目被定义,我也会遇到各种各样的maven错误和各种奇怪的行为。

公司母公司:

<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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.scoresecret</groupId>
  <artifactId>scs-global-parent</artifactId>
  <version>1</version>
  <packaging>pom</packaging>

</project>

项目家长:

<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">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <artifactId>scs-global-parent</artifactId>
    <groupId>com.scoresecret</groupId>
    <version>1</version>
  </parent>

  <artifactId>scs-model-parent</artifactId>
  <groupId>com.scoresecret.model</groupId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <modules>
    <module>scs-model-core</module>
  </modules>

</project>

模块pom:

<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">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <artifactId>scs-model-parent</artifactId>
    <groupId>com.scoresecret.model</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>scs-model-core</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>jar</packaging>

我无法做“Maven - &gt;更新项目配置”,因为当我这样做时,我收到此错误:

Failure to find org.apache.maven.plugins:maven-resources-plugin:pom:2.4.3 in https://my.archiva.location/archiva/repository/internal was cached in the local repository, resolution will not be reattempted until the update interval of scs.internal has elapsed or updates are forced pom.xml /scs-model-core line 1  Maven Configuration Problem

我收到的其他一些错误:

Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.4.3 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-resources-plugin:jar:2.4.3 pom.xml /scs-model-core line 1  Maven Build Problem

同时收到有关m2e的错误,忽略了我在模块中的一个插件目标(来自公司级别的pom)。我错过了一些明显的东西吗?救命啊!

谢谢:)

4 个答案:

答案 0 :(得分:3)

您不应该像目录结构中描述的那样找到工件。

+-- Company-parent (pom.xml)
      +-- Project-parent (pom.xml)
            +----Module1 (pom.xml)
            +----Module2 (pom.xml)
            +----ModuleN (pom.xml)

为了真正好好利用你的公司 - 父(pom.xml),它应该在版本控制中进入一个独立的区域并在你的资源库管理器中单独发布(nexus,artifactory,archiva ......)。这将产生以下结构:

+-- Company-parent (pom.xml) (Separate Project)

公司父母应该根据需要通过release-plugin发布。让我们假设我们已经发布了公司的父版本1.0。将它分开的原因是,因为公司父母被许多项目使用,而不仅仅是一个项目。

并且真实的项目应该放在一个单独的文件夹中(也在版本控制中):

+-- Project-parent (pom.xml)
     +----Module1 (pom.xml)
     +----Module2 (pom.xml)
     +----ModuleN (pom.xml)

因此,要在项目中使用company-parent,项目父项必须如下所示:

<project....>
 <modelVersion>4.0...</modelVersion>

<parent>
  <artifactId>company-parent</artifactId>
  <groupId>com.company.base</groupId>
  <version>1.0</version>
</parent>

<packaging>pom</packaging>

<groupId>com.company.project1</groupId>
<artifactId>project-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
...
<dependencyManagement>
 <!-- Project specific dependencies -->
</dependencyManagement>
<build>
  <pluginManagement>
    <plugins>
      <!-- Project specific plugins. Better use them of the company pom -->
    </plugins>
  </pluginManagement>
</build>
<modules>
  <module>module1</module>
  <module>module2</module>
  <module>moduleN</module>
</modules>
..

现在让我们看看一个看起来像这样的模块:

<project....>
 <modelVersion>4.0...</modelVersion>

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

<packaging>jar</packaging>

<artifactId>module1</artifactId>

<dependencies>...</dependencies>
<build>..</build>

答案 1 :(得分:0)

您应该使用显式路径引用父pom:

<parent>
  <artifactId>scs-model-parent</artifactId>
  <groupId>com.scoresecret.model</groupId>
  <version>1.0-SNAPSHOT</version>
  <relativePath>../pom.xml</relateivePath>
</parent>

否则,每次更改时都需要将父pom重新安装到存储库中。

答案 2 :(得分:0)

听起来像maven无法从存储库https://my.archiva.location/archiva/repository/internal下载插件(org.apache.maven.plugins:maven-resources-plugin:pom:2.4.3)

未能找到org.apache.maven.plugins:maven-resources-plugin:pom:https://my.archiva.location/archiva/repository/internal中的2.4.3被缓存在本地存储库中,在更新间隔之前不会重新尝试解析scs.internal已经过去或更新被强制pom.xml / scs-model-core line 1 Maven配置问题

如果您在浏览器中浏览此URL,它是否存在?我看到它正在使用https - 您是否需要客户端证书或某种形式的基本身份验证凭据才能访问此网址?

您的.m2 / settings.xml显示存储库中的当前设置是什么?您是在公司防火墙后面还是没有连接到互联网,迫使您连接到非标准的maven中央存储库?

答案 3 :(得分:0)

事实证明,我的本地存储包含以扩展名“.lastUpdated”结束的文件...这是因为我在尝试加密我的maven密码时遇到身份验证问题,所以它没有下载依赖项。我删除了这些文件,只是简单地运行了“Maven&gt; Update Dependencies”,它没有问题,从我的工件库中下载了缺少的资源。