Emacs 와 JDEE 와 Maven 과의 결합의 마지막을 해결했습니다. 그 전의 세팅을 보시고 싶으시면 


    2 번까지 끝을 내고 나니 Emacs 내에서 maven 컴파일과 빌드를 하고 싶더군요. (당장은 mvn install 만 되게) 딱히 다른 사람들이 만든 것은 내 필요에 부합하지 않은 것 같기도 하고 지원도 더 이상 하지 않는 것 같기에 직접 만들게 됐습니다. jdee 프로젝트 안에 있는 jde-make 를 변경했습니다. 간단하게 되더군요. 적당한 곳 (~/.emacs.d 안에)에 jde-mvn.el 을 복사하시고 .emacs 안에서 

(require 'jde-mvn)


 을 해주시면 됩니다. 그리고 세부 설정을 위해서 


(custom-set-variables

 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 '(ecb-options-version "2.40")
 '(jde-build-function (quote jde-mvn))
 '(jde-global-classpath (quote 
     ("/Users//work/android/\
      sdk/platforms/android-17/android.jar" 
      "/Users//.emacs.d/\
      jdee/build/classes")))
 '(jde-mvn-enable-find t)
 '(js2-auto-indent-p t)
 '(js2-cleanup-whitespace t)
 '(js2-enter-indents-newline t)
 '(js2-global-externs (quote ("$" "Ext")))
 '(js2-mirror-mode nil)
 '(slime-complete-symbol-function 
   (quote slime-fuzzy-complete-symbol))
 '(tab-width 2))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won't work right.
 )


 와 같이 jde 설정을 해주시면 완료입니다. 

 필요한 파일은 https://github.com/crazia/jdee-mvn 에 올려두었습니다.
 프로젝트를 만들다 보면 너무나 당연하게 디펜던시를 가지는 프로젝트가 생기게 됩니다. 메이븐은 기본적으로 디펜던시를 가져다가 프로젝트를 만들게 되는데 이를 수동으로 해야할 필요가 생긴다면  어떻게 할 것인가? 하는 문제가 있습니다. 즉 

   

    A : 실행파일이 만들어지는 프로젝트 
    B : A 가 참조하는 프로젝트
    C : B 가 참조하는 프로젝트 

    A - 
      - B -
          - C

    

이런식으로 아마 만들어지는 것이 지금까지의 일반적인 방법일 것입니다. 그러나 메이븐에서 관리를 하게 된다면 조금 다른 식이 됩니다. 

   

P (parent) 가 존재해서 

    P - A
      - B
      - C 



같은 식으로 프로젝트가 존재하게 됩니다. 그리고 각각은 pom.xml 만 수정해서 프로젝트를 관리할 수가 있습니다. 

    그래서 수정해야 할 부분을 따라하기로 만들어 보기로 합니다. 

    1. 부모 (parent) 프로젝트 생성 
 


$ mvn archetype:generate

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 186: 186
Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: 6
Define value for property 'groupId': : upper
Define value for property 'artifactId': : top
Define value for property 'version':  1.0-SNAPSHOT: : 1.0.0
Define value for property 'package':  upper: : 
Confirm properties configuration:
groupId: upper
artifactId: top
version: 1.0.0
package: upper
 Y: : Y



186 번을 선택하시고 나머지 것들은 대충 입력해서 만들어 줍니다. 제 경우에는 

     

       groupId: upper
       artifactId: top
       version: 1.0.0


 와 같이 만들어 줬습니다. 

    2. 부모 프로젝트의 pom.xml 변경 
       
       

       <groupId>upper</groupId>
       <artifactId>top</artifactId>
       <version>1.0.0</version>
       <packaging>pom</packaging>


      <packaging> 태그의 내용을 pom 으로 바꿉니다.


    3. 하위 프로젝트 생성 
      1. 에서 생성한 프로젝트의 위치로 이동합니다.

$ cd $PARENT-BASE
$ mvn archetype:generate
 
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 186: 186
Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: 6
Define value for property 'groupId': : upper
Define value for property 'artifactId': : project-a
Define value for property 'version':  1.0-SNAPSHOT: : 1.0.0
Define value for property 'package':  upper: : 
Confirm properties configuration:
groupId: upper
artifactId: project-a
version: 1.0.0
package: upper
 Y: : Y

       
