Gradle 실행가능한 jar 파일 생성하기

gradle

Gradle을 처음 봤을때의 인상은 외국애들이 또 이런 복잡한것을 만들어냈구나..ㅠ 였습니다. 사실 지금도 그렇게 생각하지만 알면알수록 Gradle의 매력이 있습니다. 정말 수많은 다양한 일들을 할 수 있는것 같습니다. 기존의 Maven이 했었던 일들을 그대로 흡수하고 Gradle만이 할 수 있는 일들도 끝을 알수 없을정도로 많은 기능이 제공되네요.

이번에는 Gradle을 이용한 실행가능한 jar 파일을 생성하는 방법을 기록차 정리해 봅니다. build.gradle 파일에 다음과 같은 내용을 추가해 주면 됩니다.

apply plugin: 'java'
apply plugin:'application'

mainClassName = 'kr.pe.theeye.MyApp'
sourceCompatibility = 1.7
version = '1.0'

jar {
    manifest {
        attributes  'Title': 'My Application', 'Version': version, 'Main-Class': mainClassName
    }
    archiveName 'MyApp.jar'
    dependsOn configurations.runtime
    from {
        configurations.compile.collect {it.isDirectory()? it: zipTree(it)}
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '1.10'
}

repositories와 dependencies의 내용은 여기서 중요하지 않으니 생략하도록 하겠습니다. 먼저 정의해 두어야 하는 설정은 mainClassName과 version입니다. 당연히 배포하려는 어플리케이션의 클래스와 버전입니다. 여기서 mainClassName은 어플리케이션의 진입 지점이 되는 즉 main 메소드가 위치하는 클래스를 지정해주면 됩니다.

그다음은 jar { … } 설정을 보셔야 합니다. 이러한 설정없이 jar로 빌드해보면 Manifest 파일을 찾을 수 없다며 실행이 되지 않는데요, 이 내용을 생성해 줍니다. 간단하게 어플리케이션의 메타데이터라고 생각하시면 됩니다. 어플리케이션의 이름과 미리 지정해둔 버전과 메인클래스를 지정해주면 됩니다.

archiveName은 실제로 빌드시에 생성될 파일이름을 정해주시면 됩니다. 이후에 설정은 의존성 있는 파일들을 몽땅 jar에 포함시키는 설정입니다. 이러한 설정을 해주신 다음에 gradle jar를 실행해주면 디폴트로 build/libs 디렉토리 안에 바이너리가 생성됩니다.

IntelliJ를 이용하신다면 다음과 같이 Gradle 탭의 메뉴를 사용하시면 됩니다.

gradle_jar_button

Rails form_for에서 STI(Single Table Inheritance) 문제 해결하기

rails_logo

레일의 폼헬퍼는 폼을 만드는 과정을 정말 쉽게 해결해 주는 마법사같은 역할을 합니다. 확실히 레일즈에서 라우트와 폼헬퍼의 유기적인 동작을 보면 왜 레일즈가 유명한지 실감하게 되는것 같습니다. 오늘 겪었던 STI로 인해 폼헬퍼의 form_for가 정상적으로 동작하지 못하는 문제의 해결방법을 기록차 정리합니다.

사실 문제를 해결하는 방법은 없습니다. 기본적으로 form_for가 유입경로에 따라 어디로 라우팅 해야 하는지를 자동으로 결정해 주지만 STI를 사용한 Model의 핸들링의 경우 수동으로 처리해 주어야 합니다. 심지어 홈헬퍼 레퍼런스에서도 이렇게 설명하고 있습니다.

sti_problems_form_for

결과적으로 :url과 :method를 이용하여 명시적으로 어디로 라우팅할지를 결정해 주어야 한다는 것입니다. Project라는 이름의 Model을 수정하는 경우라고 가정할 때 컨트롤러는 다음과 같습니다.

def edit
   @project = Project.find(params[:id])
end

그리고 뷰에서 form_for를 활용하는 코드는 다음과 같습니다.

<% form_for(@project, :as => :project, :url => {:controller => "projects",:action => "update"}) do |f| %>
    ...
    <%= submit_tag 'Update' %>
<% end %>

:url 설정에서 컨트롤러와 액션을 직접 선택한것을 볼 수 있습니다. 이 설정을 통해 적절한 method가 선택되며 라우팅 문제는 이것으로 해결할 수 있습니다. 하지만 project_TYPE_FIELDNAME처럼 데이터가 이상하게 들어오는 문제가 남아있습니다. 이부분은 :as를 통해 모델을 재정의할 수 있습니다.

참고