기존 코드베이스에서 Java로 3 가지 소프트웨어 에디션을 만들 계획입니다. 가장 좋은 방법은 무엇입니까? 각 판마다 하나씩 3 개의 다른 프로젝트를 만들어야합니까? 에디션을 관리하기위한 도구도 있습니까?소프트웨어 에디션을 관리합니다
답변
제 생각에는 가능한 한 단일 코드베이스를 유지하고 전환을 위해 일종의 플래그를 사용하는 것입니다.
가능하지 않다면 가능한 한 똑같이 유지하고 더 큰 프로젝트에서 더 작은 프로젝트를 하위 프로젝트로 사용하도록하십시오. 가능한 경우 자동으로 일부 기능을 사용 가능하게 설정하십시오 (예 : 각각의 프로젝트 그것은 자신의 메인을 가질 수 있습니다, 다른 빌드는 기능을 활성화하기 위해 플래그를 설정하는 다른 메인을 호출 할 수 있습니다.
플래그가 최종적인 경우 프로젝트에 불필요한 코드가 전혀 표시되지 않도록해야합니다.
마지막으로, 최악의 경우, 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"은 오직 다른 세 가지를 알고 있습니다.
구성이 필요 없기 때문에 이것은 좋은 해결책이 될 것입니다. 사실, 데모에서 지불하기 위해 유료 항아리 만 보내야 만합니다. 메인 및 데모 항아리는 재사용되고 그대로 유지됩니다. 아르.
자바 컴파일의 최종 플래그에 대한 링크가 있습니까? 빠른 검색으로 많은 정보를 얻을 수 없었습니다. 사용하지 않는 코드는 어떻게 버릴까요? – user121196
컴파일 플래그가 아니란 뜻으로, "private final boolean INCLUDE_CODE = false"와 같이 변수가 final 인 경우를 의미합니다. "if (INCLUDE_CODE) myVar = new SpecialClass() ; " 코드로 컴파일되지 않아야합니다. 그것은 결코 사실 일 수없고 그것을 최적화 할 수 없다는 것을 인식해야합니다. 이것이 SpecialClass가 참조되는 유일한 장소라면 SpecialClass가 프로젝트에 전혀 추가되어서는 안됩니다.하지만 더 나은 솔루션을 찾았을 것입니다. 내 대답을 다시 읽으십시오. –
이상적인 방법은 앱을 '핵심', '추가 콘텐츠', '추가 콘텐츠'로 나누고 이러한 종속성을 결합하는 것입니다. 이것은 아마도 코드베이스에 따라 많은 작업이 될 것입니다.
SVN을 소스 코드 관리에 사용하는 경우 기존 코드 기반에서 각 버전에 대해 3 개의 분기를 만들 수 있습니다. 일반적으로 사람들은이를 피하려고합니다.이 브랜치에서 공통적 인 버그를 수정해야하는 경우 브랜치 중 하나에 해당 버그를 수정 한 다음 나머지 브랜치에 병합해야합니다. 어쩌면 다른 소스 저장소가 그런 종류의 상황을 더 잘 처리 할 수도 있지만, SVN의 경우 이것이 유일한 방법이라고 생각합니다.
버전 관리는 maven을 사용합니다. "core", "additional stuff", "additional stuff"접근법을 취하면 maven이 도움이됩니다. 왜냐하면 pom을 사용하여 각 구성 요소의 버전을 깨끗하게 추적 할 수 있기 때문입니다.
편집 : Bill의 제안이 아마도 가장 실용적입니다. 마지막 플래그를 사용하면 컴파일러는 도달 할 수없는 코드를 버려야합니다.
- 1. SVN이 컴퓨터간에 설정을 관리합니다.
- 2. 데이터베이스의 내역을 유지 관리합니다.
- 3. Eclipse, 2 개의 에디션을 결합하는 방법
- 4. Eclipse Helios가 Weblogic 9.2를 관리합니다.
- 5. C++ construtor에서 bad_alloc 예외를 관리합니다.
- 6. Allegro Common Lisp 소프트웨어 문제
- 7. 온라인 소프트웨어 추적 소프트웨어
- 8. 크기가 변경되는 컨트롤 목록의 레이아웃을 관리합니다.
- 9. Java - 많은 수의 스레드를 멀티 코어로 관리합니다.
- 10. Svn은 PHP를 사용하여 사용자, 저장소, 공간을 관리합니다
- 11. C에서 데이터 구조를 초기화하여 메모리 풀을 관리합니다.
- 12. jQuery keypress() 핸들러 : 이벤트 흐름을 관리합니다.
- 13. 무비 클립 도면을 직접 관리합니다. AS3
- 14. 아이폰 프로젝트에서 빌드 타겟 변수를 관리합니다.
- 15. 클라이언트에서 부스트를 사용하여 1000 + 연결을 관리합니다.
- 16. Telerik 병합 이전에 WebAii Framework 무료 에디션을 찾고 있습니다.
- 17. Java 표준 에디션을 학습 한 후 어느 경로를 사용해야합니까?
- 18. 용어 : 소프트웨어 인터페이스, 소프트웨어 구성 요소, 소프트웨어 구성 요소, 소프트웨어 모듈의 차이점
- 19. 소프트웨어 응용 프로그램을 소프트웨어 어플라이언스로 변환하려면 어떻게합니까?
- 20. 무료 소프트웨어 개발 도구는 소프트웨어 개발을 추적합니까?
- 21. 소프트웨어 설계 및 소프트웨어 설계에 관한 설명서
- 22. (하드웨어 및 소프트웨어) 자산을 관리하는 소프트웨어
- 23. 좋은 소프트웨어 아키텍처와 간단한 소프트웨어 아키텍처의 예
- 24. "소프트웨어 부품"데이터베이스
- 25. 자치 소프트웨어
- 26. 소프트웨어 데이터베이스
- 27. 소프트웨어 테스팅
- 28. 소프트웨어 인터럽트
- 29. 소프트웨어 업데이트
- 30. 설치 소프트웨어?
어떤 유형의 응용 프로그램입니까? 이것은 데스크톱 응용 프로그램, 웹 응용 프로그램, 로컬로 설치할 수있는 인트라넷 응용 프로그램입니까? 더 자세하게 제공할수록 더 나은 답변을 얻을 수 있습니다. –
웹 기반 또는 독립형 (더 가벼운 버전)이 될 수있는 Java 응용 프로그램입니다. 웹 기반 버전의 tomcat에서 실행되고 데이터베이스가 필요합니다. – user121196