Gradle 프로젝트로 간단한 라이브러리를어 SpringBoot + Kotlin 프로젝트에 디펜던시로 등록해보자. 작업은 Intellij IDEA 2022.1.4 (Ultimate Edition) 에서 진행하였다. 미리 말하자면 그닥 추천하지는 않는 방법이다. (아래 여담 참조)
예시로 Gradle + Kotlin 으로 yaml 파일에서 데이터를 불러와 출력하는 간단한 프로젝트를 생성하였다. 코드는 아래와 같다.
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory
import com.fasterxml.jackson.module.kotlin.KotlinModule
import java.io.File
val mapper: ObjectMapper = ObjectMapper(YAMLFactory()).registerModule(KotlinModule.Builder().build())
val data = mapper.readValue(File("src/main/resources/application.yml"), HashMap::class.java)
fun greeting() = "Hello ${data["name"] ?: "everybody"}!"
전체 코드는 여기서 볼 수 있다.
레포에 푸시 후 아래와 같이 릴리즈 버전을 등록해주어야 한다.
settings.gradle.kts
설정sourceControl {
gitRepository(uri("https://github.com/jiso0jung/gradle-gitrepo-dependencies-test")) {
producesModule("org.jisoo:gradle-gitrepo-dependencies-test")
}
}
build.gradle.kts
설정dependencies {
...
implementation("org.jisoo:gradle-gitrepo-dependencies-test:1.0")
...
}
gradle clean
후 다시 빌드해보자.아래와 같이 파일 내에서 라이브러리의 메소드를 임포트해 사용할 수 있다.
import greeting
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.Test
class IntegrationTest {
@Test
fun `인사한다`() {
assertThat(greeting()).isEqualTo("Hello everybody!")
}
}
private repository도 라이브러리로 임포트 할 수 있지만, 별도 github 키 설정이 필요하다.
타입을 rsa가 아니라 ecdsa로, 구버전으로 지정하여 생성해야 한다. ~/.rsa
경로에서 생성하며, 명령어는 다음과 같다. ssh-keygen -t ecdsa -m pem
참고) 왜 구버전 ecdsa 키를 사용해야 하는걸까?
github 레포를 불러올 때 jgit이라는 라이브러리를 사용하는데, jgit에서는 새로운 키 포맷을 해석하지 못한다(지원이 끝났기 때문에 앞으로도 못할 예정..😭). 구버전, 신버전 포맷은 키 파일 헤더에서 구분할 수 있다.
## 신버전 헤더
-----BEGIN OPENSSH PRIVATE KEY-----
## 구버전 헤더
-----BEGIN RSA PRIVATE KEY-----
그렇다고 구버전 RSA 키를 사용할 수는 없다. 깃헙이 구버전 키를 허용하지 않기 때문이다. 따라서 구버전 ecsdsa 키를 별도로 생성해 설정이 필요하다. 이와 관련된 이슈는 여기를 참고하자.
~/.rsa/id_ecdsa.pub
내용을 복사해, Github > Settings > SSH and GPG Keys > New SSH key
에 들어가 등록한다. Settings는 깃헙 페이지 우측 상단 아이콘을 누르면 확인할 수 있다.~/.rsa
경로에 config 파일을 생성한다. 여러 방법이 있겠지만 나는 vi config
명령어로 파일 생성 및 편집을 하였다. 파일 내용은 아래와 같다.Host github.com
User git
IdentityFile ~/.ssh/id_ecdsa
settings.gradle.kts
설정ssh://
가 붙는다는 점과, git@github.com
뒤에 콜론이 아닌 슬래시가 온다는 점을 확인하자.sourceControl {
gitRepository(uri("ssh://git@github.com/jiso0jung/gradle-gitrepo-dependencies-test.git")) {
producesModule("org.jisoo:gradle-gitrepo-dependencies-test")
}
}
나머지는 public repository 과정과 같다!
여담)
간단한 방법 같아서 깃헙 레포로 임포트 해보기는 했는데, 지원이 끝난 라이브러리를 사용하는 방법이라 실무에 적용하면 안될 것 같다...그래도 삽질한 시간이 아까워 작성해 보았다. 좋은 경험 했다 치고 웬만하면 jcenter를 써 보자!
참고링크
https://stackoverflow.com/questions/18748436/is-it-possible-to-declare-git-repository-as-dependency-in-android-gradle/56787382#56787382
https://stackoverflow.com/questions/53134212/invalid-privatekey-when-using-jsch/55740276#55740276
https://www.eclipse.org/forums/index.php/t/1110330/