2010-03-22 2 views
0

기존 코드베이스에서 Java로 3 가지 소프트웨어 에디션을 만들 계획입니다. 가장 좋은 방법은 무엇입니까? 각 판마다 하나씩 3 개의 다른 프로젝트를 만들어야합니까? 에디션을 관리하기위한 도구도 있습니까?소프트웨어 에디션을 관리합니다

+0

어떤 유형의 응용 프로그램입니까? 이것은 데스크톱 응용 프로그램, 웹 응용 프로그램, 로컬로 설치할 수있는 인트라넷 응용 프로그램입니까? 더 자세하게 제공할수록 더 나은 답변을 얻을 수 있습니다. –

+0

웹 기반 또는 독립형 (더 가벼운 버전)이 될 수있는 Java 응용 프로그램입니다. 웹 기반 버전의 tomcat에서 실행되고 데이터베이스가 필요합니다. – user121196

답변

1

제 생각에는 가능한 한 단일 코드베이스를 유지하고 전환을 위해 일종의 플래그를 사용하는 것입니다.

가능하지 않다면 가능한 한 똑같이 유지하고 더 큰 프로젝트에서 더 작은 프로젝트를 하위 프로젝트로 사용하도록하십시오. 가능한 경우 자동으로 일부 기능을 사용 가능하게 설정하십시오 (예 : 각각의 프로젝트 그것은 자신의 메인을 가질 수 있습니다, 다른 빌드는 기능을 활성화하기 위해 플래그를 설정하는 다른 메인을 호출 할 수 있습니다.

플래그가 최종적인 경우 프로젝트에 불필요한 코드가 전혀 표시되지 않도록해야합니다.

마지막으로, 최악의 경우, Subversion에서 3 개의 분기.

편집 :

당신은 나를 좀 더 이것에 생각하게하고 나는 더 나은 해결책을 찾은 것 같아요.

이 프로젝트를 4 개의 프로젝트로 나눠서 모든 "공통"요소를 기본 프로젝트와 다른 요소로 결합하면 다른 세 가지 프로젝트로 확산 될 것이라고 생각합니다. 기본, 데모, 지불 및 비즈니스 프로젝트에 대한 정보를 얻을 수 있습니다.

세 가지가 다를 수있는 데모 중 하나에서 데모/지불/비즈니스 클래스의 개체가 기능을 제공합니다. 예를 들어 유료 버전에 새 메뉴 항목이있는 경우 객체 중 하나에 getMenuItems가있을 수 있습니다. 메뉴 막대에 놓을 수있는 메뉴 트리를 반환합니다. 데모 버전은 항목이 적습니다.

"Base"는 실행중인 버전을 알지 못하므로 단지 객체 만 사용합니다.

개체를 가져 오려면 공장이 있어야합니다. 공장은 다음과 같이 보일 것입니다 :

private String[] availablePackages={"business", "pay", "demo"}; 

public getMenuClass() { 
    Class c; 
    for(String package : availablePackages) { 
     try { 
      c=Class.forName("com.meh.myapp."+package+".MenuClass"); 
     } catch... { 
      // No package by that name 
     } 
     if(c != null) { 
      return c.newInstance(); 
     } 
    } 
    // Something went wrong, no instance found. 

상승 기류의 당신이 ... pay.MenuClass 마지막으로 ... demo.MenuClass을 한 후, 첫 com.meh.myapp.business.MenuClass를 인스턴스화하려고 시도해야한다는 것입니다 .

다른 항아리를 배송하면 구성을 변경할 수 있습니다. 데모 및 기본 항아리 만 배송하려는 경우 데모 앱을 받게됩니다. 지불 항아리를 선적하면 유료 앱을받을 수 있습니다.

비즈니스가 "지불"하고 "지불"하여 많은 작업을 "데모"로 위임하기를 원하는 비즈니스의 가능성은 매우 높지만 데모는 비즈니스 또는 지불의 아무 것도 안다는 것을 알고 있습니다 , "main"은 오직 다른 세 가지를 알고 있습니다.

구성이 필요 없기 때문에 이것은 좋은 해결책이 될 것입니다. 사실, 데모에서 지불하기 위해 유료 항아리 만 보내야 만합니다. 메인 및 데모 항아리는 재사용되고 그대로 유지됩니다. 아르.

+0

자바 컴파일의 최종 플래그에 대한 링크가 있습니까? 빠른 검색으로 많은 정보를 얻을 수 없었습니다. 사용하지 않는 코드는 어떻게 버릴까요? – user121196

+0

컴파일 플래그가 아니란 뜻으로, "private final boolean INCLUDE_CODE = false"와 같이 변수가 final 인 경우를 의미합니다. "if (INCLUDE_CODE) myVar = new SpecialClass() ; " 코드로 컴파일되지 않아야합니다. 그것은 결코 사실 일 수없고 그것을 최적화 할 수 없다는 것을 인식해야합니다. 이것이 SpecialClass가 참조되는 유일한 장소라면 SpecialClass가 프로젝트에 전혀 추가되어서는 안됩니다.하지만 더 나은 솔루션을 찾았을 것입니다. 내 대답을 다시 읽으십시오. –

0

이상적인 방법은 앱을 '핵심', '추가 콘텐츠', '추가 콘텐츠'로 나누고 이러한 종속성을 결합하는 것입니다. 이것은 아마도 코드베이스에 따라 많은 작업이 될 것입니다.

SVN을 소스 코드 관리에 사용하는 경우 기존 코드 기반에서 각 버전에 대해 3 개의 분기를 만들 수 있습니다. 일반적으로 사람들은이를 피하려고합니다.이 브랜치에서 공통적 인 버그를 수정해야하는 경우 브랜치 중 하나에 해당 버그를 수정 한 다음 나머지 브랜치에 병합해야합니다. 어쩌면 다른 소스 저장소가 그런 종류의 상황을 더 잘 처리 할 수도 있지만, SVN의 경우 이것이 유일한 방법이라고 생각합니다.

버전 관리는 maven을 사용합니다. "core", "additional stuff", "additional stuff"접근법을 취하면 maven이 도움이됩니다. 왜냐하면 pom을 사용하여 각 구성 요소의 버전을 깨끗하게 추적 할 수 있기 때문입니다.

편집 : Bill의 제안이 아마도 가장 실용적입니다. 마지막 플래그를 사용하면 컴파일러는 도달 할 수없는 코드를 버려야합니다.

관련 문제