Rém*_*ghe 6 java jsr305 maven guava
在查找stackoverflow的信息时,我看到了一个类似于我的问题,但这里没有真正的答案.
我需要将我的maven项目从番石榴11.0.2迁移到番石榴14或更高版本(我需要RangeSet).我用依赖更新了我的maven pom:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>14.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
然后我运行maven构建,并得到此错误:
[ERROR] xxx.java: cannot find symbol
[ERROR] symbol : class Nonnull
[ERROR] location: package javax.annotation
Run Code Online (Sandbox Code Playgroud)
我仔细看了一下,这个注释是用JSR305提供的,其上依赖于guava 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>
Run Code Online (Sandbox Code Playgroud)
但是,如果guava已经依赖它,为什么我必须将此依赖项添加到我的pom中?这看起来更像是一种解决方法,而不是解决方案,我更愿意理解并使事情变得清晰.
感谢您的参与.
DB5*_*DB5 13
您需要将其添加为依赖项的原因是因为Guava 14在其pom中定义了依赖关系,如下所示:
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
<scope>provided</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
你的问题的重要部分是<scope>provided</scope>线.
从maven 网站,他们在provided依赖关系方面声明如下:
提供: 这很像
compile,但表示您希望JDK或容器在运行时提供依赖关系.例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为范围,provided因为Web容器提供了这些类.此范围仅在编译和测试类路径中可用,并且不可传递.
所以基本上是因为Guava已经将它设置为provided依赖关系,他们希望消费Guava的人能够提供这种依赖,这正是你必须要做的.
在Guava 11.0.2中,它是一个正常的compile依赖,因此您不必在自己的项目中提供它.
更改是在Guava 13中进行的.从发布说明:
使用findbugs 2.0时,为findbugs提供了依赖以避免dep冲突.这种变化的副作用是,依赖于Guava授予"免费"访问JSR-305注释的项目将会中断,除非它们提供自己直接依赖于该jar(或等效的).项目应始终直接取决于JSR-305(每个maven最佳实践),但这种变化使得这应该成为必须.
| 归档时间: |
|
| 查看次数: |
6009 次 |
| 最近记录: |