【问题标题】:Basic maven question: Does maven transitively install dependencies?基本的 maven 问题:maven 是否会传递安装依赖项?
【发布时间】:2019-04-06 07:50:05
【问题描述】:

我在这里查看过https://blog.packagecloud.io/eng/2017/03/09/how-does-a-maven-repository-work/,似乎确实如此。

但是,我尝试使用 mvn install 进行试验,但不确定它是否按预期工作。这就是我所做的

(1) 我创建了一个库。

(2) 从命令行运行 mvn install

(3) 复制了我新创建的jar的路径

(4) 打开一个新的maven项目,将路径粘贴到我的pom.xml中

我可以重用我的库方法,但是:我的一个库方法返回一个 TransportClient,它是 elasticsearch api 的一部分。在我的新项目中使用 intellij,即使我引用了 jar,我似乎也没有 elasticsearch

这是预期的吗?当它引用我的 jar 时,我希望它能够传递安装 elasticsearch

我想要一个或两个正确方向的指针,我对此完全陌生。 :)

我的 pom.xml 用于使用 elasticsearch 作为依赖项的库。

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <groupId>estutorial</groupId>
    <artifactId>estutorial</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>6.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.4.2</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>

    </dependencies>

</project>

我的 pom.xml 用于尝试引用上述 pom.xml 的 lib 的新 maven 项目:

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <properties>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
    </properties>


    <groupId>sth</groupId>
    <artifactId>sth</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.4</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>estutorial</groupId>
            <artifactId>estutorial</artifactId>
            <version>1.0</version>
            <scope>system</scope>
            <systemPath>/home/dell/.m2/repository/estutorial/estutorial/1.0-SNAPSHOT/estutorial-1.0-SNAPSHOT.jar
            </systemPath>
        </dependency>
    </dependencies>

</project>

【问题讨论】:

    标签: java maven build dependencies package


    【解决方案1】:

    没有。 mvn install 是一个几乎没用的命令。它将一个 jar 文件填充到您的本地存储库中,以供其他 maven 构建随后使用。您使用术语“路径”。如果您运行 mvn install:install-file 将 jar 放入本地 repo 的某个坐标下,您可以从另一个 pom 引用这些坐标;但与将 jar 部署到适当的存储库管理器相比,它通常会导致未来的问题。

    【讨论】:

      【解决方案2】:

      那么,如果我理解您的步骤,您在引用应用程序中的依赖声明使用本地存储库中 jar 文件的直接类路径?如果是这样,这是不寻常的。您不需要知道 Maven 项目的任何依赖项的直接文件位置。你应该做什么。

      在引用的项目(需要 Elasticsearch 库的项目)中,它的 pom.xml 文件将定义 elasticsearch 依赖项本身。这应该遵循依赖声明的 maven 标准(groupId、artifactId 和 artifactVerion)。如果您没有 elasticsearch 工件,maven 将尝试找到它并将其存储在您的本地存储库中。你的 pom.xml 文件中不应该有任何路径。

      当您安装引用的项目时,它会将 JAR 文件和 pom.xml 都安装到您的本地存储库中。

      在引用项目中,您应该在它的 pom 文件中定义对引用工件的依赖关系。相同的格式:groupId、artifactId 和 artifactVersion。您不需要提供特定路径。 maven 会做的是找到您引用的 jar,但还使用已安装的 POM.xml 文件为引用的 jar 找到传递依赖项并将它们包含在您的类路径中。

      根据您的描述,您的依赖声明不正确。如果您可以提供您的 POM 文件,则可以提供更多详细信息。否则,review the maven intro to dependencies

      【讨论】:

      • 感谢您的指点,我会更仔细地查看文档。
      • 查看添加的pom文件,第一个看起来OK。从该项目中,只需运行 mvn install (而不是 install-file)。这将安装您的工件,它是 POM 文件。在第二个 pom 中,丢失从依赖声明到教程工件的范围和 systemPath。并将版本设置为 1.0-SNAPSHOT (not 1.0)。那应该会拾取传递依赖项。因为您正在定义一个可能不存在的 1.0 版本(因为您可能没有执行其他模块的非快照版本),这就是它找不到任何东西的原因。
      • 感谢工作!去看看为什么它会通过这些变化来获得传递的部门......
      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 2019-01-25
      • 2013-02-17
      • 2017-04-21
      • 1970-01-01
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多