在寻找关于堆栈溢出的信息时,我看到了一个类似于我的问题,但没有真正的答案这里。
我需要将我的maven项目从番石榴11.0.2迁移到番石榴14或更高版本(我需要RangeSet)。我用依赖项更新了maven pom:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0</version>
</dependency>然后运行maven构建,并得到以下错误:
[ERROR] xxx.java: cannot find symbol
[ERROR] symbol : class Nonnull
[ERROR] location: package javax.annotation我仔细看了一下,这个注释是与JSR305一起提供的,它依赖于番石榴11.0.2,正如mvn存储库报告的那样。
我发现奇怪的是,番石榴14也依赖于JSR305,mvn存储库报道。
如果我将JSR依赖项添加到我的pom中,那么编译就运行得很好:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
<scope>provided</scope>
</dependency>但是,如果番石榴已经依赖于它,我为什么要将这种依赖添加到我的pom中呢?这看起来更像是一个解决办法,而不是一个解决方案,我更愿意理解并使事情变得清晰。
谢谢你的参与。
发布于 2014-06-17 12:51:10
您需要将其添加为依赖项的原因是,Guava 14将其pom中的依赖定义为:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
<scope>provided</scope>
</dependency>您的问题的重要部分是<scope>provided</scope>行。
在maven 网站中,它们声明了有关provided依赖项的以下内容:
提供了:这很像
compile__,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为构建web应用程序时,您将将对Servlet和相关Java的依赖设置为provided范围,因为web容器提供了这些类。此范围仅在编译和测试类路径上可用,且不可传递。
因此,基本上,因为番石榴已经将其设置为provided依赖,所以他们希望无论是谁在消费番石榴,都会提供这种依赖,这正是您必须做的。
在Guava11.0.2中,它是一个普通的compile依赖项,因此您不必在自己的项目中提供它。
改变是在番石榴13。来自发布说明。
使findbug成为一个提供的依赖项,以避免在使用findbug 2.0时发生dep冲突。这一变化的副作用是,依赖番石榴授权“免费”访问JSR-305注释的项目将中断,除非它们提供自己对该jar (或等效的)的直接依赖。项目应该一直直接依赖于JSR-305 (每个maven最佳实践),但是这种改变应该成为必须的。
https://stackoverflow.com/questions/24263673
复制相似问题