为了您的信息,我是Maven环境的新手,并且不熟悉Java开发。
首先,我写了一个使用org.apache.httpcomponents:httpclient:4.3.6
的项目。它运行良好,完全没有问题。我将源代码(Java文件)放入另一个使用Maven配置的Eclipse Web项目中。所以我在pom.xml
中添加了一个依赖项,并且它已成功编译。但是当我运行它时出现了一个问题。它说java.lang.NoSuchFieldError
。经过多次尝试并失败后,我得出结论,这是由版本问题引起的。
pom.xml
中的依赖关系:
<dependencies>
<dependency>
<groupId>net.generalsvc</groupId>
<artifactId>ubi.base.bin</artifactId>
<version>2.1.0-SNAPSHOT</version>
</dependency>
...
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.3.6</version>
</dependency>
</dependencies>
net.generalsvc:ubi.base.bin
包含org.apache.http:httpclient:4.2.1
的依赖关系。所以结果依赖层次结构如下所示。
我认为我的代码是引用'4.2.1'版本而不是'4.3.6'版本。如何将“4.3.6”版本分配给我的Java文件?我可以通过为我的代码添加httpclient:4.3.6
来保留项目现有的依赖性吗?
答案 0 :(得分:1)
这将从maven构建中排除特定
<dependency>
<groupId>net.generalsvc</groupId>
<artifactId>ubi.base.bin</artifactId>
<version>2.1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.apache.http</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
</exclusions>
</dependency>
答案 1 :(得分:1)
Maven使用“距离”度量来决定使用哪个依赖项。该度量是每个pom.xml的一步(pom.xml中的依赖项为1,依赖于这些依赖项的pom是2,等等),并且包含的更近,所以如果你在pom.xml中包含一个版本,这是正在使用的。
相同的依赖项(相同的groupId和artifactId)不能与两个不同的版本一起使用,因此您无法保留依赖项的依赖项并包含其他版本。