可选的系统依赖关系会导致"invalid, transitive dependencies (if any) will not be available"



我有一个主项目和一个公共项目,它有一个依赖关系,不在任何存储库中,需要使用<scope>system</scope>

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

Commons 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.0-SNAPSHOT构建有效模型时遇到1个问题

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

继续构建,但现在排除了破坏应用程序的可传递运行时依赖项。

为什么maven抱怨来自公地的依赖关系,甚至与主项目无关(因为它是可选的,为什么它甚至被包含为传递依赖)?如何解决这个问题?

不幸的是,把系统依赖项放在repo中不是一个选项。

通过@PascalThivent的出色回答,我通过在commons项目中定义本地回购来解决这个问题,然后将范围更改为编译<optional>true</optional>

In commons 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=.liblocal-repo

我可以直接把它提交给VCS,这样其他开发人员就不必每次签出时都这样做了。

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

最新更新