Spring Android、Spring Social 和 Spring Security 的 Maven 依赖之舞

工程 | Josh Long | 2013 年 9 月 17 日 | ...

我和 Roy Clarkson (@royclarkson)SpringOne2GX 2013 上做了一个演讲,讨论了如何构建 REST 服务,并着眼于如何在 Android 和 iOS 等移动平台上消费这些服务。本次演讲演示了使用 Spring MVC、Spring HATEOAS、Spring Data REST、Spring Security、Spring Security OAuth 和 Spring Android 构建的应用的渐进式演变。代码得到了 Rob Winch 的很多帮助,

代码布局

演讲的代码在我的 GitHub 账户 (github.com/joshlong/the-spring-rest-stack) 上。重要的是,代码位于 code 目录中。该目录下有两个选项:web(您可以在其中找到 resthateoashateoas-data 以及 oauthsocial 模块)和 client(您可以在其中加载 Android 模块和 iOS 模块)。web 文件夹中的模块按顺序分别展示了一个简单的 REST 服务的发展,该服务集成了超媒体、Spring Data 仓库和 OAuth 安全。social 模块演示了如何构建一个消费该服务的 OAuth 客户端。

构建和编辑代码

该项目目前完全基于 Maven,尽管转向 Gradle 似乎迫在眉睫,因为这是 Google 推荐的 Android 构建方式。我知道 Android 客户端可以使用 IntelliJ IDEA 的 Android 支持导入和构建(理论上这应该在免费提供的 Android Studio 中也能工作)。

依赖之舞与 Android

我们在 构建文件中使用了主要库的最新版本,可供参考。最新,有时甚至是前沿版本。Android 应用使用了 Spring Android 项目,该项目基本上提供了与 Spring core 中 RestTemplate API 兼容的实现。

然而,它并提供整个框架,如果您引入了核心库中的某些部分,您会遇到一些奇怪的问题,因为 Spring Android 模块中的某些类在 Spring Android 和核心库中大致相同,但由于运行环境的不同,它们并非完全相同。确保一切正常的简单方法是明确排除所有 Spring 模块,除了 Spring Android 的依赖项,然后根据需要选择性地重新引入所需的类型。

Spring Android RestTemplate 模块中的类型提供了足够的兼容性,使得 Spring Social 的客户端机制可以在 Android 上不做任何修改地工作。当然,这意味着我们可以在 Android 应用中使用 social 模块中基于 Spring Social 的 OAuth 客户端。太棒了!

例如,虽然我需要 Spring Social 的核心类型和实现,但我不需要它引入的核心 Spring 库。因此,我们得到了这一段颇具戏剧性的内容:

<dependency>    
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-core</artifactId>
    <version>${spring-social.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
        </exclusion>
        <exclusion>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.joshlong.restfuliterations</groupId>
            <artifactId>services</artifactId>
        </exclusion>
    </exclusions>
</dependency>    

这些依赖项可能很难找到。使用 mvn dependency:tree 命令可以查看哪些内容是传递性导入的。Spring Security 是另一个我们想要其顶级类型出现在 CLASSPATH 上的库,它也需要 exclusion 元素,因为它会引入 Spring core。

有些类(如 JAXB)是无法避免的

任何不在 Android JDK 类白名单中的类都无法在 Android 上使用,因此依赖它的代码将不兼容。有些类,例如 JAXB 模块中的类,因为它们无处不在而难以忽视。我想使用 Spring HATEOAS 的 ResourceLink 等类型。这些类型在 REST 响应中用作各种实体的表示形式,有时使用 JAXB 渲染为 XML,它们无法在 Android 中加载!因此,我不得不将这些类型复制到本地,并镜像包结构并移除那些导致问题的注解。希望我将来能够清理这个问题。

获取 Spring 邮件列表

通过 Spring 邮件列表保持联系

订阅

领先一步

VMware 提供培训和认证,助力您快速进步。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅,提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将到来的活动

查看 Spring 社区所有即将到来的活动。

查看全部