문제

내가 사용하는 더 큰 응용 프로그램 프레임 워크에서 사소한 버그를 발견했습니다. 수정은 단일 클래스에서 두 줄만 변경하면됩니다. 문제를 수정하고 프로젝트 저장소로 변경을 밀어 넣었습니다.

그러나 내일 석방해야합니다. 따라서 라이브러리가 새 버전을 출시 할 때까지 기다릴 수 없습니다. 패치 버전을 내 프로젝트에 통합하는 가장 좋은 방법이 무엇인지 궁금합니다.

  • 프로젝트 구축 : 이것은 상당히 어렵다는 것을 알게됩니다. 스냅 샷 저장소에서 많은 단위 테스트가 고장 났기 때문에 제대로 구축 할 수 없습니다. 단위 테스트가 없어도 찾을 수없는 일부 종속성을 놓치고 있기 때문에 그리 멀지 않습니다. Maven Central에서. 또한 Maven Central에서 찾을 수 없으므로 고정 버전을 다른 모든 개발자에게 보내야합니다. (우리는 그물에서 일하고 있으며 우리 자신의 넥서스가 없습니다.)

  • 수정 한 클래스의 사본을 보관하는 프로젝트에 새 모듈을 추가합니다. 그런 다음이 모듈을 클래스의 재정의 버전을 사용해야하는 모든 모듈에 종속성으로 추가합니다. 그러나 JVM은 실제로 어떤 클래스가 실제로로드되는 클래스를 결정합니까? 그것은 두 가지를 찾을 것입니다 항아리-이름이 같은 클래스를 포함하는 파일. 실제로 어떤 것이로드됩니까? 이 작업을 수행 할 수 있다면,이를 통해 수정 된 버전의 클래스 버전을 프로젝트와 함께 프로젝트와 함께 배포 할 수 있고 버그가 수정되면 모듈을 제거 할 수 있습니다.

  • 수정 된 클래스 파일을 영향을받는 모듈 자체에 포함시킵니다. 지금까지 JVM이 항상 같은 항아리에서 클래스를 먼저로드하기 때문에 이것은 나에게 가장 쉬운 솔루션으로 보입니다. (내가 맞아요? 적어도 그게 내 테스트에서 관찰 한 것입니다.)

이에 대한 의견에 감사드립니다.

도움이 되었습니까?

해결책

프로젝트를 별도로 구축 하고이 버전을 다른 네임 스페이스로 옮겼습니다. 이것은 분명히 드문 일이 아닙니다. 예를 들어, Hibernate는 API 변경으로 인한 버전 충돌을 피하기 위해 CGLIB를 자체 네임 스페이스로 유지합니다.

  • 첫 번째 제안 된 솔루션은 내가 사용한 프로젝트가 다른 의존성에 사용되었을 때 문제가있었습니다. 정상 버전은 클래스 경로에 있었으며, 명명 충돌로 인해 매우 이상한 행동으로 이어졌습니다.

  • 두 번째와 세 번째 제안은 첫 번째 제안과 비슷한 문제가있었습니다. 또한 다른 버전의 종속성과의 호환성을 깨뜨 렸습니다.

심지어 고통 스럽습니다. 네임 스페이스 밖으로 나가고 별도의 빌드를 제공하는 것은 몇 줄의 코드 만 변경하더라도 필수입니다.

다른 팁

프로젝트의 의존성을 사용자 정의 네임 스페이스로 이동시키는 데 몇 가지 이유가 있다고 생각합니다.

  • 수정은 종속성의 원래 개발자에게 다시 전송되지 않을 것입니다.
  • 새로운 종속성 버전을 따라 잡기가 어려울 것이므로 더 이상 버그 픽스, 새로운 기능, 타사 개발자 및 기고자의 취약성 수정이 없습니다.
  • 내 경험은 시간이 지남에 따라 잊혀진다는 것입니다 어떻게 그리고 사용자 정의 네임 스펙팅 된 종속성이 수정되었습니다. 이로 인해 프로젝트 의이 부분은 감가 상각 될뿐만 아니라 만질 수 없을 것입니다.

Jitpack을 사용하는 워크 플로가 최상의 솔루션이라는 데 동의합니다. 몇 분만 오버 헤드로 수행하기위한 자세한 안내서가 포함 된 블로그 게시물을 썼습니다. https://5am.technology/2016/12/fix-bugs-third-party-dependency-jitpack/

tl; dr;

방문 https://jitpack.io 그리고 그것이 어떻게 작동하는지 읽으십시오


문제를 해결하기위한 단계

제 3 자 라이브러리가 Github에 있다고 가정하고 프로젝트를 복제하고 수정하십시오.

그런 다음 사용하십시오 https://jitpack.io. Jitpack은 리포지토리에서 .jar를 생성합니다 (코드를 수정 한 위치).

<dependency>
    <groupId>GITHUB_USER</groupId>
    <artifactId>REPOSITORY</artifactId>
    <version>COMMIT</version>
</dependency>

또한이 원격 저장소를 명시 적으로 추가해야합니다

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>
  • 빠른 작업 계약
  • 간단합니다
  • 취소하기 간단합니다
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top