代码之家  ›  专栏  ›  技术社区  ›  Daniel Pryden

如何使一个Maven模块依赖于另一个模块?

  •  13
  • Daniel Pryden  · 技术社区  · 15 年前

    好吧,我 思想 我知道如何使用Maven…

    我有一个主项目 M 有子项目的 A , B C . C 包含一些常见的功能(主要是接口),这些功能是 B . 我能跑 mvn compile jar:jar 从项目根目录 目录)和获取JAR文件 A.jar , B.jar C.jar . (所有这些工件的版本当前为 2.0-SNAPSHOT )

    主人 pom.xml 文件 目录列表 C 在其之下 <dependencyManagement> 标签,以便 可以参考 C 只包含一个引用,比如:

    <dependency>
        <groupId>my.project</groupId>
        <artifactId>C</artifactId>
    </dependency>
    

    到目前为止,一切都很好。我能跑 mvn compile 从命令行,一切正常。但是当我在NetBeans中打开这个项目时,它抱怨这个问题:“一些依赖性工件不在本地存储库中”,并且它说丢失的工件是 C . 同样从命令行,如果我改为 B 目录并尝试运行 编译 我得到“构建错误:未能解决项目”。

    我想我可以手动去我的 C.JAR 建造和运行 mvn install:install-file 但我更愿意找到一种解决方案,使我能够直接在NetBeans(和/或使用M2Eclipse的Eclipse)中工作。

    我做错什么了?

    4 回复  |  直到 11 年前
        1
  •  23
  •   Pascal Thivent    15 年前

    Maven依赖于二进制依赖性的概念,并通过本地存储库解析它们。换句话说,如果本地存储库中的包之间存在依赖关系,则需要在本地存储库中“安装”这些包,编译和打包代码是不够的。要做到这一点,你需要跑 install (那样) 将包安装到本地存储库中,作为本地其他项目的依赖项使用 )

    旁注:你不应该调用 mvn compile jar:jar 但更喜欢 mvn package . 首先,运行 package 相位将触发之前的所有相位 包裹 (包括) compile ) 包裹 本身。第二,运行 包裹 将调用 jar:jar war:war 等等,取决于 <packaging> 项目的价值(检查 introduction to the lifecycle 有关详细信息)。这是Maven的一大优势:您不需要知道项目是否是一个jar、一场战争、一个EJB等,并且运行适当的目标来打包它。只需运行标准化 包裹 Phase和Maven将完成这项工作(使用默认的目标绑定)。

    这是关于Maven理论的部分。在IDES中,为了使与Maven的工作更加方便,可能会有一些不同。IDE可以使用 项目依赖项 (即对IDE内代码的依赖)而不是二进制依赖,这样一个项目中所做的更改在其他模块中可见,而不必运行 mvn install . 这是eclipse+m2eclipse的情况。在以下条件下,这也适用于NetBeans(请参见 Dependency Management ):

    提示: 如果你打开另一个项目 项目依赖,图标在其他 项目更改为“Maven项目” 表示IDE知道的图标 关于项目之间的链接。 然而,这种联系只是 当groupid ArtifactID和版本都匹配 依赖关系和项目 宣言。经常发生 问题是您更改了API 在你的图书馆项目中签名,但是 申请没有收到。 通常是由于 应用程序正在使用旧版本 图书馆的文物。伪影 图标可以帮助您跟踪这些 问题。

        2
  •  6
  •   Ken Liu    15 年前

    你需要跑步 mvn install 而不是 mvn compile .这个 install 目标将在编译和打包后将构建的JAR复制到本地存储库中。如果只运行compile,它将只将类文件编译到 target 目录,不可用于其他项目。

    在Eclipse中,如果从顶层导入一个POM,它会将子项目导入到单独的Eclipse项目中,并设置相关项目的依赖项,然后设置每个项目的类路径以依赖其他项目。我不熟悉Netbeans,但我很确定有什么方法可以做到这一点。

        3
  •  3
  •   mkleint    15 年前

    NetBeans通过本地存储库内容将项目链接在一起,因此在大多数场景中都需要安装MVN。

        4
  •  0
  •   Alfonso Leon    11 年前

    这不是真的,执行部署将完成前面所有的setp…

    请看一下:

    http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html