다음 프로젝트 생성 

$ mvn archetype:generate

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 186: 186
Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: 6
Define value for property 'groupId': : upper
Define value for property 'artifactId': : project-b
Define value for property 'version':  1.0-SNAPSHOT: : 1.0.0
Define value for property 'package':  upper: : 
Confirm properties configuration:
groupId: upper
artifactId: project-b
version: 1.0.0
package: upper
 Y: : Y


그리고 다음 프로젝트도 생성해줍니다. 
       

$ mvn archetype:generate
 
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 186: 186
Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: 6
Define value for property 'groupId': : upper
Define value for property 'artifactId': : project-c
Define value for property 'version':  1.0-SNAPSHOT: : 1.0.0
Define value for property 'package':  upper: :   
Confirm properties configuration:
groupId: upper
artifactId: project-c
version: 1.0.0
package: upper
 Y: : Y


각각에 맞춰서 생성해줍니다. 

이렇게 하면 자동으로 부모 프로젝트의 pom.xml 이 변경됩니다. 

 

 <modules>
    <module>project-a</module>
    <module>project-b</module>
    <module>project-c</module>
  </modules>



하단에 위와 같은 내용이 추가 됐습니다. 그리고 project-a 의 pom.xml 을 열어보면 

 

<parent>
    <groupId>upper</groupId>
    <artifactId>top</artifactId>
    <version>1.0.0</version>
  </parent>


와 같은 보통때는 안보이는 내용이 추가 됐습니다. 다시 자세히 설명하자면 부모 프로젝트의 <package> 내용을 pom 으로 바꾸고 <modules> 내용을 추가하고 , 추가되는 프로젝트의 pom.xml 에 <parent> 관련된 부분을 추가 해주면 복합 모듈 프로젝트로 변경되는 것입니다. 

.
├── pom.xml
├── project-a
│   ├── pom.xml
│   └── src
│       ├── main
│       │   └── java
│       │       └── upper
│       │           └── App.java
│       └── test
│           └── java
│               └── upper
│                   └── AppTest.java
├── project-b
│   ├── pom.xml
│   └── src
│       ├── main
│       │   └── java
│       │       └── upper
│       │           └── App.java
│       └── test
│           └── java
│               └── upper
│                   └── AppTest.java
├── project-c
│   ├── pom.xml
│   └── src
│       ├── main
│       │   └── java
│       │       └── upper
│       │           └── App.java
│       └── test
│           └── java
│               └── upper
│                   └── AppTest.java
└── src
    ├── main
    │   └── java
    │       └── upper
    │           └── App.java
    └── test
        └── java
            └── upper
                └── AppTest.java

31 directories, 12 files


프로젝트의 트리 내용입니다. 


   4. 하위 프로젝트 끼리 연결 시키기 

project-b 는 project-c 를 참조하고 project-a 는 project-b 를 참조합니다. 그렇다면 각각의 project-a 와 project-b 의 pom.xml 을 열어서 

project-a 의 pom.xml 에는 
   

   <dependency>
      <groupId>upper</groupId>
      <artifactId>project-b</artifactId>
      <version>1.0.0</version>
    </dependency>


 을 추가해 주고 

 project-b 의 pom.xml 에는 
 

  <dependency>
      <groupId>upper</groupId>
      <artifactId>project-c</artifactId>
      <version>1.0.0</version>
    </dependency>


 만 추가해 주면 됩니다. 물론 이 내용들은 <dependencies> 태그 안에 위치해야 하는 것은 기본입니다. 


결론적으로 말해서 maven 은 초기의 거리낌이 느껴지는 것과는 달리 순수하게 command-line 으로 관리할 수 있는 프로젝트 관리 모듈입니다. 저 같이 이클립스보다는 이맥스(emacs) 가 손에 익은 사람들이 자바 프로젝트를 깔끔하게 관리할 수 있게 많은 기능들을 제공합니다. 
    

+ Recent posts