可选的系统依赖性导致“无效,传递依赖(如果有)将无法使用”

时间:2016-08-09 07:41:22

标签: java maven

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

因为使用maven属性${project.basedir}使用相对URL来定义系统依赖关系,所以I made it <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位于 commons main 项目中。

公共罐安装正确无故障。但是当在主项目中使用时,结果是:

  

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

     

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

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

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

不幸的是,将系统依赖项放在repo中是不可取的。

1 个答案:

答案 0 :(得分:1)

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

在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=.\lib\local-repo

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

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