我应该如何构建Java应用程序,在哪里放置我的类?

Mau*_*uli 40 java architecture

首先,我知道如何构建Java应用程序.但是我总是对我的课程放在哪里感到困惑.有支持者以严格的域名方式组织包,其他人按层分开.

我自己总是遇到问题

  • 命名,
  • 配售

所以,

  1. 你在哪里放置你的域特定常量(这个类的最佳名称是什么)?
  2. 你把哪些类放在基础结构和特定于域的东西上(例如我有一个FileStorageStrategy类,它将文件存储在数据库中,或者存储在数据库中)?
  3. 在哪里放置例外?
  4. 我可以参考哪些标准?

Bri*_*ise 27

我真的喜欢Maven的标准目录布局.

对我来说,一个关键的想法是有两个源根 - 一个用于生产代码,另一个用于测试代码,如下所示:

MyProject/src/main/java/com/acme/Widget.java
MyProject/src/test/java/com/acme/WidgetTest.java
Run Code Online (Sandbox Code Playgroud)

(这里,src/main/java和src/test/java都是源根).

好处:

  • 您的测试对您正在测试的类具有包(或"默认")级别访问权限.
  • 通过删除src/test/java作为源根,可以轻松地将生产源打包到JAR中.

有关课程安排和课程的一条经验法则:

一般而言,结构良好的项目将没有循环依赖.了解它们何时是坏的(当它们不是时),并考虑像JDependSonarJ这样的工具帮助你消除它们.


cri*_*nge 12

我是有组织的资源的忠实粉丝,所以我总是创建以下目录结构:

/src - for your packages & classes
/test - for unit tests
/docs - for documentation, generated and manually edited
/lib - 3rd party libraries
/etc - unrelated stuff
/bin (or /classes) - compiled classes, output of your compile
/dist - for distribution packages, hopefully auto generated by a build system
Run Code Online (Sandbox Code Playgroud)

在/ src中我使用的是默认的Java模式:以域名开头的包名(org.yourdomain.yourprojectname)和反映您使用该类创建的OOP方面的类名(请参阅其他评论者).常见的包名称如util,model,view,events也很有用.

我倾向于在自己的类中为特定主题设置常量,例如在域类的同一个包中的SessionConstantsServiceConstants.


Séb*_* D. 11

在我工作的地方,我们正在使用Maven 2,我们的项目有一个非常好的原型.目标是获得良好的关注点分离,因此我们使用多个模块定义了一个项目结构(每个应用程序'层'一个): - common:其他层使用的公共代码(例如,i18n) - 实体:域实体 - 存储库:此模块包含daos接口和实现 - services-intf:服务的接口(例如,UserService,...) - services-impl:服务的实现(例如,UserServiceImpl) - web:关于web内容(例如,css,jsps,jsf pages,...) - ws:web services

每个模块都有自己的依赖项(例如,存储库可以有jpa),有些是项目范围的(因此它们属于公共模块).不同项目模块之间的依赖关系明确区分事物(例如,Web层依赖于服务层但不了解存储库层).

每个模块都有自己的基础包,例如,如果应用程序包是"com.foo.bar",那么我们有:

com.foo.bar.common
com.foo.bar.entities
com.foo.bar.repositories
com.foo.bar.services
com.foo.bar.services.impl
...
Run Code Online (Sandbox Code Playgroud)

每个模块都遵循标准的maven项目结构:

   src\
   ..main\java
     ...\resources
   ..test\java
     ...\resources
Run Code Online (Sandbox Code Playgroud)

对于给定图层的单元测试很容易在\ src\test下找到它们的位置......所有特定于域的东西都放在实体模块中.现在像FileStorageStrategy这样的东西应该进入存储库模块,因为我们不需要确切地知道实现是什么.在服务层,我们只知道存储库接口,我们不关心具体实现是什么(关注点分离).

这种方法有许多优点:

  • 明确分离关注点
  • 每个模块都可以打包为jar(或者在Web模块的情况下是战争),因此可以更容易地重用代码(例如,我们可以在maven存储库中安装模块并在另一个项目中重用它)
  • 项目每个部分的最大独立性

我知道这并没有回答你所有的问题,但我认为这可能会让你走上正确的道路,并证明对别人有用.