如何在不部署jar的情况下在Maven中配置子项目依赖项?

时间:2010-04-06 13:42:20

标签: maven-2 module subproject

我用谷歌搜索了这个似乎没有人有答案,但似乎这样的基本事情应该是可能的。

我有以下项目结构:

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

sub-project2需要将sub-project1作为依赖项。

所以我在sub-project2的pom中有这个:

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

...

当我这样做时,Maven尝试下载sub-project1.jar文件,该文件不存在,因为它还没有为repo做好准备。

我试图在依赖项中添加<scope>import</scope>,但这也不起作用 - 结果相同。

那么在构建子项目2时,我需要做些什么才能让Maven查看子项目1?

编辑以下是一些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/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>
....

子项目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/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 个答案:

答案 0 :(得分:18)

您应该在父级别拥有一个主pom,您将在其中列出项目的模块。

  <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

答案 1 :(得分:9)

  

当我这样做时,Maven尝试下载sub-project1.jar文件,该文件不存在,因为它还没有为repo做好准备。

这是正常行为,Maven通过本地存储库解析依赖关系,因此您首先需要install sub-project1。实际上,处理这种情况的常用方法是从父级启动反应器构建(多模块构建)。

假设您正在聚合父级中的模块,即您在“父级”pom.xml中声明了类似的内容:

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

只需cd进入父目录并启动reactor build:

$ cd parent
$ mvn install

Maven将计算构建顺序(从模块及其依赖项构成的面向图中扣除)并在计算中的所有模块上运行install order(首先是parent,然后是sub-project1,最后是你的特定示例的sub-project2)。

但是不要使用import类型的scope,你在这里滥用它。删除它。

更新:问题在我回答时已更新,显示的POM没有说明原始问题中给出的情况(反向依赖,工件ID中可能存在错误)。但建议的方法仍然适用。删除依赖项上的<scope>import</scope>并从父项启动反应堆构建。

答案 2 :(得分:0)

Pascal和Maximiliano都是对的。得到我的整个pom片段时,我注意到我的模块混合了 - sub-project2在sub-project1之前。我切换了它们,仍然没有找到类错误。我像帕斯卡尔建议的那样取出范围并且它起作用了。

感谢您帮助Maven新手。