Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在两个或多个项目之间共享公共代码(如域类)的最佳方式是什么?_Java_Eclipse_Web Services - Fatal编程技术网

Java 在两个或多个项目之间共享公共代码(如域类)的最佳方式是什么?

Java 在两个或多个项目之间共享公共代码(如域类)的最佳方式是什么?,java,eclipse,web-services,Java,Eclipse,Web Services,我们正在开发一个由两个Eclipse项目组成的Web应用程序。一个项目是基于HTTP的RESTfulWeb服务;另一个项目是一个网站。两者都将作为战争部署。最初,两者都将部署在同一个应用服务器实例下,但最终它们将位于不同的框中 网站应用程序使用RESTful WS应用程序。显然,这两个项目都有共同的代码——特别是域类。例如,可能存在位于/users的资源,该资源公开用户对象上的CRUD操作;要更新用户,网站应用程序将向/users发布一个XML封送的用户对象。访问/users/1将返回一个XML

我们正在开发一个由两个Eclipse项目组成的Web应用程序。一个项目是基于HTTP的RESTfulWeb服务;另一个项目是一个网站。两者都将作为战争部署。最初,两者都将部署在同一个应用服务器实例下,但最终它们将位于不同的框中

网站应用程序使用RESTful WS应用程序。显然,这两个项目都有共同的代码——特别是域类。例如,可能存在位于/users的资源,该资源公开用户对象上的CRUD操作;要更新用户,网站应用程序将向/users发布一个XML封送的用户对象。访问/users/1将返回一个XML封送的用户对象

显然,由于各种原因,在两个项目中都有一个用户类是相当愚蠢的。所以我想知道最好的方法是什么?将公共代码放在两个项目之间共享的JAR中是我过去所做的事情,但是有更好或更简单的方法吗


编辑:删除RESTful引用。撇开语义不谈,在两个Eclipse项目之间共享公共代码的正确方法是什么?

如果您在RESTful系统中的客户机和服务器之间共享域类,那么您就无法达到REST的目的。REST约束旨在通过确保两个系统之间的唯一耦合仅限于媒体类型和链接关系,允许客户机和服务器系统独立发展


如果您需要共享域对象,请忘记REST,这将给我带来更多的麻烦

Imho,这取决于您的构建系统,而不是您的IDE

所以,如果你

  • 使用纯Eclipse进行构建,并希望保持简单,只需添加第三个项目并添加依赖项
  • 使用osgi,您应该已经创建了一个新的osgi项目
  • 使用构建工具,如maven或gradle,然后设置多项目构建

通常,您会创建第三个项目(例如核心或共享),其中包含共享代码。只需从两个项目中依赖它。

关注点分离

实际上,创建第三个项目并添加项目依赖项是最好的方法,因为这不仅是类的原则,也是软件模块的原则。它创造了一些优势:

  • 了解一个项目的诀窍所需阅读的代码更少
  • 更好的依赖关系控制,因为您可以省略一些项目间依赖关系,所以不可能使用错误模块的类
  • 复制代码很糟糕
项目结构

确保你不是在创建一个大的“实用程序”项目,而是特定于领域的项目,比如用户管理或通讯录

在你的情况下,它可能是

  • 用户api包含用户传输对象
  • 用户服务提供CRUD操作
  • webapp(或用户客户端)调用用户服务
其他构建系统

当转向持续集成时,您需要使用比Eclipse更好的构建系统,但原则是相同的。您将创建依赖关系最小的小模块

最流行的Java项目构建系统是、和。每个模块都有自己的方式来定义模块依赖项

Eclipse中的项目引用

要告诉Eclipse项目依赖关系,右键单击项目,打开属性并切换到项目引用。在这里,您可以标记依赖项,这样代码更改将立即生效,而无需手动复制JAR文件


您需要创建另一个项目(即共享)。我所有的服务器客户端应用程序我都喜欢


基本上,共享模块具有由客户端使用并由EJB模块实现的EJB接口。有几种可能的方法可以做到这一点,根据您的具体情况和需求,有些方法可能比其他方法更好

在所有情况下,我强烈推荐一个能够理解版本号的系统

实现这一点的经典方法是使用maven。此外,它在eclipse中集成得非常好,您可以将模块作为一个父项目的一部分进行构造,例如:

project-parent
    project-website1
    project-website2
    project-controllers
    project-model
    [...]
在内部,这些模块可以相互依赖。您可以将接口与实现分离:

project-parent
    project-website1
    project-website2
    project-api
    project-api-impl
    [...]
然后大部分时间取决于api模块。maven还有一些处理WAR文件的机制

这种(单个项目)方法可能是非常小的开发团队的理想选择。主要的缺点是单独发布是不现实的——实现中只影响website2的错误修复也需要发布website1

此外,在这种情况下,分离往往不那么清晰,这使得将不应该存在的东西移动到共享模块中可能太容易了

另一种模式是:

 project1-parent
      project1-webapp
      project1-specifics
      [...]

 project2-parent
      project2-webapp
      project2-specifics
      [...]

 common-parent
      common-api
      common-impl
      common-model
      [...]
这使得分离更加清晰,您可以单独发布内容。此外(尽管在正常情况下可能不建议这样做),project1 webapp可能依赖于比project2 webapp更旧或更新版本的通用模块。maven可以在这里找到:

https://maven.apache.org/
另一个可能帮助您处理版本控制的工具集是:

https://gradle.org/
为了充分利用这些功能,您可能还需要研究将git与gitflow结合使用:

http://git-scm.com/
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow/
并了解如何使用它来处理版本控制和发布


就我个人而言,刚开始的时候我觉得很困惑,但现在一切都很有意义。

如何使用第三方罐子?将您的通用代码想象成第三方jar,并将相同的规则应用于您的项目。您可以使用像maven这样的依赖关系管理工具来保持版本控制的有序性

如果您想升级到应用程序