我需要在java中使用依赖JWT来在我的java应用程序中进行安全令牌身份验证。我的问题是。我是否需要单独使用所有3个依赖项:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.0</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.0</version>
<scope>runtime</scope>
</dependency>
或者我可以使用一个包含所有元素的单字符:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
为什么我需要在运行时指定
的作用域注意,上面的依赖声明都只有一个编译时依赖,其余的都声明为运行时依赖。
这是因为JJWT的设计使您只依赖于为您的应用程序中使用的显式设计的api,而所有其他内部实现细节(可以在没有警告的情况下更改)都被降级为仅运行时依赖项。如果您希望确保稳定的JJWT使用和随着时间的推移而升级,这一点非常重要:
JJWT保证除了
jjwt-impl
.jar之外的所有工件的语义版本兼容性。对于jjwt-impl
.jar没有这样的保证,并且该.jar中的内部更改可能随时发生。永远不要用compile
作用域将jjwt-impl
.jar添加到项目中-总是用runtime
作用域声明它。
理解JJWT依赖
在JJWT 0.10.0版本之前,io.jsonwebtoken:jjwt-api
和io.jsonwebtoken:jjwt-impl
都被打包为单个工件io.jsonwebtoken:jjwt
。
在JJWT 0.10.0版本中,这些工件被分成两个不同的工件。
来自JJWT发行说明,版本0.10.0:
注意:向后兼容性
JJWT新的模块化设计利用了编译和运行时依赖项,以确保您只依赖于公共api在应用程序中使用是安全的。所有内部/私实现类已经移动到新的jjwt-impl运行时依赖。如果您过去依赖于任何内部实现类,您有两个选择:
重构你的代码以使用只公开的API类和接口在jjwt-api .jar中。中可能使用的任何功能内部实现应该可以通过更新的cleaner获得.jar中的接口和helper类
指定新的jjwt-impl .jar不是作为运行时依赖项,而是作为编译依赖。这将使您完全升级到JJWT 0.10.0向后兼容,但您需要自担风险。JJWT将做出在jjwt-impl .jar中没有语义版本兼容性保证前进。语义版本控制将非常谨慎地遵守在所有其他JJWT依赖项中。