대중적인 접근 방식의 문제
인터넷에서 찾을 수있는 대부분의 답변은 로컬 저장소에 종속성을 설치하거나 "시스템"범위를 지정하고 pom
프로젝트 소스와의 종속성을 분배하도록 제안합니다 . 그러나이 두 솔루션 모두 실제로 결함이 있습니다.
"로컬 저장소에 설치"접근 방식을 적용하지 않아야하는 이유
로컬 리포지토리에 대한 종속성을 설치해도 그대로 유지됩니다. 이 아티팩트에 액세스 할 수 있으면 배포 아티팩트가 제대로 작동합니다. 문제는 대부분이 리포지토리가 로컬 컴퓨터에 상주하므로 다른 컴퓨터에서이 종속성을 해결할 수있는 방법이 없다는 것입니다. 아티팩트를 특정 머신에 의존하게 만드는 것은 처리 방법이 아닙니다. 그렇지 않으면이 종속성은 해당 프로젝트로 작업하는 모든 컴퓨터에 로컬로 설치해야하며 이는 나아지지 않습니다.
"시스템 범위"접근 방식을 적용하지 않아야하는 이유
"시스템 범위"접근 방식에 의존하는 jar는 저장소에 설치되거나 대상 패키지에 연결되지 않습니다. 그렇기 때문에 배포 패키지가 사용될 때 이러한 종속성을 해결할 수있는 방법이 없습니다. 시스템 범위 사용이 더 이상 사용되지 않는 이유라고 생각합니다. 어쨌든 더 이상 사용되지 않는 기능에 의존하고 싶지 않습니다.
정적 프로젝트 내 저장소 솔루션
이것을 당신의 pom
다음에 넣은 후 :
<repository>
<id>repo</id>
<releases>
<enabled>true</enabled>
<checksumPolicy>ignore</checksumPolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
<url>file://${project.basedir}/repo</url>
</repository>
x.y.z
Maven 형식의 그룹 ID를 가진 각 아티팩트에 대해 아티팩트 검색시 프로젝트 디렉토리 내에 다음 위치가 포함됩니다.
repo/
| - x/
| | - y/
| | | - z/
| | | | - ${artifactId}/
| | | | | - ${version}/
| | | | | | - ${artifactId}-${version}.jar
이에 대한 자세한 내용은 이 블로그 게시물을 참조하십시오 .
Maven을 사용하여 프로젝트 저장소에 설치
이 구조를 직접 작성하는 대신 Maven 플러그인을 사용하여 항아리를 아티팩트로 설치하는 것이 좋습니다. 따라서 repo
폴더 아래의 프로젝트 저장소에 아티팩트를 설치 하려면 다음을 실행하십시오.
mvn install:install-file -DlocalRepositoryPath=repo -DcreateChecksum=true -Dpackaging=jar -Dfile=[your-jar] -DgroupId=[...] -DartifactId=[...] -Dversion=[...]
이 방법을 선택하면 다음과 같이 저장소 선언을 단순화 할 수 있습니다 pom
.
<repository>
<id>repo</id>
<url>file://${project.basedir}/repo</url>
</repository>
도우미 스크립트
각 lib에 대한 설치 명령을 실행하는 것은 다소 성 가시고 오류가 발생하기 쉽기 때문에 폴더에서 프로젝트 저장소로 모든 jar를 자동으로 설치 하는 유틸리티 스크립트 를 작성 lib
하고 모든 메타 데이터 (groupId, artifactId 등)를 자동으로 해결했습니다. 파일 이름. 이 스크립트는 또한에 복사하여 붙여 넣을 수 있도록 종속성 xml을 인쇄합니다 pom
.
대상 패키지에 종속성 포함
프로젝트 내 저장소를 만들면 소스와 함께 프로젝트의 종속성을 배포하는 문제가 해결되었지만 프로젝트의 대상 아티팩트는 게시되지 않은 jar에 의존하므로 설치할 때 그것은 저장소에 그것은 해결할 수없는 의존성을 가질 것입니다.
이 문제를 해결하려면 대상 패키지에 이러한 종속성을 포함시키는 것이 좋습니다. 이것은 어셈블리 플러그인 또는 OneJar 플러그인으로 더 잘 할 수 있습니다 . OneJar의 공식 문서는 이해하기 쉽습니다.