Cấu trúc gói cho một dự án Java?


116

Phương pháp hay nhất để thiết lập cấu trúc gói trong Ứng dụng Web Java là gì?

Bạn sẽ thiết lập src, mã kiểm tra đơn vị, v.v. của mình như thế nào?

Câu trả lời:


95

Bạn có thể làm theo cách bố trí dự án tiêu chuẩn của maven . Bạn không phải thực sự sử dụng maven, nhưng nó sẽ giúp quá trình chuyển đổi dễ dàng hơn trong tương lai (nếu cần). Thêm vào đó, các nhà phát triển khác sẽ quen với việc nhìn thấy bố cục đó, vì nhiều dự án nguồn mở được bố trí theo cách này,


2
Tôi cũng khuyên bạn nên sử dụng bố cục của Maven nếu bạn có lựa chọn. Đó là một cấu trúc được suy nghĩ kỹ lưỡng, đã được thử nghiệm thực chiến và quen thuộc với nhiều nhà phát triển.
Dov Wasserman

15
Bạn có thể sử dụng oneliner này để tạo bố trí thư mục: mkdir -p src / {/ main {java, tài nguyên, các bộ lọc, lắp ráp, cấu hình, webapp}, thử nghiệm / {java, nguồn lực, bộ lọc}, trang web}
Daniel Hepper

1
Bố cục dự án tiêu chuẩn của Maven là xấu ...: /
Yousha Aleayoub

2
@YoushaAleayoub bạn không cần phải kết hôn nó
Ashvin Sharma

59

Có một số tài nguyên hiện có mà bạn có thể kiểm tra:

  1. Đóng gói đúng cách các lớp Java của bạn
  2. Kiến trúc Spring 2.5
  3. Hướng dẫn Java - Đặt tên một gói
  4. Quy ước đặt tên của SUN

Đối với những gì nó đáng giá, các nguyên tắc cá nhân của riêng tôi mà tôi có xu hướng sử dụng như sau:

  1. Bắt đầu với miền ngược, ví dụ: "com.mycompany".
  2. Sử dụng tên sản phẩm, ví dụ: "myproduct". Trong một số trường hợp, tôi có xu hướng có các gói thông thường không thuộc về một sản phẩm cụ thể. Chúng sẽ được phân loại theo chức năng của các lớp chung này, ví dụ: "io", "use", "ui", v.v.
  3. Sau đó, nó trở thành dạng tự do hơn. Thông thường tôi nhóm theo dự án, lĩnh vực chức năng, triển khai, v.v. Ví dụ: tôi có thể có "project1", "project2", "ui", "client", v.v.

Một số điểm khác:

  1. Nó khá phổ biến trong các dự án tôi đã làm việc để tên gói chảy từ tài liệu thiết kế. Thông thường các sản phẩm được tách thành các lĩnh vực chức năng hoặc mục đích đã có.
  2. Đừng quá căng thẳng về việc đẩy chức năng phổ biến vào các gói cao hơn ngay lập tức. Chờ khi có nhu cầu trên các dự án, sản phẩm, v.v., sau đó tái cấu trúc.
  3. Xem các phụ thuộc giữa các gói. Tất cả chúng không phải là xấu, nhưng nó có thể biểu thị sự kết hợp chặt chẽ giữa những gì có thể là các đơn vị riêng biệt. Có những công cụ có thể giúp bạn theo dõi điều này.

2
Trong trường hợp miền ngược ("com.mycompany"), gói "com" có thường trống không ngoại trừ gói con "mycompany" không?
Alex Parker

45

Tôi khuyên bạn nên tạo cấu trúc gói của bạn theo tính năng chứ không phải theo lớp triển khai. Một bài viết tốt về điều này là các phương pháp Java: Đóng gói theo tính năng, không phải lớp


2
Cảm ơn. Đây là những gì tôi đang tìm kiếm để truyền đạt suy nghĩ của mình để đội
Pranalee

8
Và nếu bạn muốn chuyển đổi cơ sở dữ liệu? Chỉ phải tìm trong 30 gói khác nhau. Chuyển từ SFTP sang dịch vụ web? Một lần nữa chỉ phải tìm ở 30 nơi khác nhau. Chắc chắn không phải là fan.
SamuelKDavis

1
một ví dụ khác trong đó đóng gói theo lớp có lợi ích: nếu bạn tuần tự hóa các lớp thành JSON (ví dụ: với gson), nếu các lớp đó bị xáo trộn (ví dụ bằng Proguard) (de) tuần tự hóa sẽ không thành công; bạn cần định cấu hình Proguard để không chạm vào các lớp như vậy - đây là cách dễ nhất chỉ để chỉ định một gói duy nhất với tất cả chúng
jmuet

6

Tôi thường thích có những thứ sau:

  • bin (Binaries)
  • doc (Tài liệu)
  • inf (Thông tin)
  • lib (Thư viện)
  • res (Tài nguyên)
  • src (Nguồn)
  • tst (Thử nghiệm)

Những điều này có thể được coi là độc đáo, nhưng tôi thấy đó là một cách rất hay để sắp xếp mọi thứ.


"Đây có thể được coi là độc đáo" Họ đang thực sự độc đáo và xấu bằng cách này ...
mahieddine

2
@mahieddine Tại sao bạn lại coi chúng là xấu?
Thomas Johannesmeyer

Chà, không phải tôi đã nói điều đó, nhưng đây là một số suy nghĩ của tôi: Các lớp thử nghiệm của bạn là mã nguồn nên thư mục "tst" (hầu hết mọi người không viết tắt test btw) phải là thư mục con của src (ví dụ: " src "trở thành" src / main "và" tst "trở thành" src / test "). Ngoài ra "inf" dường như bao gồm nội dung có thể bằng "doc".
Nico Wawrzyniak

6
The way I usually organise is
- src
        - main
                - java
                - groovy
                - resources
        - test
                - java
                - groovy
- lib
- build
        - test 
                - reports
                - classes
- doc

3

Theo cách tôi thường có hệ thống phân cấp thư mục-

  • Tên dự án
    • src
    • thùng rác
    • bài kiểm tra
    • nói dối
    • tài liệu

1

Một cách khác là tách các API, dịch vụ và thực thể thành các gói khác nhau.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.