代码之家  ›  专栏  ›  技术社区  ›  Steven Schlansker

Maven在运行MVN依赖项时无法识别同级模块:树

  •  80
  • Steven Schlansker  · 技术社区  · 15 年前

    我正试图建立一个多模块Maven项目,显然模块间的依赖关系设置不正确。

    我有:

    <modules>
      <module>commons</module>
      <module>storage</module>
    </modules>
    

    在父POM中(具有包装类型POM) 然后是子目录 commons/ storage/ 定义了同名的jar pom。

    存储取决于共享空间。

    在主(主)目录中,我运行 mvn dependency:tree 看看:

    [INFO] Building system
    [INFO]    task-segment: [dependency:tree]
    [INFO] ------------------------------------------------------------------------
    [INFO] [dependency:tree {execution: default-cli}]
    [INFO] domain:system:pom:1.0-SNAPSHOT
    [INFO] \- junit:junit:jar:3.8.1:test
    [INFO] ------------------------------------------------------------------------
    [INFO] Building commons
    [INFO]    task-segment: [dependency:tree]
    [INFO] ------------------------------------------------------------------------
    [INFO] [dependency:tree {execution: default-cli}]
    ...correct tree...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building storage
    [INFO]    task-segment: [dependency:tree]
    [INFO] ------------------------------------------------------------------------
    Downloading: http://my.repo/artifactory/repo/domain/commons/1.0-SNAPSHOT/commons-1.0-SNAPSHOT.jar
    [INFO] Unable to find resource 'domain:commons:jar:1.0-SNAPSHOT' in repository my.repo (http://my.repo/artifactory/repo)
    [INFO] ------------------------------------------------------------------------
    [ERROR] BUILD ERROR
    [INFO] ------------------------------------------------------------------------
    [INFO] Failed to resolve artifact.
    
    Missing:
    ----------
    1) domain:commons:jar:1.0-SNAPSHOT
    

    为什么对“公共资源”的依赖失败了,即使反应堆已经明显地看到了它,因为它成功地处理了它的依赖树?它肯定不会去网上找它,因为它就在那里…

    存放POM:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <modelVersion>4.0.0</modelVersion>
      <packaging>jar</packaging>
      <parent>
        <artifactId>system</artifactId>
        <groupId>domain</groupId>
        <version>1.0-SNAPSHOT</version>
      </parent>
      <groupId>domain</groupId>
      <artifactId>storage</artifactId>
      <name>storage</name>
      <url>http://maven.apache.org</url>
      <dependencies>
        <!-- module dependencies -->
        <dependency>
          <groupId>domain</groupId>
          <artifactId>commons</artifactId>
          <version>1.0-SNAPSHOT</version>
        </dependency>
    
        <!-- other dependencies -->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    </project>
    

    谢谢你的建议!

    (编辑)

    为了澄清,我在这里寻找的是:我不想安装模块x来构建依赖于x的模块y,因为这两个模块都是从同一个父pom引用的。这对我来说很直观,如果我在同一个源代码树中有两个东西,我就不必安装中间产品来继续构建。希望我的想法有点道理…

    6 回复  |  直到 6 年前
        1
  •  17
  •   Bostone    15 年前

    我认为问题在于,当您指定依赖关系时,Maven希望将其作为JAR(或其他)打包,并且至少可以从本地回购获得。我相信如果你跑的话 mvn install 在你的公共项目中,首先一切都会工作。

        2
  •  90
  •   Beryllium    7 年前

    正如在 this maven mailing list thread 依赖关系:树目标本身将在存储库中查找内容,而不是在反应堆中查找内容。你可以通过安装MVN来解决这个问题,正如前面建议的那样,或者做一些不那么麻烦的事情来调用反应堆,比如

    mvn compile dependency:tree
    

    为我工作。

        3
  •  6
  •   Newtopian    13 年前

    意识到这是一个较旧的线程,但似乎是工具的发展,或者这可能是第一次错过。

    可以执行一个构建,通过执行一个反应器构建来解决依赖关系,而无需安装。

    如果在描述项目模块结构的父级中启动构建,那么在构建期间,模块之间的依赖关系将通过内部Maven反应器解决。

    当然,这不是完美的解决方案,因为它不能解决结构中单个模块的构建问题。在这种情况下,Maven在他的反应堆中将不具有依赖性,并且将在存储库中寻求解决它。因此,对于单个构建,您仍然必须首先安装依赖项。

    这里有一些 reference 描述这种情况。

        4
  •  3
  •   bsautner    12 年前

    对我来说,导致我进入这个线程的是一个类似的问题,解决方案是确保所有的模块依赖POM都有

     <packaging>pom</packaging>
    

    父母有

    聚甲醛

    我的模型DEP有聚甲醛-所以没有找到罐子。

        5
  •  3
  •   mba    9 年前

    唯一对我有用的事情:切换到Gradle:(

    我有

    Parent
      +---dep1
      +---war1 (using dep1)
    

    我可以在war1中使用cd,并使用mvn tomcat7:run war。 我以前总是要安装整个项目,尽管war1引用了他的父级,而父级引用了war1和dep1(作为模块),所以所有依赖项都应该是已知的。

    我不明白是什么问题。

        6
  •  -1
  •   Nitin Kamate    6 年前

    确保失败的模块在POM中得到解决,通过在模块的POM文件中包含配置来指向正确的父级。