다른 저장소가 없는 경우 Bintray/JCenter에서 마이그레이션

TL;DR 버전


Bintray/JCenter (또는 다른 유사한 서비스) 가 닫힌 후에 프로젝트에 필요한 라이브러리 (Maven dependency) 를 찾을 수 없지만, 로컬 Gradle 캐시에 있습니다. 이 라이브러리를 사용하여 로컬 Maven 저장소를 쉽게 만들 수 있으며, 교체로 사용할 수 있으며, 필요에 따라 문서를 보존할 수 있습니다. (자세한 정보는 see "Finding the cached dependencies in Gradle cache""Setting up a local Maven repository" 세그먼트를 참고하십시오.

그냥 배경이에요.


몇 달 전에 JFrogannounced it is sunsetting는 Bintray와 JCenter를 포함한 일부 서비스를 발표했는데 그 중에서 많은 의존 항목을 위탁 관리했다.MvnRepository에 따르면 JCenter의 경우841,529 indexed jars 최근 몇 년 동안 그 인기가 계속 증가하고 있습니다.🚀

사건의 놀라운 변화


Bintray와 JCenter는 2021년 5월 1일 문을 닫을 계획이었으나 4월 27일 JFrog는 "JCenter를 읽기 전용 저장소로 무기한 유지할 것"이라고 이들의 최초 공지를 업데이트했다.비록 그렇지만, 나는 더 이상 의존항을 방문할 수 없다.나는 그 중 일부는 JCenter에서 위탁 관리한 것이라고 생각한다. 적어도 MvnRepository의 말에 의하면 이렇다고 해서 나는 좀 놀랐다. 그러나 아마도 나는 다른 문제가 있을 것이다. 예를 들어 awrong order of the repositories declarations in Gradle(지금은 기억이 나지 않는다)😅).
어쨌든, 나의 의존항도 Bintray에 위탁되어 있기 때문에, 나는 Bintray와 JCenter에서 동시에 이전하는 것이 가장 좋다고 결정했다.그래서 나는 시도해 보았다. 처음에 나는 매우 비참하게 실패했다. 이것은 나로 하여금 이 문제를 해결하는 심상치 않은 방법을 찾게 했다.

이론과 실천


Bintray/JCenter 프로그램의 닫기와 이동 경로에 대한 블로그와 글을 읽을 때, 그들은 서로 다른 Maven 저장소로 간단하게 전환할 수 있다고 주장한다. (가장 좋은 것은 Maven Central)그들이 통상적으로 언급하지 않는 것은, 만약 당신이 성공한다면, 당신은 자신이 정말 운이 좋다고 생각할 것이다.
많은 경우, 어떤 이유로 전환할 수 없습니다. 예를 들어, 다른 Maven 저장소가 필요한 라이브러리를 위탁 관리하지 않거나, 라이브러리 작성자가 라이브러리의 비교적 새롭거나 곧 발표될 버전만 이전할 계획입니다.때때로 의존항 버전을 업데이트하는 것은 많은 번거로움을 가져오지 않습니다. 특히 직접 의존항에 익숙하고 호환성이 있습니다.이러한 의존항이 전달될 수 있거나, 새 버전이 클라이언트에서 대량의 추가 작업을 필요로 할 때, 이것은 더욱 어려워진다.
내가 해결할 수 없는 모든 의존 관계를 돌이켜 볼 때, 나는 이것이 공원에서 산책하는 것처럼 완전히 상반되는 것이 아니라는 것을 깨달았다.

어떻게 모든 부족한 의존항을 한 번에 찾을 수 있습니까


Gradle cache 덕분에 로컬에서 프로젝트를 구축할 수 있었지만 TeamCity의 자동 지속적인 통합 구축이 실패했습니다(이것도 제가 처음 발견한 문제입니다). 오류는 다음과 같습니다.
> Could not resolve com.datadoghq:dd-sdk-android:1.5.1.
  Required by:
      project :app > project :datadog
   > Could not resolve com.datadoghq:dd-sdk-android:1.5.1.
      > Could not get resource 'https://dl.bintray.com/datadog/datadog-maven/com/datadoghq/dd-sdk-android/1.5.1/dd-sdk-android-1.5.1.pom'.
         > Could not GET 'https://dl.bintray.com/datadog/datadog-maven/com/datadoghq/dd-sdk-android/1.5.1/dd-sdk-android-1.5.1.pom'. Received status code 403 from server: Forbidden
