【问题标题】:Optional system dependency causes "invalid, transitive dependencies (if any) will not be available"可选的系统依赖导致“无效的传递依赖(如果有)将不可用”
【发布时间】:2016-12-15 03:37:21
【问题描述】:

我有一个主项目和一个公共项目,它们的依赖项不在任何存储库中,需要包含using <scope>system</scope>

因为系统依赖是使用相对 url 使用 maven 属性 ${project.basedir} 定义的,所以我 made it <optional>true</optional> 这样它就不会打扰其他项目,因此依赖项目需要用正确的路径重新定义这个依赖。

Common pom.xml:

<dependency>
    <groupId>thirdparty-group</groupId>
    <artifactId>artifact</artifactId>
    <version>1.4.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/dependency.jar</systemPath>
    <optional>true</optional>
</dependency>

在主项目的 pom 中:

<dependency>
    <groupId>my-group</groupId>
    <artifactId>commons</artifactId>
    <version>1.0-SNAPSHOT</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>thirdparty-group</groupId>
    <artifactId>artifact</artifactId>
    <version>1.4.2</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/dependency.jar</systemPath>
</dependency>

显然dependency.jar 在commonsmain 项目中。

commons jar 可以顺利安装。但是,当在主项目中使用时,结果是:

[警告] my-group:commons:jar:1.0-SNAPSHOT 的 POM 无效,传递依赖项(如果有)将不可用:为 my-group:commons 构建有效模型时遇到 1 个问题: 1.0-快照

[ERROR] 'dependencies.dependency.systemPath' for thirdparty-group:artifact:jar 必须指定绝对路径,但为 ${project.basedir}/lib/dependency.jar @

构建继续,但传递运行时依赖项现在不包括破坏应用程序。

为什么 maven 抱怨公共依赖项甚至与主项目无关(因为它是 optional,为什么它甚至包含为传递依赖项)? 如何解决这个问题?

不幸的是,将系统依赖项放入 repo 不是一种选择。

【问题讨论】:

  • 此类问题的最简单解决方案是简单地安装存储库管理器并在那里安装此类工件。你很好......不需要定义系统范围的依赖关系......

标签: java maven


【解决方案1】:

通过 @PascalThivent's excellent answer,我通过在 commons 项目中定义一个本地 repo 来解决这个问题,然后使用 &lt;optional&gt;true&lt;/optional&gt; 将范围更改为 compile

在公共 pom.xml 中:

<dependencies>
    <dependency>
        <groupId>thirdparty-group</groupId>
        <artifactId>artifact</artifactId>
        <version>0.0.1</version>
        <scope>compile</scope>
        <optional>true</optional>
    </dependency>
</dependencies>

<repositories>
    <repository>
        <id>local-repo</id>
        <url>file://${basedir}/lib/local-repo</url>
    </repository>
</repositories>

安装库:

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \
             -Dfile=./lib/dependency.jar \ 
             -DgroupId=thirdparty-group \ 
             -DartifactId=artifact \ 
             -Dversion=0.0.1 \
             -Dpackaging=jar \
             -DlocalRepositoryPath=.\lib\local-repo

我可以直接将它提交给 VCS,这样其他开发人员就不必每次在结帐时都这样做。

在主项目的 pom.xml 中没有任何变化。它仍然可以使用自己的系统依赖项,或者也可以采用这种方法。这两种方法都适用于出现的 WAR 文件...

【讨论】:

    猜你喜欢
    • 2014-06-28
    • 2018-02-26
    • 2021-12-01
    • 2021-08-18
    • 2014-12-11
    • 1970-01-01
    • 2014-07-26
    • 2013-11-05
    • 2018-07-06
    相关资源
    最近更新 更多