【问题标题】:How to configure a subproject dependency in Maven without deploying jars?如何在不部署 jars 的情况下在 Maven 中配置子项目依赖项?
【发布时间】:2010-04-06 13:42:19
【问题描述】:

我用谷歌搜索了这个,似乎没有人有答案,但它似乎是一件很简单的事情,应该是可能的。

我的项目结构如下:

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 做好准备。

我尝试在依赖项中添加 &lt;scope&gt;import&lt;/scope&gt;,但这也不起作用——结果相同。

那么在构建 sub-project2 时,我必须做些什么才能让 Maven 查看 sub-project1?

编辑这里有一些 pom sn-ps:

家长:

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

子项目1:

<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

有很多类/包未找到错误

【问题讨论】:

  • 您是否指定了子项目的 groupId 和版本?而且您不需要导入范围。

标签: maven-2 module subproject


【解决方案1】:

您应该有一个父级的主 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

【讨论】:

  • 不,我有这一切。但我知道我遗漏了一些东西,所以我会发布一些 pom sn-ps。
  • 您不需要使用导入范围。我已经在毫无问题地使用多模块项目,发布您的 POM 以便我们看看! :)
  • 其实不必引用父级(即使这种情况最常见),继承和聚合是分离的概念
  • 在我的情况下,当我尝试将 submodule1 类用于我的 submodule2 时,我在 submodule1 类中遇到错误,就好像找不到它所需的依赖 jar...有什么建议吗?
  • 我的情况有点类似,但我需要父项目中的子项目1依赖。我有父项,依赖项设置与此处完全相同。关于我们如何解决这个问题的任何线索?让我知道我是否应该在这里发布 poms。
【解决方案2】:

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

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

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

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

只需 cd 进入父目录并启动反应堆构建:

$ cd parent
$ mvn install

Maven 随后将计算构建顺序(从由模块及其依赖项组成的有向图中扣除)并按计算顺序在所有模块上运行install (首先是父级,然后是 sub-project1,最后是 sub-project2 用于您的特定示例)。

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

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

【讨论】:

  • 在我的情况下,当我尝试将 submodule1 类用于我的 submodule2 时,我在 submodule1 类中遇到错误,就好像找不到它所需的依赖 jar...有什么建议吗?
猜你喜欢
  • 2015-02-07
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2015-08-11
相关资源
最近更新 更多