我有一个主项目和一个公共项目,它有一个不在任何存储库中的依赖项,需要包含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中是不可取的。
答案 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文件......