我有一个主项目和一个公共项目,它有一个依赖关系,不在任何存储库中,需要使用<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在commons和main项目中。
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文件…