2009-09-24 2 views
3

우리의 응용 프로그램은 1.5 및 1.6 JVM을 지원해야합니다. 1.6 지원은 1.6 전용 기능을 사용해야하지만 1.5 지원은 1.6 JRE 종속성을 유지해야합니다.다중 JRE 버전 지원을위한 최상의 개발 방법은 무엇입니까?

Eclipse 프로젝트를 1.5 JRE로 변경하면 모든 종속성에 오류가 있음을 알 수 있습니다. 이것은 우리의 의존성이 어디에 있는지 알기에 유용하지만 보통 개발에는 유용하지 않습니다. 이러한 컴파일 오류로 인해 커밋 소스도 잘못되었다고 느낍니다.

이러한 종류의 멀티 JRE 버전 지원을위한 모범 사례는 무엇입니까?

C에서, 우리는 #ifdef 컴파일러 지시문을 사용하여 이러한 문제를 상당히 깨끗하게 해결했습니다. 가장 깨끗한 Java는 무엇입니까?

+0

어떻게 1.5 버전을 만들 수 있습니까? 빌드 파일에서 1.6 의존적 인 것을주의 깊게 제외합니까? – auramo

답변

3

소프트웨어가 JRE 1.5와 1.6 모두에서 실행되어야한다면 1.5 용으로 만 개발하면 되나요? Java 6에서만 사용할 수있는 기능을 절대적으로 사용해야하는 이유가 있습니까? Java 1.6에서 실행되는 타사 라이브러리에 사용할 1.6 전용 기능에 해당하는 라이브러리가 있습니까?

두 개의 코드베이스를 유지하면서 동기화 등을 유지하는 것은 많은 작업이며 얻을 수있는 것과 비교할 때 가치가 없을 것입니다.

Java ofcourse에는 전 처리기가 없으므로 전처리 지시문을 사용하여 C에서 수행 할 수있는 것처럼 (쉽게) 조건부 컴파일을 수행 할 수 없습니다.

당신의 프로젝트가 얼마나 큰가에 달렸지 만 다음과 같이 말하고 싶습니다 :하지 마라. 자바 5 기능 만 사용하라. 당신이 필요하다고 생각하는 자바 6 특정 것들이 있다면, Java 5에서 실행되는 파티 라이브러리는 이러한 것을 구현합니다 (또는 장기적으로는 2 개의 코드베이스를 유지하는 것보다 효과적 일 수 있습니다).

+0

정확히 내가 말하려고했던 것. 1.5 버전을 개발하고 더 이상 사용되지 않는 API 나 기능을 사용하지 마십시오. – cletus

+1

1.6 유용한 정보가 없습니다. –

+1

Tom은 별개의 질문입니다, 그렇지 않습니까? 그들의 응용 프로그램이 1.6에 특정한 것을 사용하지 않는다면 단지 1.5를 목표로하여 많은 시간을 절약 할 수 있습니다. –

1

몇 가지 방법은 사용할 수 있습니다 : 1.6에 대한

  • 컴파일 및 기능이 정상적으로 저하 보장하기 위해 테스트를 사용; 이것은 상용 제품 (1.3 호환성을 가진 1.4 타겟)과 함께 작업 한 프로세스입니다.
  • 버전 별 플러그인을 사용하고 런타임을 사용하여로드 할 것인지 결정합니다. 이 일종의 플러그인 프레임 워크가 필요합니다.
  • 1.5에 대해 컴파일하고 리플렉션을 사용하여 1.6 기능을 호출합니다. 나는 때문에 성능이 저하
  • 모든 경우에

에서 첫 번째 방법을 통해 추가 된 복잡성이 문제를 피할 것이다, 당신은 기능을 분리하고 생성 된 클래스 파일 (1.5 목표로 컴파일)을 version of 49.0이 있는지 확인하는 것이 좋습니다 . Facade 클래스를 초기화 할 때 reflection을 사용하여 메소드/기능 가용성을 결정할 수 있습니다.

2

대부분의 코드를 1.5로 컴파일하십시오. 1.6 특정 코드에 대한 별도의 소스 디렉토리가 있어야합니다. 1.6 소스는 1.5에 따라 다르지만 그 반대는 아닙니다. 1.5 코드에서 유형을 subtyping하여 1.6 코드와 인터페이스해야합니다. 이 코드는 어디서나 null을 확인하는 대신 대체 구현이 될 수 있습니다.

한 번 반사를 사용하여 루트 1.6 클래스의 인스턴스를로드하려고 시도합니다. 루트 클래스는 인스턴스 생성을 허용하기 전에 1.6에서 실행되는지 확인해야합니다 (나는 -target 1.6`을 사용하고 정적 초기화 프로그램에서 1.6 전용 메소드 사용).

0

소스 컨트롤을 사용하면 쉽게 분기 할 수 있습니다 (git, svn 또는 Perforce가 훌륭하게 작동합니다). 두 개의 코드 브랜치, 1.5 개의 브랜치, 1.5 개의 브랜치에서 분기되는 1.6 개의 브랜치를 가질 수 있습니다.

1.5 분기에서 1.5로 개발 한 다음 필요에 따라 변경 사항/버그 수정을 1.6 분기로 병합 한 다음 특정 1.6 요구 사항에 맞게 코드 업그레이드를 수행 할 수 있습니다.

코드를 릴리스해야하는 경우 필요한 분기에서 빌드해야합니다.

Eclipse의 경우, 각 분기마다 하나씩 두 개의 작업 공간을 유지하거나 각 분기마다 두 개의 프로젝트 세트 만 가질 수 있습니다. 단, 서로 다른 프로젝트 이름이 있어야 고통을받을 수 있습니다. 나는 그것이 자신의 고통을 가지고 있지만 작업 공간 접근법을 추천 할 것이다.

그런 다음 필요에 따라 각 프로젝트/작업 공간에 대해 필요한 JVM 버전을 지정할 수 있습니다.

희망이 도움이됩니다.

에게 는

(추가 : 당신은 더 이상 1.5 지원을 필요로 할 때 이것은 또한, 같은 시간에 쉽게 전환을하지 않습니다 것입니다 당신은 단지 지점을 폐쇄하고 1.6 분기에만 작업을 시작)

0

하나의 옵션이 될 것입니다 코드를 3 개의 프로젝트로 나눕니다.

하나의 프로젝트에는 두 가지 Java 버전 모두에서 작동하는 공통 항목이 포함됩니다.

하나의 프로젝트에는 java6 구현이 포함되어 있으며 공통 프로젝트에 의존합니다.

하나의 프로젝트에는 java5 구현이 포함되어 있으며 공통 프로젝트에 의존합니다.

인터페이스를 구현하는 구현으로 인터페이스를 분해하면 빌드 의존성을 없앨 수 있습니다. 구체적인 클래스를 하나로 묶는 데 도움이되는 종류의 의존성 삽입이 거의 필요할 것입니다.

Eclipse에서 작업하면서 java6 프로젝트를 target6으로 설정하고 다른 2 개의 프로젝트를 target5로 설정할 수 있습니다. 프로젝트별로 프로젝트에서 JRE를 선택하면 놓친 종속성이 표시됩니다.

빌드 파일을 약간 영리하게 만들면 일반적인 비트를 두 가지 방법으로 빌드하고 배포 할 올바른 버전에 의존 할 수 있습니다. 그러나 이것이 많은 이점을 가져다 줄지는 모르지만.

응용 프로그램의 두 가지 별도 버전으로 끝날 것입니다. 하나는 java6 용이고 다른 하나는 java5 용입니다.

관련 문제