【问题标题】:How Maven looks for dependenciesMaven 如何查找依赖项
【发布时间】:2018-02-23 11:55:59
【问题描述】:

我已经阅读了很多关于 Maven 入门的文档和教程。但是我仍然不清楚一些事情:

1) 当 pom.xml 包含 <dependency> 时,Maven 会将那个工件/JAr 放入 Maven 本地存储库中。对吧?

2) 假设,我的 MAven 项目中有子模块。那么构建项目的正确方法是什么?一个应该从父模块开始,然后去进一步的子模块。正确的 ?这样maven会创建依赖jar并将它们放在本地Maven Repo文件夹中?

3) 例如,如果我的子模块 pom.xml 包含以下依赖项。我应该如何将它(vd-ps.jar)提供给 Maven,以便当我在 Submodule/pom.xml 上执行 Maven 全新安装时 Maven 找到它?我的意思是说 Maven 需要什么或者它从哪里生成这样的用户定义的 vd-ps.jar ?来自编译的类文件?

<dependencies>
    <dependency>
        <groupId>com.b.t</groupId>
        <artifactId>vd-ps</artifactId>
        <version>1.1.0</version>
    </dependency>
  </dependencies>

好的,我直接问我想要实现什么:我有以下pom.xml。并从中我想创建一个单独的 maven 项目(说 PTest),它使用另一个大型多模块 maven 项目的依赖项(jar)。这里:-我的多模块项目中有一个名为 v-parent 的模块,它的主干文件夹中有 pom.xml。

<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>
    <groupId>com.b.t</groupId>
    <artifactId>v-parent</artifactId>
    <version>3.9.0</version>
  </parent>


    <groupId>com.b.t.test</groupId>
      <artifactId>p_test</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>ptesting</name>
      <dependencies>
        <dependency>
            <groupId>com.b.t</groupId>
            <artifactId>v-ps</artifactId>
            <version>1.1.0</version>
        </dependency>
      </dependencies>
    </project>

1) 现在我应该把这个子模块 v-parent 放在我在 eclipse 中新创建的 Maven 项目 (PTest) 的什么位置?

我的意思是如何让我的 PTest/pom.xml 找到这个父 jar v-parent.jar?

我有一个名为 v-ps.jar 的单独 jar 文件。我应该将它准确地放在 Maven 本地仓库中的哪个位置(在哪个结构中)以便它可以找到它?

【问题讨论】:

    标签: java maven pom.xml


    【解决方案1】:

    每次跑步

    mvn clean install
    

    您的项目将被构建,生成的工件将被“安装”在您的本地存储库(通常是 ~/.m2/repository)中。因此,如果您构建的项目使 jar 为 com.b.t:vd-ps:1.1.0,那么它将在您的本地存储库中可供其他项目用作依赖项。

    如果您的依赖项位于同一父级下的另一个模块中,则可以像这样包含:

    <dependency>
      <groupId>com.b.t</groupId>
      <artifactId>vd-ps</artifactId>
      <version>${project.version)</version>
    </dependency>
    

    如果你运行一个

    mvn clean deploy
    

    如果您的 pom.xml 中有正确的配置,您的工件将被构建并部署到远程存储库(Nexus 或 Artifactory 或类似)

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

    【讨论】:

    • if 说我无法解析工件:com.btvd-ps:1.1.0 等,我检查它是否存在于 ~/.m2/repository/b/t/vd- ps/1.1.0/vd-ps-1-1-0.jar.lastupdated 知道为什么找不到它吗?
    • .jar.lastupdated 不是 JAR,只是一个标记文件。
    • 我建议您删除目录 ~/.m2/repository/com/b/t/vd-ps/1.1.0 并为该项目重新运行 mvn 构建,然后检查您是否有jar 文件没有像@Tome 所说的那样有制造商文件。
    • 对不起,有一个基本问题,当我在 maven 项目中进行 maven clean install 时,项目中必须有类和 pom.xml,它将根据 pom 创建 jar 文件。 xml 规范,并将放入 maven 存储库。那是对的吗 ?所以例如。只需在只有 pom.xml 的文件夹中执行 maven clean install,它只会在 repo 中创建一个标记文件。那正确吗 ?请纠正我或向我澄清。
    • @Ragini 是的,maven 项目通常包含源代码和对其他 jar 的依赖项。
    【解决方案2】:

    1) 现在我应该将这个子模块 v-parent 放在我在 eclipse 中新创建的 Maven 项目 (PTest) 的什么位置? 我的意思是如何让我的 PTest/pom.xml 找到这个父 jar v-parent.jar ?

    所以在这种情况下,“v-parent”将是 Eclipse 中另一个打包类型为“pom”的项目。如果您想构建子项目“p_test”及其依赖项“v-ps”,您可以将它们列为“v-parent”项目的 pom 文件中的模块,如下所示:

    <project>
      <groupId>com.b.t</groupId>
      <artifactId>v-parent</artifactId>
      <version>3.9.0</version>
      <packaging>pom</packaging>
    
      <modules>
        <module>p_test</module> <!-- Make sure you provide the right path here -->
        <module>v-ps</module> <!-- Make sure you provide the right path here -->
      </modules>
    </project>
    

    现在,当您在“v-parent”上运行“mvn clean install”时,它应该构建“p_test”和“v-ps”项目,并将其 jar 文件的副本放在本地 .m2/repository 中,假设这些项目不要在构建过程中出错。因此,父项目就像子项目的聚合一样,有助于一次性构建所有项目。

    我有一个单独的 jar 文件,名为 v-ps.jar。我应该将它准确地放在 Maven 本地仓库中的哪个位置(在哪个结构中)以便它可以找到它?

    如果你有这个项目的源代码,那么你应该将它作为“v-parent”项目的 pom 的一部分作为我上面提到的模块包含在内,并且当你构建父级时,如果成功,jar 就会被写入到您当地的 .m2 存储库。或者,如果您有“v-ps”项目的源代码,您可以使用“mvn clean install”直接构建它,jar 将被写入 repo。

    【讨论】:

      猜你喜欢
      • 2016-05-24
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 2016-10-01
      相关资源
      最近更新 更多