Java Web Application 개발은 대부분 Eclipse 를 사용 해서 개발 한다. 소스 파일 작성은 확실히 편리 하다. 하지만 Tomcat 을 사용 할때 문제점 이 있다.


1. Class 파일의 로딩 지연 현상

개발 진행 중에 Start, Stop, reStart 를 하루에도 몇십번? 씩은 하고 있다. 서버가 Start 될 때 이런 문구를 발견 하게 된다. ClassNotFoundException, NoClassDefFoundError 확인 하기 위해 파일을 찾아 본다. 실제로 Class 가 있고, Build 도 되어 있다. 결국 Clean Tomcat Work Directory 를 하고 난 후에야 해결이 된다.



2. Java Library 충돌

최근에 프로젝트를 진행 하면서 경험한 부분 이다. dom4j 라이브러리를 사용 하는대 2가지 버전이 Dependency 되어 있었다. Eclipse Tomcat 사용 할 때는 정상적으로 동작 한다. 하지만 Maven Build 하여 서버에 적용 하면 아니러니 하게도 ClassCastException 이 발생 한다. 흔히 Local 개발 환경에서는 정상 동작 하는대 실제 서비스를 적용 하는 환경에서 발생 하는 에러의 일부분은 이와 같은 사례 이다.


mvn dependency:tree


라이브러리를 사용할 때 의존성에 대한 검사를 하는 습관을 갖게 되면 라이브러리 간에 충돌은 줄일 수 있다.


위 두가지 사례를 들었다. Eclipse 에서도 배포가 가능 하겠지만, 개발 환경이 항상 Eclipse 를 사용 하고 있을 수는 없을 것이다. Maven 은 직접 소스를 build 해서 war 로 만들 수 있다. 개발자가 불편을 감안 하고 직접 Tomcat 에 deploy 하여 실제 서비스 환경과 비슷한 환경에서 테스트를 진행 할 수 있고, 좀 더 편리한 환경에서 테스트를 하고 싶다면, Tomcat Plugin 을 사용하면 된다.


<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>tomcat-maven-plugin</artifactId>
    <version>1.1</version>
    <configuration>
        <mode>war</mode>
        <port>8080</port>
        <path>/</path>
        <charset>UTF-8</charset>
        <uriEncoding>UTF-8</uriEncoding>
    </configuration>
</plugin>


pom.xml 에 추가 하자.


mvn clean tomcat:run


packing 이 war 로 선언 되어 있다면, war 로 Build 한 후 서버가 시작 될 것이다.


D:\Project\workspace\whitelife>mvn clean tomcat:run -Denv=local
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building whitelife web application
[INFO]    task-segment: [clean, tomcat:run]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting directory D:\Project\workspace\whitelife\target
[INFO] Preparing tomcat:run
[debug] execute contextualize
[INFO] [resources:resources {execution: default-resources}]
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 28 resources
[INFO] Copying 5 resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 80 source files to D:\Project\workspace\whitelife\target\classes
[INFO] [tomcat:run {execution: default-cli}]
[INFO] Running war on http://localhost:8080/
[INFO] Creating Tomcat server configuration at D:\Project\workspace\whitelife\target\tomcat
2014. 11. 7 오전 11:29:16 org.apache.catalina.startup.Embedded start
정보: Starting tomcat server
2014. 11. 7 오전 11:29:16 org.apache.catalina.core.StandardEngine start
정보: Starting Servlet Engine: Apache Tomcat/6.0.29
2014. 11. 7 오전 11:29:16 org.apache.catalina.core.ApplicationContext log
정보: Initializing Spring root WebApplicationContext
2014-11-07 11:29:16,934  INFO ContextLoader - Root WebApplicationContext: initialization started


http://localhost:8080/ 에 접속 하여 확인 해보자.


위 방법을 사용 하면서 Eclipse 는 본연의 모습을 찾아 가는 것 같고, Maven 은 Project 에 대한 매니저 역할을 하는 것 같아 보인다.


개발자 마다 개인의 스타일이 있고, 편한 방법이 있다. 정답은 없지만, 본인이 편리하게 사용할 수 있는 방법으로 개발 하면 될 것이다.


Eclipse 에서는 정상적으로 동작 하지만, CUI 환경에서 Maven clean tomcat:run 하는 경우 Parameter 값을 인식 하지 못하여 예외 상황이 발생 한다.


테스트 했던 프로젝트는 SpringFramework 3.2.11.RELEASE, Tomcat 7.0 으로 작성 하였다.


