首页 > 解决方案 > JVM 的 JSON Web 令牌支持是否包括 impl、api 和 jackson?

问题描述

我需要在 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-implJJWT 保证除了.jar之外的所有工件的语义版本兼容性。对 .jar没有此类保证,并且该jjwt-impl.jar 中的内部更改可能随时发生。永远不要将jjwt-impl.jar 添加到您的项目中compile- 始终使用runtime范围声明它。

了解 JJWT 依赖项

标签: javajwttoken

解决方案


在 JJWT 版本 0.10.0 之前,io.jsonwebtoken:jjwt-apiio.jsonwebtoken:jjwt-impl都被打包为单个工件,io.jsonwebtoken:jjwt.

随着 JJWT 版本 0.10.0 的发布,这些已分为两个不同的工件。

来自JJWT 发行说明 0.10.0 版的发行说明:

向后兼容性通知:

JJWT 的新模块化设计利用了编译和运行时依赖项之间的区别,以确保您只依赖在您的应用程序中可以安全使用的公共 API。所有内部/私有实现类都已移至新的 jjwt-impl 运行时依赖项。

如果您过去依赖于任何内部实现类,您有两种选择:

重构您的代码以使用 jjwt-api .jar 中的仅公共 API 类和接口。您可能在内部实现中使用的任何功能都应该可以通过该 .jar 中更新的更干净的接口和帮助程序类获得。

指定新的 jjwt-impl .jar 不是作为运行时依赖项,而是作为编译依赖项。这将使您升级到 JJWT 0.10.0 完全向后兼容,但您需要自行承担风险。JJWT 将在 jjwt-impl .jar 中做出任何语义版本兼容性保证。但是,在所有其他 JJWT 依赖项中都将非常小心地遵守语义版本控制。


推荐阅读