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-dataoauthsocial模块)和client(可以加载Android模块和iOS模块)。web文件夹中的模块按顺序展示了一个简单REST服务的演变过程,该服务包含超媒体、Spring Data存储库和OAuth安全功能。social模块演示了如何构建一个使用该服务的OAuth客户端。

代码构建和编辑

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

依赖关系处理和Android

我们在 build 文件(此处提供链接) 中使用了最新版本的 प्रमुख 库。这些版本是最新的,有时甚至是处于开发边缘的版本。Android应用程序使用了Spring Android项目,该项目基本上提供了一个与Spring核心中的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核心。

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

任何不在Android JDK类白名单中的类都无法在Android上使用,因此会使依赖它的代码不兼容。某些类,例如JAXB模块中的类,很难忽略,因为它们无处不在。我想使用Spring HATEOAS的ResourceLink类型。这些类型用作REST响应中各种实体的表示,有时使用JAXB呈现为XML,它们无法在Android中加载!因此,我 不得不将这些类型本地复制,并镜像包结构并删除有问题的注释。希望将来我可以清理它。

获取Spring新闻通讯

通过Spring新闻通讯保持联系

订阅

领先一步

VMware提供培训和认证,以加速您的进步。

了解更多

获取支持

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

了解更多

即将举行的活动

查看Spring社区中所有即将举行的活动。

查看全部