2014-10-28 9 views
11

2 가지 종속성 사이에 약간의 비 호환성으로 인해, 종속성 중 하나의 음영 버전을 만들어야했습니다. 이것은 내 프로젝트가 이제 로컬 .jar 파일에 의존한다는 것을 의미합니다.Maven이 문제를 해결하기 전에 로컬 jar 종속성을 라이프 사이클의 일부로 설치하십시오.

내가 이전에 단지 mvn install를 실행하기 전에, 내 로컬 저장소에이 .JAR를 설치하는 mvn install-file를 사용하여 완벽하게 괜찮다고

:

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=lib/my-custom-jar-1.0.0.jar 
mvn install 

하지만, 내 프로젝트는 지금 사람 일뿐만 아니라, 자동화 된 빌드 서버에있을 것입니다 mvn clean install과 그 밖의 것은하지 마십시오.

오랫동안 찾아서 몇 가지 해결책을 찾았지만 완벽한 것은 없습니다.

아래에서 답을 찾은 해결책을 적어 두겠습니다. 그러나이 문제를 해결하기 위해 누군가가 더 나은 아이디어를 가지기를 기대하면서이 질문을 게시하고 있습니다.

+0

음영 처리 된 버전이 Maven-Shade-Plugin으로 생성되었거나 Maven 빌드로 빌드 되었습니까? – khmarbaise

+0

