가능합니까?
예 당연 하죠. 나는 과거 구조에서 이와 같은 몇 가지 프로젝트를 가지고 있습니다. 여기서 약간의 시작을 바랍니다.
함께 물건을 짜는 데 사용할 Maven의 두 가지 주요 기능이 있습니다.
나누고 정복
여러 독립 프로젝트로 프로젝트를 분할해야합니다. 여기서 독립적으로 프로젝트 외부의 코드에 대한 모든 참조는 소스 트리를 직접 병합하지 않고 Maven의 종속성을 통해 수행됩니다.
소스 트리의 상태에 따라 많은 작업을 나타낼 수 있습니다. 그것은 당신이 Maven에게 구두를 돌리는 것이 아니라 코드베이스를 구조화하고 살균하는 수단으로 사용한다고 말했습니다. 그것을 도구 상자로 생각하면 훨씬 쉽게 찾을 수 있습니다.
여기보다 :
Maven은 컨벤션 에 크게 의존 하므로 더 잘 정리할수록 Maven이 더 많은 도움을 줄 수 있습니다. 즉, 자체 컨벤션에 더 잘 맞도록 재구성해야 할 수도 있습니다. 여기에 조언을 제공 해야하는 경우 Maven의 컨벤션보다 Maven의 컨벤션에 맞게 물건을 변경하는 것이 훨씬 쉽습니다. 당신의 컨벤션을 이해하십시오.
이러한 프로젝트를 주 응용 프로그램 외부에서 사용할 수 있으면 실제로 독립적 인 라이브러리로 살 수 있으며 maven 종속성을 포함 할 수 있습니다. 응용 프로그램 소스 트리가 아닌 자체 리포지토리에 있어야하며 기본 응용 프로그램의 일부에 의존해서는 안됩니다.
응용 프로그램의 핵심 부분은 일단 프로젝트로 분할되면 모듈로 구성 할 수 있습니다. 일반적으로 앱의 기본 소스 폴더 하위 폴더로 배치합니다.
또한 앱의 부모 POM에는 모듈 선언이 포함됩니다. 또한 앱에 대한 모든 공통 종속성을 배치하고 대부분의 빌드 플러그인 및 해당 구성을 선언합니다. 여기에서는 모듈에서 재사용 할 수있는 응용 프로그램 버전과 같은 속성 그룹을 배치하는 것이 좋습니다. 모든 것이 동일한 버전을 가지고 있고 한 곳에서 버전을 사용하는 경우 관리하기가 훨씬 쉽습니다.
압형
1보다 큰 팀인 경우 Maven 종속성을위한 저장소를 설치하는 것이 좋습니다. 봐 Artifactory , 넥서스 또는 Archiva . POM 파일을 직접 설치하여 POM 파일을 직접 설치할 수 있도록 구성하면 한 번 실행하면 많은 오버 헤드가 발생하지 않지만 올바른 jar를 사용하여 올바른 위치에있는 종속성을 해결하는 데 많은 시간을 절약 할 수 있습니다.
툴링의 주제에 대한 다음 논리적 단계는 지속적인 통합 시스템입니다 ( Jenkins , 더 많은 것이 있습니다). 테스트를 실행하는 소스를 빌드하고 아티팩트로 밀어 넣는 작업을 처리합니다.이 모든 작업을 수행하면 코드 작업 만 수행하고 나머지는 작동합니다.
war maven 으로 앱을 패키징하기 때문에 jar 파일 또는 기타 유사한 작업을 병합하지 않고도 전쟁 빌드를 처리 하고 모든 종속성을 적절한 위치에 배치 할 수 있으므로 걱정할 필요가 없습니다.
예
나는 여기에 훨씬 더 오래 갈 수 있지만 좋은 예는 없습니다. github에서 비슷한 규모의 프로젝트를 찾고 pom 파일과 폴더 계층을 어떻게 구축했는지 확인하십시오. 하나 이상의 봐, 일부는 아무도 정말 화신하지, 다른 사람보다 더 나은 설정을 맞는 진실을하지만 당신은 그것을 수행하는 방법에 대한 당신의 생각에 연료를 충분히 찾을 수 있습니다.
가지고 젠킨스를 예를 들면 :
부모 POM 이 상당히 광범위 하다는 것을 알 수 있습니다 .
이 섹션에서 볼 수 있듯이 모듈을 사용합니다.
<modules>
<module>core</module>
<module>war</module>
<module>test</module>
<module>cli</module>
</modules>
또한 각 모듈은 POM을 포함하는 동일한 이름의 하위 폴더에 해당합니다. 당신이 원하는만큼 중첩 할 수 있지만, 정신 수준 내에서 유지하십시오;).
작은 시작
Maven을 사용한 적이 없다면 모듈을 즉시 시작하지 않는 것이 좋습니다. 천천히 시작하고, 가장 간단한 라이브러리 중 하나를 말하고 maven 프로젝트로 만드십시오. 그런 다음 기본 응용 프로그램을 간단한 maven 프로젝트로 만듭니다. 그 작업이 끝나면 간단한 종속성을 추가 한 다음 첫 번째 모듈 등을 분할하십시오.
Maven은 훌륭한 도구이지만 특히 일이 진행되지 않을 때 목에 심한 통증이 될 수 있습니다. 당신의 첫 번째 여행에서 전체 whammy로 시작하는 것은 재앙을위한 레시피입니다 (나를 위해!).
상황이 조금 이상하면 항상 mvn help:effective-pom
명령을 사용 하여 Maven이 실제로 이해 한 것을 볼 수 있습니다.
플러그인
당신의 의견에서 나는 당신이 원하는 것을 더 잘 이해합니다. 이 경우 플러그인 접근 방식을 사용합니다. 작업을 분리하려는 확장 점의 API를 노출하는 프로젝트를 작성하십시오. 그런 다음이를 구현할 새 프로젝트에서이를 종속성으로 사용할 수 있습니다. 기본 응용 프로그램 에서이 구현에 대한 적절한 종속성을 추가하면 (이번에는 maven 모듈을 사용하지 않음) 계속 진행해야합니다. 결국 주요 응용 프로그램 프로젝트는 외부 프로젝트에서 수행되고 종속성을 통해로드되는 모든 소스 코드를 거의 전달하지 않습니다.
종속성이 전쟁에서 정적으로 빌드되었으므로 핵심이 변경되었는지 여부에 관계없이이 방법으로 전체 애플리케이션을 다시 배치해야합니다. 실제보다 최악의 소리가납니다. 실제로 새로운 변경 사항 만 실제로 빌드되고 나머지는 기본적으로 이전 jar의 사본입니다. 그러나 모든 것이 war 파일에 있으므로 서버를 다시 빌드하고 서버를 중지했다가 다시 시작해야합니다.
더 나아갈 필요가 있다면 불가능하지는 않지만 조금 더 복잡해집니다. OSGI를 살펴 보는 것이 좋습니다 . 다른 구현도 있지만 Apache Felix 를 사용하면 시작할 수 있습니다. 이를 통해 외부 항아리를 가져 와서 적절한 플러그인으로 만들 수 있습니다. 동적 재로드 및 업데이트의 문을 여는 구성 요소의 런타임 수명주기를 훨씬 더 많이 제어 할 수 있습니다. 그러나 코어에 대한 주요 변경 사항이 다시 필요하므로 아마도 좋은 출발점이 아닐 것입니다. 그러나 프로젝트가 잘 분리되어 있고 원하는대로 모든 부품을 분리 한 후에는 업데이트시 응용 프로그램을 시작하고 중지하는 것이 자연스럽게 다음 단계가 될 수 있습니다.
모듈과 종속성의 기본 차이점은 다음과 같습니다.
- 모듈은 기본적으로 하위 응용 프로그램과 같은 기본 응용 프로그램과 동일한 소스 트리에 있습니다.
- 종속성은 어디에나있을 수 있습니다.
여기서 성경을 찾을 수 있습니다 .
이것이 도움이되기를 바랍니다. 행운.