Android+GWT+服务器端+IDE最佳实践:跨项目代码共享咨询
嘿,我之前刚好帮朋友处理过几乎一模一样的场景——从Eclipse的GAE/GWT项目转Android开发,还要复用核心的模型、Java Bean和工具方法,给你几个经过实践验证的方案,你可以根据自己的项目规模和复杂度来选:
方案1:把共享代码抽成独立的纯Java库(最易上手)
这是最直接的入门方案,核心思路就是把所有跨平台通用的代码单独拎出来,做成一个不依赖任何平台特定API的纯Java模块:
- 操作步骤:在现有GAE/GWT项目里,把模型类(比如
User.java)、Java Bean、通用工具方法(字符串处理、日期格式化这类)单独移到一个新的Java项目中。确保这个项目只依赖Java SE基础库,完全不要引用GAE的com.google.appengine.*或者GWT的com.google.gwt.*包(GWT的序列化注解比如IsSerializable可以保留,Android会把它当作无效注解,不会报错,而GWT编译时又能正常识别)。 - 引用方式:
- 如果已经转用Gradle(非常推荐,毕竟Eclipse的Android支持已废弃),可以把这个库打包成本地JAR,或者作为Gradle模块添加依赖;
- 如果还在用旧的Eclipse项目结构,直接把这个库导出成JAR,分别添加到原有GAE/GWT项目和新Android项目的依赖列表里即可。
- 关键注意:严格把关共享代码的依赖,但凡涉及平台专属逻辑(比如GAE数据存储操作、GWT客户端UI代码),绝对不能放进共享库,否则Android端会出现编译报错。
方案2:用多模块Gradle项目统一管理(长远最优解)
如果你的项目后续还要长期迭代维护,这个方案值得投入一点时间迁移:
- 项目结构:把现有GAE/GWT项目、新Android项目,以及共享代码模块,都放到同一个Gradle根项目下,结构大概如下:
my-root-project/ ├── shared-core/ # 纯Java共享模块,存放模型、Bean、工具类 ├── gae-gwt-app/ # 原有GAE/GWT应用模块 └── android-app/ # 新Android应用模块 - 配置依赖:在
gae-gwt-app和android-app的build.gradle文件中,添加对共享模块的依赖:implementation project(':shared-core') - 核心优势:
- 统一构建流程,修改共享代码后,所有关联项目会自动同步更新;
- Gradle会自动处理依赖冲突,不用手动管理JAR版本;
- 后续如果从Eclipse转到IntelliJ(官方推荐的Android开发IDE),这个结构完全无缝兼容,几乎不需要调整配置。
- 小提示:如果原有GAE/GWT项目之前用的是Eclipse的Ant或旧GWT插件构建,可能需要花点时间迁移到Gradle,但网上有很多现成的迁移指南,难度不算大。
方案3:基于GWT现有共享机制扩展到Android(适合已用GWT RPC的场景)
如果你的共享代码本来就是为GWT RPC设计的(比如已经有shared目录存放RPC的请求/响应类),可以直接复用这个结构:
- 操作方式:把GWT项目里的
shared源码目录,直接作为Android项目的源码目录添加进去,或者打包成JAR给Android使用。GWT的注解比如@RemoteServiceRelativePath或者IsSerializable在Android里不会有任何问题,它们只是编译时标记,不会引入运行时依赖。 - 注意点:如果共享代码里有GWT客户端专属逻辑(比如
com.google.gwt.user.client包下的类),一定要把这些代码移到GWT项目的客户端模块里,别留在共享目录中,否则Android编译会报错。
通用最佳实践
不管选哪个方案,这几点一定要注意:
- 严格分离平台代码:共享代码只放通用逻辑,绝对不要混进GAE数据存储、GWT UI、Android UI这类平台专属代码;
- 测试共享代码:单独给共享模块写JUnit单元测试,用纯Java测试用例,确保代码在不同平台下都能正常运行;
- 处理依赖冲突:如果共享代码用到第三方库(比如Guava、Jackson),要确保这些库在GAE/GWT和Android上都兼容,必要时用Gradle的
exclude功能排除冲突依赖。
内容的提问来源于stack exchange,提问作者Andrei F
相关产品推荐
相关产品推荐

