[컴] offline 에서 kotlin gradle을 이용한 build를 하기

오프라인 빌드 / 코틀린 빌드 오프라인 /

offline 에서 kotlin gradle을 이용한 build를 하기

현재의 결론은 ref. 1 의 방법을 사용하는 것이 가장 나은듯 하다. 이것 이전에 몇가지를 시도했지만 다 실패했다.

그래서 여기서는 ref.1 에 있는 내용처럼 maven 의 repository 를 이욯해서 build 를 할 것이다.

이전에 시도한 방법들:

  1. gradle cache 를 복사해서 사용 : java - How do I use gradle without internet access? - Stack Overflow
  2. gradle 을 이용해서 compile time 에 쓰이는 jar 을 모두 local 에 두고, implementaion 의 경로를 전부 local 로 했다. 그리고 repository 도 flatDir 로 변경했다. 이때는 실패했다.
    • kotlin build deamon (?) 때문에 error 가 난다.
    • 이 상황에서 repository 가 mavenCentral() 일때는 성공한다.

절차

  1. local maven repository(.m2) 만들기
  2. offline 에서 gradle wrapper 사용하도록 설정
  3. gradle build 시 local repository 를 사용하도록 설정
  4. 빌드 : gradlew clean build

local maven repository(.m2) 만들기

gradle 의 내용을 일단 pom.xml 로 만들고, 이 pom.xml 을 이용해서 mvn install 을 하자. 그러면 <home>/.m2 에 mavne repository 가 생성된다. 일부는 maven-central 에서 download 가 안되는 경우도 있어서 repository 를 변경해서 mvn install 을 한 번 더 시도해야 할 수 있다.

offline 에서 gradle wrapper 사용하도록 설정

gradlew 를 실행하면, 기본적으로 <proj>\gradle\wrapper\gradle-wrapper.properties 에 있는 distributionUrl 경로에서 gradle 을 가져와서 사용하게 된다. 그래서 이 부분을 offline 에서는 local 의 gradle 을 이용하도록 변경해 줘야 한다. 다음 링크에서 자세한 설명을 확인할 수 있다.

gradle build 시 local repository 를 사용하도록 설정

이제 gradle.build 에서 gradlew build 시에 local repository 를 사용하도록 설정해줘야 한다. 그래서 처음에 plugins DSL 로 정의된 부분을 legacy plugin application 로 변경했다. 그 부분은 다음 링크를 참고하면 된다.

그래서 아래처럼 repositories<proj>/locallib/.m2/repository 로 설정했다. 참고로 full path 를 적어줘야 한다. 상대경로도 잘 동작한다.

그리고 처음에 --offline 을 이용하려고 if (gradle.startParameter.isOffline()){} 를 이용했는데, 그 경우 gradle 이 cache 를 이용하기 때문에 local repository 를 이용하지 않았다. 다만 if (gradle.startParameter.isOffline())buildscript.repositories 내부에서 사용해 보지는 않았다.


buildscript {
  repositories {
    maven {
      url 'c:/myproj/locallib/.m2/repository/'
    }
  }
  dependencies {
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0"
  }
}


plugins {
    id 'application' 
    id 'maven-publish'
}

apply plugin: "org.jetbrains.kotlin.jvm"

...

repositories {
    maven {
        url 'c:/myproj/locallib/.m2/repository/'
    }
    // mavenCentral() 
}

...

publishing {
    publications {
        customLibrary(MavenPublication) {
            from components.java
        }
    }

    repositories {
        maven {
            name = 'sampleRepo'
            url = layout.buildDirectory.dir("repo")
        }
    }
}

빌드 : gradlew clean build

그리고 gradlew clean build 로 빌드를 했다.

C:\myproj>gradlew clean build

> Task :compileKotlin
w: C:\myproj\src\main\kotlin\io\myproj\Req.kt: (54, 37): Parameter 'req' is never used, could be renamed to _
...
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.4.2/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1m 23s
8 actionable tasks: 8 executed
C:\myproj>

References

  1. How do I do offline Kotlin development? : Kotlin

댓글 없음:

댓글 쓰기