2012-09-27 2 views
1

는 기본적으로 나는Java에서 패키지 종속성 계층 구조를 적용 할 수 있습니까?

com.me.application 
com.me.application.thing 
com.me.library 

내가 com.me.application.thing에서 일을 제외하고 com.me.application에 아무것도 com.me.library을 포함 할 수 없습니다 규칙을 적용 할 ... 패키지가 있습니다.

Java 코드, Maven, 클래스 경로 또는 Java의 다른 계층에서 가능한가요? C에서 연결하는 것과 대략적으로 비슷합니까?

답변

2

제가 생각할 수있는 유일한 방법은 AspectJ입니다.

AspectJ는 별도의 컴파일 프로세스를 통해 응용 프로그램에 교차 절단 문제를 추가하는 데 사용되는 Aspect Oriented Language입니다. AspectJ의 전형적인 용도 중 하나는 시나리오에 맞는 정책 시행이다.

기본적으로 호출 할 수있는 패키지를 결정하는 규칙을 선언하고 이러한 규칙을 위반하는 메서드 호출 (또는 변수 선언의 경우)이 발생할 때마다 컴파일 오류가 발생합니다. 당신은 훌륭한 책에 상세 정보를 배울 수 AspectJ in Action

AspectJ를 멋지게 AspectJ plugin

을 통해 구축 그리고 당신은 단지 정책 시행을 위해 AspectJ를 사용하는 경우, 당신은 추가 런타임 종속성이 없습니다 메이븐에 통합 할 수 있습니다

, 바이트 코드가 수정되지 않기 때문입니다.

0

각 jar 파일을 빌드하는 별도의 maven 프로젝트를 통해 com.me.application, com.me.application.thing 및 com.me.library를 빌드해야합니다. com.me.application의 pom에는 com.me.library에 대한 종속성이없고 com.me.application.thing에 대한 pom에는 com.me.library에 대한 종속성이 포함됩니다.

그러나 이것은 이상한 패키지 구조입니다. 왜 이것을 막고 싶니?

+1

전혀 이상한 구조는 아니며 코드 전체에서 번쩍이는 대신 라이브러리의 사용이 애플리케이션의 작은 부분에서 분리되도록 보장합니다. 물리적 빌드 구조에 깊이 관여하지 않는 솔루션을 기대하십시오. – djechlin

+1

하나는 다른 하나의 하위 패키지이므로 이상하다고 생각합니다. The Maven 솔루션은 빌드 타임 의존성을 막을뿐입니다. 누군가 가끔 비웃는 개발자가있는 경우 런타임에 리플렉션 사용을 중단하지 않습니다. – jalynn2

3

컴파일러가 강제로 컴파일하려고하는 대신, 대신 소스 코드 분석을 사용하십시오.

이제 Sonar에 포함 된 architecture rules engine을 사용하는 것이 좋습니다. 이것을 build breaker 플러그인과 결합하면 개발자가 계층 구조 규칙을 위반할 경우 빌드가 실패 할 수 있습니다.

+0

몰랐습니다. 좋은! –

2

Checkstyle의 import control 규칙을 사용하여 검사를 시행 할 수 있습니다. Maven Checkstyle plugin을 pom.xml에 구성하면 모든 위반이 설정되어 빌드가 실패 할 수 있습니다.

관련 문제