Tag Archives: maven

Maven으로 Leiningen 프로젝트 패키징하기

클로저 프로젝트를 작성할 때 Leiningen을 사용할 때 느끼는 불편함은 일단 ‘느리다’가 첫번째 직면하게 되는 문제이고, 두번째는 아직 널리 사용되는 프로젝트 관리 모델이 아니다보니 클라우드 배포시에 Leiningen이 지원되지 않을 수 있다는 점이다.

결국 Leiningen이 참조하는 project.clj를 Maven용으로 pom.xml로 변환하는 작업이 필요한데, Leiningen은 lein pom 과 같은 옵션을 제공하고 있다. 그러나 필자가 테스트해본 결과에 의하면 그 결과가 썩 만족스럽지 않다. dependencies를 자동으로 작성해주고, project.clj에 :pom-plugins 를 추가해주면 해당 maven 플러그인 세팅을 해주는 정도의 노위 노가다 대체용 정도가 아니라면 결국 pom.xml을 직접 컨트롤 해줘야 하는 것 같다.

다양한 설정에 대해 테스트해 본 것은 아니지만 필자의 경우를 예로 들어보면, Luminus가 자동으로 생성해 준 project.clj를 대상으로 한  lein pom 결과로 얻은 pom.xml로 패키징(mvn package)을 해보면 ( :pom-plugins 를 설정하거나 pom.xml을 직접 수정하여 추가한 이후) jar파일이 성공적으로 생성되는 듯 하지만 다음과 같은 에러를 뱉어 버린다.

Error: Could not find or load main class

처음에는 executable jar 생성에 많이 사용되는 maven-share-plugin을 사용했는데 플러그인 세팅의 문제로 진입점을 찾지 못하는 것으로 생각하여 여러가지로 시도해보았지만 실패하고, maven-assembly-plugin도 사용하는 방법도 써봤지만 재미를 보지 못하다 결국 방법을 찾았다. (참고링크: http://www.elangocheran.com/blog/2015/12/compiling-a-leiningen-project-from-maven/)

exec-maven-plugin을 사용하여 lein uberjar 를 직접 실행하는 것처럼 강제하는 것. 당연히 배포 서버에는 Leiningen이 설치되어 있지 않은 것을 가정하고 있으니,  dependency에 Leiningen 라이브러리를 추가해주어야 한다.

<dependency>
  <groupId>leiningen</groupId>
  <artifactId>leiningen</artifactId>
  <version>2.7.1</version>
</dependency>

플러그인 세팅은 다음과 같다.

<plugins>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
      <execution>
        <id>pkg-lein-uberjar</id>
        <phase>package</phase>
        <goals>
          <goal>exec</goal>
        </goals>
        <configuration>
          <executable>java</executable>
          <arguments>
            <argument>-classpath</argument>
            <classpath/>
            <argument>clojure.main</argument>
            <argument>-m</argument>
            <argument>leiningen.core.main</argument>
            <argument>uberjar</argument>
          </arguments>
        </configuration> 
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <executions>
      <execution>
        <id>default-jar</id>
        <phase/>
      </execution>
    </executions>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>2.5.2</version>
    <configuration>
      <skip>true</skip>
    </configuration>
  </plugin>
</plugins>

가까스로 방법을 찾긴 했는데,  lein pom 에서 좀 깔끔하게 지원해줬으면 어땠을까 하는 아쉬움이 남는다.