다음 명령을 실행하면 해결할 수 없는 모든 의존 항목을 신속하게 찾을 수 있습니다.
./gradlew :app:dependencies | grep FAILED | grep -v "project :"
설명:
  • :app:dependencies 모든 프로젝트의 의존 관계를 간단하게 열거했다. 왜냐하면 app는 주요 응용 프로그램 모듈이기 때문이다
  • grep FAILED 해석 불가능한 종속성만 인쇄할 수 있도록 출력 필터링
  • grep -v "project :" 필터 multi-project build에서 불필요한 모듈 의존항을 제거하고 이 의존항도 FAILED로 보고할 수 있다.
  • 콘솔 출력에서 중복된 항목을 볼 수 있기 때문에, 추가 명령 등을 사용해서 제거하기를 원할 수도 있지만, 이것은 저에게 충분합니다.
    출력은 다음과 같을 수 있습니다(처음 10행).
        |    +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
    |    +--- com.google.android:flexbox:1.0.0 FAILED
         +--- com.android.volley:volley:1.1.1 FAILED
    |    |    +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
    |    +--- com.google.android:flexbox:1.0.0 FAILED
    |    +--- com.android.volley:volley:1.1.1 FAILED
         |    +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
    |    |    +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
    |    +--- com.amitshekhar.android:debug-db:1.0.6 FAILED
    |    |    |    +--- com.google.android:flexbox:1.0.0 FAILED
    

    다른 Maven 저장소에서 종속성 찾기


    현재, 어떤 의존항이 부족한지 알면, MvnRepository 같은 서비스로 다른 Maven 메모리 라이브러리에서 그들을 위탁 관리하는지 확인할 수 있다.예를 들어 이러한 의존 관계의 경우
    |    +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
    
    당신은 다음과 같은 것을 볼 수 있습니다.
  • 이 특정 버전, 즉 2.21.0은 JCenter에서만 호스팅됩니다.
  • 업데이트된 버전2.28.1은 Maven Central에 있습니다.


  • 이 경우 현재 의존 항목의 버전을 가져오려면 다른 Maven 저장소를 사용할 수 없지만, 업데이트를 시도할 수 있습니다.
    참고로, Dexmaker의 관리자는 이전 버전을 이전하지 않을 것이라고 말했다.

    전달 가능한 의존 항목 버전을 어떻게 강제로 집행합니까


    대부분의 경우, Dexmaker는 직접적인 의존항이 아니라 전달할 수 있는 의존항이기 때문에, Gradle 프로필의 어느 곳에서 버전을 간단하게 변경할 수 없습니다.
    전송 가능 종속 버전을 업데이트하려면 다음과 같이 MockK를 사용합니다.
    dependencies {
        constraints {
            implementation("com.linkedin.dexmaker:dexmaker:2.28.1") {
                because("The default version used by MockK 1.9.3 is hosted on JCenter only")
            }
        }
    }
    
    또는 다음과 같은 방법으로 constrains를 사용할 수 있습니다.
    allprojects {
        configurations.all {
            resolutionStrategy {
                force("com.linkedin.dexmaker:dexmaker:2.28.1")
            }
        }
    }
    

    해결 전략 내가 다른 곳에서 찾을 수 없는 의존 관계


    불행히도 이야기는 여기서 끝나지 않았다.의존 관계를 갱신하는 것은 진일보한 문제를 초래할 수 있다.그 중 일부는 서로 호환되지 않을 수도 있고, 다른 일부는 프로젝트의 일부 코드 부분을 업데이트해야 하기 때문에 많은 정력을 들여야 할 수도 있다.그 밖에 라이브러리 작성자가 더 이상 그것을 관리하지 않거나 다른 마븐 저장소, 예를 들어 마븐 Central에 업로드할 시간이 충분하지 않을 수도 있다.
    이 모든 경우, 현재 의존 버전을 어떤 방식으로 유지해야 할 수도 있습니다.나는 다음 단락에서 어떻게 이 점을 해냈는지 설명할 것이니 계속 읽어 주십시오🙂.
    나는 다른 곳에서 찾을 수 없는 다음과 같은 의존항을 보류하기로 결정했다.
  • com.datadoghq:dd-sdk-android:1.5.1(직접)
  • com.savvi.datepicker:rangepicker:1.3.0(직접)
  • com.google.android:flexbox:1.0.0(및)

  • 전달할 수 있었어
  • com.android.volley:volley:1.1.1(및)
  • com.linkedin.dexmaker:dexmaker:2.21.0(직접)
  • Gradle 캐시에서 캐시 의존 항목 찾기


    고맙습니다.Gradle은 의존항을 로컬에 캐시하기 때문에 모든 의존항을 쉽게 찾을 수 있습니다.기본적으로 사용자의 홈 디렉터리를 검사해야 합니다: com.sunmi:printerlibrary:1.0.13.
    다음 명령을 실행하여 캐시된 종속 파일을 찾을 수 있습니다.
    find ~/.gradle/caches/modules-2/files 2.1/com.linkedin.dexmaker
    
    다음과 같은 출력이 인쇄됩니다.
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/bdfd84d002e265ab7cf7f54a71a17717f831a57d
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/bdfd84d002e265ab7cf7f54a71a17717f831a57d/dexmaker-2.21.0-javadoc.jar
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/423b7b6e4d772e274ba03646284b0cea83faca56
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/423b7b6e4d772e274ba03646284b0cea83faca56/dexmaker-2.21.0.pom
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/680f2dbbb51f2892a4fdbbd9269d628e0b3270b3
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/680f2dbbb51f2892a4fdbbd9269d628e0b3270b3/dexmaker-2.21.0.jar
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/2e6b7df791ab40f340dfd2cb41acd62bb057af82
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/2e6b7df791ab40f340dfd2cb41acd62bb057af82/dexmaker-2.21.0-sources.jar
    
    이제 몇 걸음만 더 하면 당신의 VCS에 이 소중한 파일을 저장하고 팀원들과 공유할 수 있습니다.

    여기서 디렉터리 레이아웃에 대한 완전한 설명을 찾을 수 있습니다. 로컬 Maven 저장소 설정


    다음 Gradle 코드 세그먼트를 사용하여 모든 디렉토리를 Maven 저장소로 사용할 수 있습니다.
    repositories {
        maven {
            url = uri("${rootProject.projectDir}/libs")
        }
    }
    
    ~/.gradle 블록에 넣고 싶을 수도 있어요.)
    따라서 루트 항목 디렉토리의 allProjects { ... } 디렉토리는 다른 모든 Maven 저장소와 마찬가지로 종속 항목을 검색합니다.물론, 너는 이 목록을 마음대로 명명할 수 있다.
    선택한 디렉토리는 Maven 저장소 레이아웃에 따라 준비되어야 합니다.솔직히 말해서, 나는 이 주제에 관한 어떤 문서가 공식 문서인지 확실하지 않지만, 나는 로컬 libs 목록을 찾아서 답을 찾았다.
    Dexmaker에 대해 다음 디렉토리를 만들었습니다.
    libs/com/linkedin/dexmaker/dexmaker/2.21.0
    
    보시다시피, 저는Gradle 캐시 구조를 Maven 저장소 레이아웃에 비추었습니다. 아래와 같습니다.
    그레델 캐시
    Maven 저장소
    ~/.gradle/caches/modules-2/files-2.1
    libs
    일반 도메인 이름 형식.영영아.텍스마르크
    linkedin/dexmaker
    텍스마르크
    텍스마르크
    2.21.0
    2.21.0
    그런 다음 다음 다음 명령을 사용하여 모든 파일을 Gradle cache에서 ~/.m2/repository로 복사합니다.
    find ~/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0 -type f -exec cp -v {} libs/com/linkedin/dexmaker/dexmaker/2.21.0 \;
    
    출력을 인쇄했습니다.
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/bdfd84d002e265ab7cf7f54a71a17717f831a57d/dexmaker-2.21.0-javadoc.jar -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0-javadoc.jar
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/423b7b6e4d772e274ba03646284b0cea83faca56/dexmaker-2.21.0.pom -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0.pom
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/680f2dbbb51f2892a4fdbbd9269d628e0b3270b3/dexmaker-2.21.0.jar -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0.jar
    /Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/2e6b7df791ab40f340dfd2cb41acd62bb057af82/dexmaker-2.21.0-sources.jar -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0-sources.jar
    
    이것이 바로 Dexmaker 2.21.0이 Git 저장소의 일부가 된 이유입니다.모든 다른 부족한 의존항에 대해 이 과정을 반복한 후에 나는 다시 프로젝트를 성공적으로 구축하였다🎉
    저자 Andrzej Zabost, 고급 안드로이드 개발자@Bright Innovations
    특색 있는 사진 작성자this oneLuroka

    좋은 웹페이지 즐겨찾기