Java 프로젝트의 패키지 구조?


116

Java 웹 애플리케이션에서 패키지 구조를 설정하는 가장 좋은 방법은 무엇입니까?

src, 단위 테스트 코드 등을 어떻게 설정 하시겠습니까?

답변:


95

maven의 표준 프로젝트 레이아웃을 따를 수 있습니다. 실제로 maven을 사용할 필요는 없지만 필요한 경우 향후 전환이 더 쉬워 질 것입니다. 또한 많은 오픈 소스 프로젝트가 이런 방식으로 배치되기 때문에 다른 개발자가 해당 레이아웃을 보는 데 익숙해 질 것입니다.


2
또한 선택할 수있는 경우 Maven의 레이아웃을 사용하는 것이 좋습니다. 전투 테스트를 거쳐 많은 개발자에게 친숙한 잘 고안된 구조입니다.
Dov Wasserman

15
이 oneliner를 사용하여 디렉토리 레이아웃을 만들 수 있습니다. mkdir -p src / {main / {java, resources, filters, assembly, config, webapp}, test / {java, resources, filters}, site}
Daniel Hepper

1
Maven의 표준 프로젝트 레이아웃은 추악합니다 ... : /
Yousha Aleayoub

2
@YoushaAleayoub 당신은 그것을 결혼 할 필요가 없습니다
Ashvin Sharma

59

확인할 수있는 몇 가지 기존 리소스가 있습니다.

  1. Java 클래스를 적절하게 패키징
  2. Spring 2.5 아키텍처
  3. 자바 자습서-패키지 이름 지정
  4. SUN 명명 규칙

그만한 가치에 대해 제가 사용하는 개인적인 지침은 다음과 같습니다.

  1. 역 도메인 (예 : "com.mycompany")으로 시작하십시오.
  2. 제품 이름을 사용하십시오 (예 : "myproduct"). 어떤 경우에는 특정 제품에 속하지 않는 공통 패키지가있는 경향이 있습니다. 이것은 "io", "util", "ui"등과 같은 공통 클래스의 기능에 따라 분류됩니다.
  3. 이 후에는 더 자유 형식이됩니다. 일반적으로 프로젝트, 기능 영역, 배포 등에 따라 그룹화합니다. 예를 들어 "project1", "project2", "ui", "client"등이있을 수 있습니다.

다른 몇 가지 사항 :

  1. 패키지 이름이 디자인 문서에서 흘러 나오도록 작업 한 프로젝트에서는 매우 일반적입니다. 일반적으로 제품은 이미 기능 또는 목적 영역으로 구분됩니다.
  2. 일반적인 기능을 더 높은 패키지에 즉시 적용하는 것에 너무 많은 스트레스를주지 마십시오. 프로젝트, 제품 등에서 필요가있을 때까지 기다린 다음 리팩터링하십시오.
  3. 패키지 간 종속성을 확인하십시오. 모두 나쁘지는 않지만 별도의 장치 사이의 긴밀한 결합을 의미 할 수 있습니다. 이를 추적하는 데 도움이되는 도구가 있습니다.

2
역 도메인의 경우 ( "com.mycompany")에서 "com"패키지는 "mycompany"하위 패키지를 제외하고 일반적으로 비어 있습니까?
Alex Parker

45

구현 계층이 아닌 기능별로 패키지 구조를 만드는 것이 좋습니다. 이에 대한 좋은 글은 Java 프랙티스입니다. 레이어가 아닌 기능별 패키지


2
감사. 이것은 내가 팀에 내 생각을 전달하기 위해 무엇을 찾고 있었다입니다
Pranalee

8
데이터베이스를 전환하려면? 30 개의 다른 패키지 만 살펴보면됩니다. SFTP에서 웹 서비스로 이동 하시겠습니까? 다시 30 개의 다른 장소를 살펴보면됩니다. 확실히 팬이 아닙니다.
SamuelKDavis

1
레이어 별 패키징에 이점이있는 또 다른 예 : 클래스를 JSON으로 직렬화 (예 : gson 사용)하면 해당 클래스가 난독 화되면 (예 : Proguard) (역) 직렬화가 실패합니다. 이러한 클래스를 건드리지 않도록 Proguard를 구성해야합니다. 모든 클래스와 함께 단일 패키지를 지정하는 것이 가장 쉽습니다
jmuet

6

나는 일반적으로 다음을 좋아합니다.

  • bin (바이너리)
  • doc (문서)
  • inf (정보)
  • lib (라이브러리)
  • res (자원)
  • src (소스)
  • tst (테스트)

이것은 틀에 얽매이지 않는 것으로 간주 될 수 있지만, 사물을 정리하는 데 아주 좋은 방법이라고 생각합니다.


"이것들은 비 관습적인 것으로 간주 될 수 있습니다"그들은 실제로 비 관습적이고 나쁘다 ...
mahieddine

2
@mahieddine 왜 그들을 나쁘게 생각합니까?
Thomas Johannesmeyer

내가 그렇게 말한 건 아니지만 내 생각 중 일부는 다음과 같습니다. 테스트 클래스는 소스 코드이므로 "tst"(대부분의 사람들은 test btw를 축약하지 않음) 디렉토리는 src의 하위 디렉토리 (예 : " src "는"src / main "이되고"tst "는"src / test "가됩니다). 또한 "inf"는 "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

내가 일반적으로 폴더 계층 구조를 갖는 방식-

  • 프로젝트 이름
    • src
    • 큰 상자
    • 테스트
    • libs
    • 문서

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.