2009-05-20 5 views
2

여러 가지 다른 버전으로 제공되는 응용 프로그램을 작성 중입니다. 처음에는 약 10 개의 변형 된 코드가 있으며 유지 관리해야합니다. 물론 코드의 98 % 정도는 다른 시스템에서 동일 할 것이고 코드 기반을 손상시키지 않는 것이 좋습니다.Java 기반 다중 버전 응용 프로그램을 코드 분할 코드에서 분리

내 질문은 - 이것을 수행하는 것이 바람직한 방법은 무엇입니까? 예를 들어, 일부 버전 (MyClassDifferent)에서 다른 클래스 (MyClass)가 있고 해당 클래스가 몇 곳에서 참조되는 경우 컴파일 할 애플리케이션의 버전에 따라 MyClassDifferent를 참조하는 모든 클래스를 분할하지 않아도 해당 참조가 변경되기를 바랍니다. 전 처리기 매크로가 좋을 지 모르지만 코드가 부풀어 오르고 있으며 개념 구현에 대한 증거 만 있습니다.

각 응용 프로그램의 구성 파일과 결합 된 공장 패턴과 같은 것을 고려 중입니다. 누구든지 어떤 조언이나 포인터가 있습니까?

+0

왜 커뮤니티 위키입니까? – dfa

답변

1

AbstractFactory 디자인 패턴 인 "Dependency Injection"과 "Inversion of Control"을 찾으십시오. Martin Fowler는 here에 관해 씁니다.

간단히 말해 필요한 모든 구성 요소가 포함 된 JAR 파일을 제공합니다. 사용자 지정할 수있는 각 서비스 지점에 대해 서비스의 인터페이스를 정의합니다. 그런 다음 해당 인터페이스의 하나 이상의 구현을 작성합니다.)

AbstractFactory factory = new AbstractFactory(); 
... 
ServiceXYZ s = factory.newServiceXYZ(); 
s.doThis(); 
s.doThat(); 

당신의 AbstractFactory 내부는 자바 반사 방법 Class.classForName를 (사용하여 적절한 ServiceXYZ 객체를 생성하고, SomeClassObject.newInstance() : 서비스 개체를 만들려면 예를 들어, 그것을 위해 AbstractFactory를 부탁드립니다. 이 방법을 사용하면 Jar 파일에 ServiceXYZ 클래스를 가질 필요가 없다는 것을 의미하며 객체를 정상적으로 빌드 할 수도 있습니다.)

실제 클래스 이름은 각 사이트에 고유 한 특성 파일에서 읽습니다.

쉽게 솔루션을 롤하거나 Spring, Guice 또는 Pico과 같은 프레임 워크를 사용할 수 있습니다.

4

는 당신이 바로 그 궤도에 : 공장 패턴, 구성 등

또한 시스템을 별도의 jar 파일에 특정 기능을 넣을 수 있고 다음 핵심 jar 파일과 함께 해당 단지를 포함해야 만한다.

2

나는 당신의 공장 접근법을 두 번째 줄 것이므로, 사용하는 것에 따라 Maven 또는 개미를 자세히 관찰해야한다. 매개 변수/프로필을 기반으로 사용할 클래스를 결정하는 여러 구성 파일을 배포 할 수 있습니다.

C/C++와 같은 전 처리기 makros는 java에서 직접 사용할 수 없습니다. 아마도 빌드 스크립트를 통해 이것을 에뮬레이트 할 수 있습니다. 그러나 나는 그 길로 내려 가지 않을 것입니다. 내 제안은 공장 접근법에 충실합니다.

2

다행히 당신은 몇 가지 옵션

1) ServiceLoader을 (java6에 내장)이이 API에 대한 응용 프로그램을 컴파일, 항아리에 MyClass에 같이 당신의 API 클래스를 넣을 수 있습니다. 그런 다음 /META-INF/services/com.foo.MyClass를 사용하여 별도의 jar 파일에 MyClass를 별도로 구현하십시오. . 그런 다음 단순히 jar의 "배포"를 유지하면서 응용 프로그램의 여러 버전을 유지 관리 할 수 ​​있습니다. 귀하의 "주"클래스는 ServiceLoader의 무리

2) 동일 하나의 아키텍처)하지만 봄 또는 Guice 설정

3) OSGI

4) 솔루션으로 META-INF 서비스를 대체 호출됩니다