Cannot create inner bean 'net.sf.log4jdbc.tools.Log4JdbcCustomFormatter#746c2814' of type [net.sf.log4jdbc.tools.Log4JdbcCustomFormatter] while setting bean property 'logFormatter'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'net.sf.log4jdbc.tools.Log4JdbcCustomFormatter#746c2814' defined in file [D:\Project\workspace\sample\target\classes\spring\db\datasource-context.xml]: Error setting property values; nested exception is org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'margin' threw exception; nested exception is java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = #


예외가 발생 했기 때문에, Bean 을 생성 하지 못했다. Log4JdbcCustomFormatter margin 값이 인식이 되지 않았기 때문이다.


<beans:bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
    <beans:constructor-arg ref="dataSourceSpied" />
    <beans:property name="logFormatter">
        <beans:bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
            <beans:property name="loggingType" value="MULTI_LINE" />
            <!-- <beans:property name="margin" value="19" /> -->
            <beans:property name="sqlPrefix" value="SQL&#58;&#58;&#58;" />
        </beans:bean>
    </beans:property>
</beans:bean>


margin 값을 제외하고 테스트 해보자. 정상 동작 할 것이다.


'Maven' 카테고리의 다른 글

Maven Tomcat Plugin 사용 하기  (0) 2014.11.07
Eclipse에 Maven 연동 후 경고 창이 뜰 경우.  (0) 2012.11.12
Eclipse에서 Maven Project 생성하기  (0) 2012.11.09
Eclipse와 Maven 연동하기  (0) 2012.11.08

 

 eclipsc에 maven을 연동 한 후, 재 시작을 했을 경우 아래와 같은 문구를 볼 수 있다.

 

 

  maven의 핵심 Plugin은 JRE가 아닌 JDK를 사용하기 때문에, eclipse가 실행 될 때 참조 하는 설정 파일 eclipse.ini를 수정해야 하고, eclipse는 기본 값으로 JRE를 참조하기 때문에 이 부분도 JDK로 변경 하는 작업이 요구 된다.

 

Step 1. eclipse.ini 파일에 -vm option을 추가 한다.

-vm
D:\Develop\jdk\jdk1.7.0_05\bin\javaw.exe

 

Step 2. window > preferences > java > Installed JREs 옵션 중 JRE를 삭제하고, JDK를 추가 한다.

 아래의 설정 창을 보자. Default로는 JRE가 활성화 되어 있는 모습을 볼 수 있다. maven을 이용할 경우에는 JDK를 권장 하기 때문에 각자 설치한 경로를 찾아서 설정 하도록 하자.

 

 위 두가지 사항을 적용 했다면, 경고 문구는 없을 것 이다.

 Eclipse, Java는 설치가 되어 있다고 가정을 하고 진행 한다. 설치가 되어 있지 않은 경우 설치부터 하도록 한다.

Step 1. File > new > Other 클릭

Maven Project 를 선택 한다. 

 

Step 2. Maven Config (1)

위 그림 처럼 체크 박스 활성화

 

Step 3. Maven Config (2)

Group Id, Artifact Id, Name 작성

packaging은 Project의 종류를 판단하는 기준이 된다.

      • Dynamic Web Project -> war
      • Java Project -> jar

위와 같이 선택을 하면 된다. 

Finish 를 누르면 아래와 같이 Project가 생성된 것을 볼 수 있다. webapp 폴더까지는 자동으로 생성 되지만, WEB-INF, web.xml 은 수동으로 생성 하여야 한다.

 

War Project 일 경우 추가 진행

Step 4. pom.xml 파일을 수정

 <build>
  <plugins>
   <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
     <source>1.6</source>
     <target>1.6</target>
    </configuration>
   </plugin>

   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
     <warSourceDirectory>src/main/webapp</warSourceDirectory>
     <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
    </configuration>
   </plugin>

   <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>tomcat-maven-plugin</artifactId>
    <version>1.1</version>
    <configuration>
     <mode>war</mode>
     <port>9080</port>
     <path>/</path>
     <charset>UTF-8</charset>
     <uriEncoding>UTF-8</uriEncoding>
    </configuration>
   </plugin>
  </plugins>
 </build>

 plugin 설정을 추가 한다. tomcat을 maven에서는 was 의 역활을 수행 하긴 하지만, plugin 으로 간주 한다. 설정을 할 경우 pom.xml을 수정 해야 한다. 직접적으로 tomcat/conf/server.xml에 관여하지 않는다.

 

