[java] Maven : 담당자가 사용할 수없는 jar를 J2EE 프로젝트에 포함하는 방법은 무엇입니까?

내 J2EE 프로젝트에는 독점 라이브러리이기 때문에 Maven 저장소에서 사용할 수없는 몇 가지 종속성이 있습니다. 이러한 라이브러리는 런타임에 사용할 수 있어야하므로 target /…/ WEB-INF / lib …에 복사해야합니다.

지금은 POM에서 시스템 종속성으로 나열하고 있지만이 방법을 사용하면 컴파일 중에 대상 빌드에 복사되지 않는다는 문제가 있습니다. 또한이 방법은 그다지 우아하지 않습니다.

그렇다면 Maven에 통합하는 가장 좋은 방법은 무엇입니까?

참고 : 내 자신의 Maven 저장소를 만들고 싶지 않습니다.



답변

자신의 리포지토리를 설정하고 싶지 않다고 말했듯이 이것이 도움이 될 것입니다.

당신이 사용할 수있는 설치 파일을 목표 로 받는다는 설치 – 플러그인 로컬 저장소에 파일을 설치합니다. 각 파일에 대해 Maven 호출을 사용하여 스크립트를 만들고 jar와 함께 보관하면 사용자 (및 액세스 권한이있는 다른 사람)가 로컬 저장소에 jar (및 관련 pom 파일)를 쉽게 설치할 수 있습니다.

예를 들면 :

mvn install:install-file -Dfile=/usr/jars/foo.jar -DpomFile=/usr/jars/foo.pom
mvn install:install-file -Dfile=/usr/jars/bar.jar -DpomFile=/usr/jars/bar.pom

아니면 그냥

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0 -Dpackaging=jar

그런 다음 프로젝트에서 정상적으로 종속성을 참조 할 수 있습니다.

그러나 가장 좋은 방법은 내부 원격 저장소를 설정하는 것이며 Nexus를 직접 사용하는 것이 좋습니다 . 필요한 경우 개발 상자에서 실행할 수 있으며 오버 헤드가 최소화됩니다.


답변

이 문제에 대한 빠른 해결책을 원하는 사람들을 위해 :

<dependency>
  <groupId>LIB_NAME</groupId>
  <artifactId>LIB_NAME</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/WebContent/WEB-INF/lib/YOUR_LIB.jar</systemPath>
</dependency>

라이브러리에 고유 한 그룹 ID와 아티팩트 이름을 지정하고 파일 시스템의 위치를 ​​가리 킵니다. 당신은 갈 수 있습니다.

물론 이것은 당신의 컴퓨터에서만 작동하고 libs에 대한 경로를 변경하지 않는 경우에만 작동하는 더러운 빠른 수정입니다. 그러나 어떤 경우에는 실행하고 몇 가지 테스트를 수행하는 것이 원하는 전부입니다.

편집 : 그냥 질문을 다시하고 사용자가 이미 내 솔루션을 임시 수정으로 사용하고 있음을 깨달았습니다. 나는이 질문에 오는 다른 사람들을위한 빠른 도움으로 내 대답을 남길 것입니다. 동의하지 않는 사람이 있으면 댓글을 남겨주세요. 🙂


답변

프로젝트 아래에 저장소 폴더를 만듭니다. 해 보자

${project.basedir}/src/main/resources/repo

그런 다음이 저장소에 사용자 지정 jar를 설치합니다.

mvn install:install-file -Dfile=[FILE_PATH] \
-DgroupId=[GROUP] -DartifactId=[ARTIFACT] -Dversion=[VERS] \
-Dpackaging=jar -DlocalRepositoryPath=[REPO_DIR]

마지막으로 프로젝트 pom.xml에 다음 저장소 및 종속성 정의를 추가합니다.

<repositories>
    <repository>
        <id>project-repo</id>
        <url>file://${project.basedir}/src/main/resources/repo</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>[GROUP]</groupId>
        <artifactId>[ARTIFACT]</artifactId>
        <version>[VERS]</version>
    </dependency>
</dependencies>


답변

이러한 라이브러리를 호스팅 할 로컬 저장소를 설정해야합니다. 정확히 그렇게하는 많은 프로젝트가 있습니다. 예를 들어 Artifactory .


답변

Jenkins 빌드를 사용하는 경우 솔루션이 작동하지 않습니다! pom이 Jenkins 빌드 서버 내에서 실행되면 Jenkins 실행 pom이 엔터프라이즈 저장소에서 이러한 파일을 다운로드하려고 시도하므로 이러한 솔루션이 실패합니다.

src / main / resources / lib 아래에 jar를 복사합니다 (lib 폴더 생성). 이들은 프로젝트의 일부이며 배포 서버로 이동합니다. 배포 서버에서 시작 스크립트의 클래스 경로에 src / main / resources / lib / *가 포함되어 있는지 확인합니다. 비올라.


답변

개인 로컬 저장소 (예 : 홈 디렉토리 아래의 .m2 / repository)에 설치할 수 있습니다. 자세한 내용은 여기에서


답변

내가 잘 이해하고 있다면 컴파일 단계에서 종속성을 내 보내면 필요한 각 라이브러리를 수동으로 검색 할 필요가 없으므로 mojo copy-dependencies를 사용할 수 있습니다 .

귀하의 경우에 유용 할 수 있기를 바랍니다 ( 예제 )