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


100

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

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

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

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


7
정말 당신이 메이븐 저장소를 만드는 당신의 결정을 검토한다고 생각합니다. 전혀 어렵지 않으며 100 % 가치가 있습니다.
Robert Munteanu

7
Maven 저장소 생성의 가치는 상황에 따라 다릅니다.
yincrash

답변:


54

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

당신이 사용할 수있는 설치 파일을 목표 로 받는다는 설치 - 플러그인 로컬 저장소에 파일을 설치합니다. 각 파일에 대해 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를 직접 사용하는 것이 좋습니다 . 필요한 경우 개발 상자에서 실행할 수 있으며 오버 헤드가 최소화됩니다.


1
감사합니다.이 방법은 지금 저에게 잘 작동합니다. 그 파일이 자동으로 로컬 담당자에 설치되는되고 그래서 POM 확장 : pastebin.ca/1504318
삼손을

기꺼이 도와 주지만 다른 사람들이 말했듯이 가장 좋은 방법은 Maven 저장소 관리자를 사용하는 것입니다. 이 접근 방식은 잘 확장되지 않습니다.
Rich Seller

4
나를 위해 일한 명령 : "mvn install : install-file -Dfile = cassandra-jdbc-1.1.1.jar -DgroupId = org.apache-extras.cassandra-jdbc -DartifactId = cassandra-jdbc -Dversion = 1.1.1 -Dpackaging = 항아리 "
Mazrick

193

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

<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에 대한 경로를 변경하지 않는 경우에만 작동하는 더러운 빠른 수정입니다. 그러나 어떤 경우에는 실행하고 몇 가지 테스트를 수행하는 것이 원하는 전부입니다.

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


4
멋있는. 로컬 컴퓨터 경로 대신 URL을 지정하는 방법이 있습니까?
phreakhead

3
완전하고 작동하는 예제에 감사드립니다 !!! 금붕어를 잡으면 세 가지 소원이 이루어 지길 바랍니다. :)
johndodo

14
이 자체 포함 (pom.xml 파일에서) 같이이 허용 대답해야
비 크람

2
안녕하세요 Rajarshee 님, 그룹 및 이슈 ID는 완전히 임의적입니다. 파일 시스템의 jar 경로가 이것이 작동하는 데 중요한 모든 것입니다. 실제로 jar는 Maven 종속성이 아니기 때문에 Maven에게 하나처럼 취급하라고 말하고 있습니다.
Ric Jafe 2015 년

1
2016 년에는 작동하지 않는 것 같습니다. 빌드는 경로를 인식하지만 음영 처리 된 jar에 코드를 포함하지 않습니다. 쥐 ...
markthegrea

24

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

${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>

1
이것은 나를 위해 아주 잘 작동했습니다. 추신 : "src"안에 넣는 것이 옳지 않은 것처럼 보이기 때문에 로컬 저장소에 대해 다른 디렉토리를 권장합니다 (소스가 아닙니다!)
davidfrancis

1
그것은 매력처럼 작동했습니다. Ant에서 Maven으로 이전 프로젝트를 마이그레이션 중이며 웹 저장소에서 찾을 수없는 라이브러리가 몇 개 있습니다.
Paulo Pedroso

주의 : -DlocalRepositoryPath의 값이로 끝나지 않으면 /(예 : 폴더 표시) groupId로 repo가 ​​생성됩니다. 예 : 그룹 ID가 foo.com이고 localRepositoryPath가 repo이면 repo 폴더는 repo.foo.com.
Sheshadri Mantha

이 절차는 주로 Java 프로젝트 및 파일 시스템에 사용되는 maven 빌드 자동화 도구를 사용하여 시스템 저장소 관리에 로컬 프로젝트입니다.
Oleksii Kyslytsyn

8

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


4
용어의 요점은 로컬 저장소가 아닌 내부 원격 저장소입니다. 로컬 저장소는 로컬 파일 시스템 종속성이 다운로드되는 저장소입니다.
Rich Seller

3

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

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


2

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


7
예, 그렇게 할 수 있습니다.하지만 프로젝트를 빌드하려는 모든 사람에게 X, Y 파일을 Z 디렉토리에 넣어야하므로 작업이 정말 복잡하다고 말해야합니다. 결국 Maven을 사용하여 빌드 프로세스를 단순화하고 싶습니다.
삼손

2

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

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


2

@Ric Jafe의 솔루션이 저에게 효과적이었습니다.

이것이 바로 제가 찾던 것입니다. 연구 테스트 코드를 위해 그것을 밀어내는 방법. 멋진 것은 없습니다. 그래, 나는 그들이 모두 말하는 것을 압니다 :) 다양한 maven 플러그인 솔루션은 내 목적에 과잉 인 것 같습니다. pom 파일과 함께 타사 libs로 나에게 주어진 항아리가 있습니다. 빨리 컴파일 / 실행하고 싶습니다. 내가 파이썬에 사소하게 적용한이 솔루션은 저에게 놀라운 일이되었습니다. 내 pom에 잘라서 붙여 넣었습니다. 이 작업에 대한 Python / Perl 코드는이 Q & A에 있습니다. jar를 설치하지 않고 maven 2 빌드 클래스 경로에 추가 할 수 있습니까?

def AddJars(jarList):
  s1 = ''
  for elem in jarList:
   s1+= """
     <dependency>
        <groupId>local.dummy</groupId>
        <artifactId>%s</artifactId>
        <version>0.0.1</version>
        <scope>system</scope>
        <systemPath>${project.basedir}/manual_jars/%s</systemPath>
     </dependency>\n"""%(elem, elem)
  return s1

위의 솔루션은 xx.jar에 대한 'dependencies.dependency.systemPath'가 프로젝트 디렉토리 내의 파일을 가리켜서는 안됩니다. 참조 stackoverflow.com/questions/10935135/...
sarah.ferguson


1

혼자 설치해도 작동하지 않았습니다.

mvn deploy:deploy-file -Durl=file:///home/me/project/lib/ \
  -Dfile=target/jzmq-2.1.3-SNAPSHOT.jar -DgroupId=org.zeromq \  
  -DartifactId=zeromq -Dpackaging=jar -Dversion=2.1.3
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.