모두 같네요. Maven-Shade-Plugin을 라이프 사이클의 일부로 포함하는 Maven 빌드에 의해 빌드됩니다. 이것이 내가 의존성 충돌로 겪었던 문제에 대한 해결책이었습니다. [내가 만든 이전 질문을 참조하십시오] (http://stackoverflow.com/questions/24066027/spring-core-dependency-version-error-with-a-jenkins-plugin) – Wiwiweb

+0

[ 메이븐 2 클래스 패스를 설치하지 않고 빌드?] (http://stackoverflow.com/questions/364114/can-i-add-jars-to-maven-2-build-classpath-without-installing-them) – Stephan

답변

27

여기 내가 시도한 몇 가지 솔루션,하지만 내 용도로 좋은하지 않았다 :

1. 받는다는 설치 - 플러그인

을 아이디어는 설치의 일부로 설치 파일을 목표를 추가하는 것입니다 POM을이를 추가하여 라이프 사이클 :

<plugin> 
    <artifactId>maven-install-plugin</artifactId> 
    <version>2.5.2</version> 
    <executions> 
    <execution> 
     <phase>validate</phase> 
     <goals> 
     <goal>install-file</goal> 
     </goals> 
     <configuration> 
     <file>lib/my-custom-jar-1.0.0.jar</file> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

[...] 

<dependency> 
    <groupId>org.me</groupId> 
    <artifactId>my-custom-jar</artifactId> 
    <version>1.0.0</version> 
</dependency> 

그러나, 바로 그 첫 번째 목표, validate에, Maven은 의존성 전에 해결하려고합니다 설치 파일이 실행됩니다.

깨끗한 목표를 사용하는 아이디어를 보았습니다. Annoyingly 이것은 별도의 명령 (mvn clean && mvn install)을 수행 할 때 작동하지만 하나의 mvn 명령 (mvn clean install)에서 둘 다 수행하면 Maven은 종속성을 먼저 해결합니다. 이것에 대한 해결책이있을 수 있을까요?

2. 멀티 모듈 프로젝트

아이디어, seen in this Stack Overflow answer, 당신은 당신의 부모 치어의 파일을 설치하고, 자녀의 치어의 종속성을 추가한다는 것입니다. Maven은 의존성을 개별적으로 만 해결할 것이므로 이것이 작동해야합니다.

그러나 내 프로젝트는 단일 모듈이며이 문제를 해결하기 위해 가짜 부모를 만드는 것은 지나친 복잡성과 추한 해킹처럼 보입니다. 이 이런 상황에 대해 정확히 만든 것처럼이 보이지만 기본 디렉토리와

3. 시스템의 범위는

<dependency> 
    <groupId>org.me</groupId> 
    <artifactId>my-custom-jar</artifactId> 
    <version>1.0.0</version> 
    <scope>system</scope> 
    <systemPath>${basedir}/lib/my-custom-jar-1.0.0.jar</systemPath> 
</dependency> 

, 시스템 범위는 실제로 의존성이 프로젝트를 실행하겠습니다 모든 시스템에있을 것으로 예상 , 그래서 그것은 .war에 패키징되지 않아 내 프로젝트가 기능하지 않게됩니다.

4. addjars - 받는다는 - 플러그인

This custom plugin found here는 컴파일하는 동안 치어에 추가하여 .war 파일에서의 .jar을 포함한다.

<plugin> 
    <groupId>com.googlecode.addjars-maven-plugin</groupId> 
    <artifactId>addjars-maven-plugin</artifactId> 
    <version>1.0.5</version> 
    <executions> 
    <execution> 
     <goals> 
     <goal>add-jars</goal> 
     </goals> 
     <configuration> 
     <resources> 
      <resource> 
      <directory>${basedir}/lib</directory> 
      <includes> 
       <include>**/my-custom-jar-1.0.0.jar</include> 
      </includes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

이것은 대부분의 일반적인 경우에 작동합니다. 그러나 실제 pom에서 사용자 정의 .jar에 대한 종속성을 표시하지 않으므로 IDE에 많은 클래스가 누락되므로 사용자 정의 .jar을 수동으로 외부 라이브러리로 추가해야합니다.

이것은 여전히 ​​다소 해킹되어 일부 특수한 경우에는 작동하지 않습니다 (hpi : Jenkins 디버깅 용으로 실행하면 오류가 발생 함). 게다가 제 코드가 써드 파티 플러그인에 의존하지 않았 으면합니다.

5.

인 - 디렉토리 메이븐 저장소

이 게시물을 만든 후이 솔루션을 발견, 나는 그것을 꽤 행복 해요.

내 질문에 mvn install-file 명령을 수행하는 것과 거의 같은 결과입니다. 단, 결과를 저장하고 프로젝트 내에있는 리포지토리에 사용자 지정 라이브러리를 설치하여 프로젝트의 일부로 유지해야합니다.

이 명령을 사용하여 라이브러리를 사전 설치해야합니다.

mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file \ 
-Dfile=lib/cloudfoundry-client-lib-shaded-1.0.3.jar \ 
-DlocalRepositoryPath=lib 

리포지토리가 lib 폴더에 만들어지면이 명령을 다시 수행 할 필요가 없습니다.

당신이 당신의 치어에이 저장소를 사용할 것을 나타냅니다 :

<repository> 
    <id>Local repository</id> 
    <url>file://${basedir}/lib</url> 
</repository> 

[...] 

<dependency> 
    <groupId>org.me</groupId> 
    <artifactId>my-custom-jar</artifactId> 
    <version>1.0.0</version> 
</dependency> 

이 솔루션은 힘 당신이 당신의 SCM에 추가 폴더의 무리를 저지하기 위해,하지만 나를 위해 관리 단점이었고, 난 이것에 만족했다.

+0

좋은 답변. # 4에서 "외부 라이브러리로 사용자 정의 .jar를 수동으로 추가해야합니다"는 어떻게됩니까? – Gobliins

+0

IDE가 올바르게 작동하는지 확인하는 것입니다. 설정 위치는 IDE에 따라 다릅니다. – Wiwiweb

+3

3 년이나 더 나은 점은 없습니까? 우리는 여전히 이것을 할 수있는 방법이 없습니다! – markthegrea

1

음영 실행을 하나의 하위 프로젝트 (S라고 함)로 수행하면 문제 종속성의 버전 (a)을 얻고 자신의 G/A/V 결과를 생성합니다. 하위 프로젝트의 주요 출력을 생성하도록 음영을 구성합니다. 즉, S는 그룹을 생성합니다 : artifact : 버전은 완전히 다른 두 가지 버전이 필요하다는 것을 시작하는 것의 좌표와 다릅니다.

다른 하위 프로젝트에서 음영 처리 된 버전을 가져 오는 종속성을 선언하기 만하면 음영 처리되지 않은 다른 버전도 선언 할 수 있습니다.

음영 처리시 패키지의 이름을 변경했다고 가정합니다.

설치할 필요가 없습니다.

+0

내가 무슨 말을하는지 잘 모르겠다. 두 가지 의존성은 org.cloudfoundry : cloudfoundry-client-lib와 org.jenkins-ci.plugins : plugin입니다. 둘 다 서로 다른 버전의 스프링 코어에 의존합니다. 나는 "cloudfoundry-client-lib-shaded.jar"를 만들어서 spring-core로 이름을 바꿨다. 이제 이것을 설치해야한다. – Wiwiweb

+0

설치하지 않아도됩니다. 단지 그늘 플러그 인에 의해 원자로에 추가 될 필요가 있습니다. shadedArtifactAttached true로 처리합니다. – bmargulies