프로젝트에 Jar를 두개 이상 의존성을 추가하고 빌드를하였는데, 두개의 Jar가 동일한 클래스를 포함하고 있어서 빌드가 실패되었습니다.
Googling해보니, 다음과 같은 방법으로 Jar의 의존성을 제거할 수 있다고 합니다.
dependencies {
implementation "io.realm:realm-android-kotlin-extensions:$realm_version" {
exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib-jdk7"
}
}
하지만 직접 Jar를 프로젝트에 추가하는 경우 다음과 같은 방법으로 중복되는 클래스를 제거할 수 없습니다.
위의 코드에서 exclude
명령어는 "Transitive Dependencies"가 있는 경우 그것을 제거하는 것이라고 합니다.
Jar파일에는 "Transitive Dependencies"가 없기 때문에 이것으로 일부 의존성 클래스를 제거할 수 없습니다.
그렇기 때문에, Jar 파일을 압축풀고 거기서 중복된 클래스 파일을 삭제하고 다시 Jar로 만드는 방법뿐이 생각나는게 없었습니다.
Gradle의 task를 이용하면 자동화가 가능하기 때문에, 이 방법으로 구현해보기로 하였습니다.
Jar의 중복 클래스 제거
app의 "build.gradle"
파일에서 repackJars라는 태스크를 만들었습니다.
task repackJars(type: Zip) {
println 'Excluding duplicated classes'
from (zipTree('libs/services.core.jar')) {
exclude '**/android/gsi/**.class'
exclude '**/android/hardware/contexthub/V1_0/**.class'
exclude '**/android/hardware/vibrator/V1_0/**.class'
exclude '**/android/os/IDumpstate**.class'
exclude '**/android/os/IInstalld**.class'
exclude '**/android/os/IStoraged**.class'
exclude '**/android/os/IVold**.class'
}
println 'Repackaging Jar'
archiveName 'services.core.repack.jar'
destinationDir(file('libs/'))
}
- zipTree는 jar의 압축을 풉니다.
- exclude는 파일들중에 중복되는 클래스를 제거합니다.
- archiveName는 설정한 파일이름으로 zip 형식으로 압축해 줍니다.
- destinationDir는 zip파일이 저장될 위치를 설정합니다.
build 태스크보다 먼저 실행되게 만들기
최종적으로, repackaging된 Jar를 프로젝트에서 사용할 생각입니다. 그렇기 때문에 build 태스크보다 repackJars 태스크가 먼저 실행되어야 합니다. dependencies { implementation files('libs/services.core.repack.jar') ... }
다음 코드처럼, preBuild.dependsOn repackJars
로 build 태스크보다 repackJars가 먼저 실행되도록 의존성을 설정할 수 있습니다.
task repackJars(type: Zip) {
....
}
preBuild.dependsOn repackJars
아래 명령어로 빌드를 해보면
$ gradle build
build하기 전에 repackJars 태스크가 수행되는 것을 볼 수 있습니다.
> Configure project :app
Excluding duplicated classes
Repackaging Jar
> Task :app:compileDebugJavaWithJavac
....
참고
Related Posts
- Python - Yaml 파일 파싱하는 방법
- Python - pip와 requirements.txt로 패키지 관리
- 유튜브 쇼츠(Shorts) 자막 끄기/켜기
- SOLID 원칙, 객체지향 설계 5가지 원칙
- Ubuntu 20.04 - Nginx로 React를 배포하는 방법
- 애드센스 '구글 검색 기능' 블로그에 추가
- 트위터 이메일 안오게, 알림 끄기
- 인스타그램 동영상, 사진 저장 방법
- Git 설치 방법 (Ubuntu, Windows)
- Python pip 설치 (Ubuntu / Windows)
- 마우스 우클릭 복사 방지 해제 방법 (크롬)
- Python 에러 해결, 'conda' 용어가 cmdlet, 함수, 스크립트 ... 인식되지 않습니다.
- Python 에러 해결, AttributeError: module 'jwt' has no attribute 'encode'
- Atom - 코드 자동 정렬
- Sublime Text - 코드 자동 정렬, 단축키 설정
- VSCode에서 탭 간격 설정 (Tab to 4 spaces)
- Visual Studio Code에서 코드 자동 정렬
- 구글 검색 기록 삭제, 자동 저장 끄기 (PC, 모바일)
- 안드로이드 개발자 옵션 활성화, USB 디버깅 켜기
- 유튜브 채널 차단, 해제 방법 (PC, 모바일)
- 유튜브 미리보기 자동재생 끄기 (자동 소리 끄기/켜기)
- PC에서 유튜브 모바일 버전(m.youtube.com)으로 보기
- 모바일에서 유튜브 PC버전으로 보기
- 유튜브 시간 링크 만들기, 댓글에 시간 태그 입력하기
- 유튜브 스크립트 함께 보기, 자막 추출 방법
- 유튜브 알고리즘 초기화, 검색 기록과 시청 기록 삭제
- 유튜브 '싫어요' 숫자 다시 보이게 하기
- 구글 크롬, 방금 닫은 탭 다시 열기
- Maven으로 Java프로젝트 build하는 방법
- node.js, npm 버전 확인 방법 (터미널, cmd 명령어)
- GitLab - 'pre-receive hook declined' 에러 해결
- Javacript Heap Out Of Memory 문제 해결
- SSH key 생성하고 GitHub에 등록
- GMT, UTC의 차이점
- Linux(Ubuntu)에 Adobe Photoshop, Illustrator 설치하는 방법