Step 4. Maven Build Condig

 Goals에 tomcat:run 으로 작성 한다.

 

Step 5. 실행

 run > run as > maven build

[INFO] Scanning for projects...
[WARNING]
[WARNING] Some problems were encountered while building the effective model for kr.helloweb:helloweb:war:0.0.1-SNAPSHOT
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 12, column 12
[WARNING]
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING]
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING]
[INFO]                                                                        
[INFO] ------------------------------------------------------------------------
[INFO] Building helloweb 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) @ helloweb >>>
[INFO]
[INFO] --- maven-resources-plugin:2.4.3:resources (default-resources) @ helloweb ---
[WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ helloweb ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] <<< tomcat-maven-plugin:1.1:run (default-cli) @ helloweb <<<
[INFO]
[INFO] --- tomcat-maven-plugin:1.1:run (default-cli) @ helloweb ---
[INFO] Running war on http://localhost:9080/
[INFO] Using existing Tomcat server configuration at D:\Project\study\workspace\helloweb\target\tomcat
2012. 11. 9 오후 2:40:38 org.apache.catalina.startup.Embedded start
정보: Starting tomcat server
2012. 11. 9 오후 2:40:38 org.apache.catalina.core.StandardEngine start
정보: Starting Servlet Engine: Apache Tomcat/6.0.29
2012. 11. 9 오후 2:40:38 org.apache.coyote.http11.Http11Protocol init
정보: Initializing Coyote HTTP/1.1 on http-9080
2012. 11. 9 오후 2:40:38 org.apache.coyote.http11.Http11Protocol start
정보: Starting Coyote HTTP/1.1 on http-9080

 tomcat이 starting 되는 것을 확인 할 수 있다.

 요즘 IDE Tool은 Eclipse를 보편적으로 사용을 하고 있다. 최근 개발은 가면 갈수록 비지니스의 복잡도는 올라가고 있고, 라이브러리의 수도 증가하고 있다. 기존에는 Ant 라는 빌드 툴을 사용 했지만 한계 점이 다가오면서 Maven이 등장하게 됬다. 

 일일히 수작업으로 다 관리 하기에는 실수도 할수 있고, 라이브러리를 빼먹을 수 있다. Ant는 라이브러리 저장소가 없었지만, Maven은 Local 라이브러리 저장소가 존재 한다. 훨씬 수월하게 라이브러리를 관리 할 수 있고, 여러가지 Plugin 도 활용 할 수 있다. 개발을 뒤에서 지원해주는 Maven을 알아보자.

 Step1. 파일 다운로드

http://maven.apache.org 페이지로 이동하여, Binary zip 파일을 다운로드 한다.

 

 Step2. 환경 변수 정의

환경 변수를 정의 한다.

내 컴퓨터 > 속성 > 고급 시스템 설정 > 환경 변수

    • H3_HOME: D:\Developer\build\apache-maven-3.0.4
    • PATH: D:\Developer\build\apache-maven-3.0.4\bin

Windows 명령 프롬프트 창에서 확인 한다.

위 그림과 같이 확인 될 경우 정상적으로 설치 확인.


 

 Step3. m2eclipse 플러그인 설치

Eclipse, Java 는 설치 되어 있다고 가정 한다. 

상단 메뉴 Help > Install New Software 

위에 보이는 모듈을 설치 하도록 한다.

 

Step4. 기본 저장소 설정

Maven 기본 저장소는 Windows User 폴더에 .m2 로 기본값이 설정 된다.

로컬 저장소 경로를 수정 한다.

Maven 경로에 /conf/settings.xml 파일을 수정 

 <!-- localRepository
   | The path to the local repository maven will use to store artifacts.
   |
   | Default: ~/.m2/repository
  <localRepository>/path/to/local/repo</localRepository>
  -->
  <localRepository>D:/m2/repository</localRepository>

본인이 원하는 경로로 수정 한다.

Eclipse의 상단 메뉴 Window > Preferences 왼쪽 메뉴 Maven > User Settings 로 이동

settings.xml 파일 경로를 지정 한 후, Update Settings 버튼 클릭.

적용이 안될 경우 재 시작

 

Step5. Hello World Project 생성

New > Maven Project 클릭 한다.

    • Create a simple project (skip archetype selection)
    • Use default Workspace location

활성화 후 Next >  

ArtifactId, Name, Group Id 작성 후 Finish

위와 같이 Project가 생성된 모습을 확인 할 수 있다.

Hello World 코드는 각자 작성 하도록 한다.



+ Recent posts