복붙노트

[SPRING] Jenkins Plugin의 spring-core 의존성 버전 오류

SPRING

Jenkins Plugin의 spring-core 의존성 버전 오류

Spring-core 3.2.2 (cloudfoundry-client-lib)가 필요한 라이브러리를 사용하는 Jenkins 플러그인을 만들려고합니다. 간단히 mvn 명령을 사용하여 스켈레톤 플러그인을 만든 다음 paven.xml에 Maven 종속성을 추가하고 라이브러리를 사용하는 몇 가지 간단한 코드 행을 추가했습니다. 내 의존성없이 골격 플러그인을 실행하는 데 어떤 문제도 발생하지 않습니다.

"mvn package"로 컴파일 할 때 테스트 오류가 발생합니다.

WARNING: Failed to scout hudson.security.PAMSecurityRealm
java.lang.InstantiationException: java.lang.NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable

스프링 코어 3.1.0에 등장한 클래스 인 것 같습니다. 그래서 Maven 의존성 트리를 살펴 보았습니다.

[INFO] --- maven-dependency-plugin:2.3:tree (default-cli) @ stackato-jenkins ---
[INFO] org.wiwiweb:cf-test-jenkins:hpi:1.0-SNAPSHOT
[INFO] \- org.cloudfoundry:cloudfoundry-client-lib:jar:1.0.2:compile
[INFO]    \- org.springframework:spring-webmvc:jar:3.2.2.RELEASE:compile
[INFO]       \- org.springframework:spring-core:jar:2.5.6.SEC03:compile

그래서 Maven은 spring-webmvc 3.2.2 때문에 spring-core 2.5.6을 사용하고 있다고 말해 줍니까? 이것은 이상한 일입니다. 왜냐하면, 온라인으로 보면, spring-webmvc 3.2.2는 spring-core 3.2.2에 의존합니다. 나무의 장황한 버전을 보면, 젠킨스 코어는 스프링 코어 2.5.6에 달려있는 것처럼 보입니다 ... 이것은 문제가 젠킨스에서 온 것임을 의심스럽게합니다.

어쨌든, 만약 버전 충돌이 있다면, 명시 적으로 말하자면 Maven의 결정을 무시해서 pom.xml에 spring-core 3.2.2를 쓰면 문제가 해결 될 것입니다. 내가 한 다음 컴파일 오류가 발생하지 않았다. 문제가 해결되었습니다! ... 아닙니다.

런타임시 젠킨스에서이 플러그인을 활성화하고 이것을 사용하여 빌드를 실행 한 후 코드를 추가 한 라이브러리를 사용하는 라인으로 실행하자마자 젠킨스 출력이 다음과 같이 알려줍니다.

FATAL: org.springframework.util.CollectionUtils.unmodifiableMultiValueMap(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/util/MultiValueMap;
java.lang.NoSuchMethodError: org.springframework.util.CollectionUtils.unmodifiableMultiValueMap(Lorg/springframework/util/MultiValueMap;)Lorg/springframework/util/MultiValueMap;

unmodifiableMultiValueMap ()은 spring-core 3.1에서 추가 된 메소드입니다. 그래서 Jenkins는 플러그인의 pom에서 최신 버전을 원한다고 명시 적으로 말했지만, 스프링 코어의 이전 버전으로 플러그인을 계속 실행하려고합니다. XML!

그래서 나는 이것에 붙어있다. Maven 또는 Jenkins 문제인지 확실하지 않습니다. 나는 두 가지 질문으로 모든 것을 요약 할 것이다.

당신이 제공 할 수있는 힌트를 미리 알려 주셔서 감사합니다. 이것이 나의 진도를 막아 주며 잠시 동안이 문제를 해결하려고 노력해 왔습니다.

해결법

  1. ==============================

    1.Jenkins 설치에서 플러그인이 아니라 종속성을 가져 오는 경우 솔루션 구현이 실제로 매우 쉽습니다. 젠킨스 문서에 따르면 젠킨스 플러그인의 pom.xml에 빌드에 maven-hpi-plugin을 추가하고 먼저 플러그인 클래스를로드하도록 설정합니다.

    Jenkins 설치에서 플러그인이 아니라 종속성을 가져 오는 경우 솔루션 구현이 실제로 매우 쉽습니다. 젠킨스 문서에 따르면 젠킨스 플러그인의 pom.xml에 빌드에 maven-hpi-plugin을 추가하고 먼저 플러그인 클래스를로드하도록 설정합니다.

    <build>
        <plugins>
            <plugin>
                <groupId>org.jenkins-ci.tools</groupId>
                <artifactId>maven-hpi-plugin</artifactId>
                <configuration>
                    <pluginFirstClassLoader>true</pluginFirstClassLoader>
                </configuration>
            </plugin>
        </plugins>
    </build>
    
  2. ==============================

    2.Jenkins가 내부적으로 사용하는 플러그인과 다른 버전의 Spring을 사용하는 플러그인을 좋아하지 않는 것처럼 Maven Shade 플러그인을 사용하여 CF 클라이언트 라이브러리를 "음영 처리"하십시오.

    Jenkins가 내부적으로 사용하는 플러그인과 다른 버전의 Spring을 사용하는 플러그인을 좋아하지 않는 것처럼 Maven Shade 플러그인을 사용하여 CF 클라이언트 라이브러리를 "음영 처리"하십시오.

    비록 당신의 플러그인이 Spring을 직접 사용하지는 않지만 CF 라이브러리가 사용하더라도, 나는 이것이 여전히 적용된다고 믿습니다. jenkinsci-dev 메일 링리스트에 음영을 제안한 사람은 Jenkins 플러그인 개발에 참여한 것으로 보이므로 다른 사람들보다 더 많이 알 수 있습니다.

    즉, cf-client-lib의 소스 코드를 얻게 될 것이고, cf-client-lib는 이미 org.codehaus에 음영을 사용하고 있기 때문에 pom.xml도 org.springframework 패키지의 음영을 고려하도록 변경할 것입니다. jackson 패키지) Jenkins 플러그인에서 cf-client-lib의 "shaded"버전을 사용할 것입니다.

  3. from https://stackoverflow.com/questions/24066027/spring-core-dependency-version-error-with-a-jenkins-plugin by cc-by-sa and MIT license