Dynamic Web Project 생성하고, 

src/ 폴더 아래에는 java와 properties 파일을 

WebContent/ 폴더 아래에는 WEB-INF 폴더와 jsp, 이미지, CSS 등을 복사하시면 될 것입니다. 


Maven web프로젝트 생성시에는 

main/java/src/ 에 java 파일을 

main/java/resources/ 폴더에 properties 파일과 xml 파일을 

main/webapp/ 폴더 아래에는 WEB-INF 폴더와 jsp, 이미지, CSS 등을 복사하시면 될 것입니다. 


related:

http://www.okjsp.net/seq/244872

gradle로 자바 빌드하기 1/2 

위 글에 이어집니다.


HelloWorld.java를 다음과 같이 수정합니다.

package hello;


import org.joda.time.LocalTime;


public class HelloWorld {

  public static void main(String[] args) {

    LocalTime currentTime = new LocalTime();

    System.out.println("The current local time is: " + currentTime);


    Greeter greeter = new Greeter();

    System.out.println(greeter.sayHello());

  }

}


joda의 LocalTime 클래스를 사용합니다.

이 상태에서 gradle build 를 실행하면 다음과 같은 에러 메시지를 만나게 됩니다.

gradle build

:compileJava

/Users/kenu/tmp/gradle-start/src/main/java/hello/HelloWorld.java:3: error: package org.joda.time does not exist

import org.joda.time.LocalTime;

                    ^

/Users/kenu/tmp/gradle-start/src/main/java/hello/HelloWorld.java:7: error: cannot find symbol

    LocalTime currentTime = new LocalTime();

    ^

  symbol:   class LocalTime

  location: class HelloWorld

/Users/kenu/tmp/gradle-start/src/main/java/hello/HelloWorld.java:7: error: cannot find symbol

    LocalTime currentTime = new LocalTime();

                                ^

  symbol:   class LocalTime

  location: class HelloWorld

3 errors

:compileJava FAILED


FAILURE: Build failed with an exception.


* What went wrong:

Execution failed for task ':compileJava'.

> Compilation failed; see the compiler error output for details.


* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.


BUILD FAILED


Total time: 3.239 secs


build.gradle 파일에 필요한 jar 파일을 명시합니다.

apply plugin: 'java'


repositories { mavenCentral() }

dependencies {

  compile "joda-time:joda-time:2.2"

}


다시 gradle build 를 실행하면 joda-time-2.2.jar 파일을 인터넷을 통해 maven central 저장소에서 자동으로 다운로드 받아서 빌드합니다.

gradle build

:compileJava

Download http://repo1.maven.org/maven2/joda-time/joda-time/2.2/joda-time-2.2.pom

Download http://repo1.maven.org/maven2/joda-time/joda-time/2.2/joda-time-2.2.jar

:processResources UP-TO-DATE

:classes

:jar

:assemble

:compileTestJava UP-TO-DATE

:processTestResources UP-TO-DATE

:testClasses UP-TO-DATE

:test UP-TO-DATE

:check UP-TO-DATE

:build


BUILD SUCCESSFUL


Total time: 7.106 secs


maven과 다르게 로컬에 jar를 관리하는 폴더는 .m2가 아닌 .gradle 폴더입니다.

./.gradle/caches/artifacts-26/filestore/joda-time/joda-time/2.2/jar/a5f29a7acaddea3f4af307e8cf2d0cc82645fd7d/joda-time-2.2.jar


행복하세요.




pom.xml에 다음 코드를 추가하면 mvn tomcat:run 으로 프로젝트를 실행할 수 있습니다. 설치된 톰캣이 없어도 톰캣은 자동으로 다운로드합니다.

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat6-maven-plugin</artifactId>
          <version>2.1</version>
        </plugin>
        <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.1</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

from: http://tomcat.apache.org/maven-plugin-2.1/



[INFO] [war:war {execution: default-war}]
[INFO] Packaging webapp
[HUDSON] Archiving C:\eGovFrameSvr\hudson\jobs\ok.egov\workspace\pom.xml to C:\eGovFrameSvr\hudson\jobs\ok.egov\modules\ok$egov\builds\2013-07-02_07-12-51\archive\ok\egov\1.0.0\pom.xml
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
---- Debugging information ----
message             : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
class               : org.apache.maven.plugin.war.util.WebappStructure
required-type       : org.apache.maven.plugin.war.util.WebappStructure
path                : /webapp-structure
line number         : 1
-------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] Trace
com.thoughtworks.xstream.converters.ConversionException: Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
---- Debugging information ----
message             : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
cause-exception     : com.thoughtworks.xstream.converters.reflection.ObjectAccessException
cause-message       : Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
class               : org.apache.maven.plugin.war.util.WebappStructure
required-type       : org.apache.maven.plugin.war.util.WebappStructure
path                : /webapp-structure
line number         : 1
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:63)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:45)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:46)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:117)
	...
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:722)
Caused by: com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Cannot construct org.apache.maven.plugin.war.util.WebappStructure as it does not have a no-args constructor
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.newInstance(PureJavaReflectionProvider.java:59)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:257)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:124)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:56)
	... 43 more
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Tue Jul 02 07:12:57 KST 2013
[INFO] Final Memory: 20M/49M
[INFO] ------------------------------------------------------------------------
channel stopped
Finished: FAILURE


이 에러 메시지는 maven war plugin 이 Java7을 지원하지 못하기 때문이라고 합니다. jdk1.6으로 내리거나 아래 플러그인을 pom.xml에 추가해야 합니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
</plugin>

from: http://stackoverflow.com/questions/7539970/cannot-construct-org-apache-maven-plugin-war-util-webappstructure-as-it-does-not




가상머신에서 ~/.m2/repository 를 찾지 못하는 경우입니다. 




C:\Users\kenu>mvn clean

[ERROR] Could not create local repository at \\vmware-host\Shared Folders\.m2\repository -> [Help 1]

[ERROR]

[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.

[ERROR] Re-run Maven using the -X switch to enable full debug logging.

[ERROR]

[ERROR] For more information about the errors and possible solutions, please read the following articles:

[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/LocalRepositoryNotAccessibleException


Git Bash를 통해서 mvn 의 경로를 찾았습니다. 제 경우 mvn이 세 가지 이상 설치되었기 때문이죠. Path 환경변수를 확인해도 될 것입니다.

which mvn


해당 maven의 conf폴더에 있는 settings.xml 파일을 다음과 같이 수정했습니다.


<!-- localRepository

   | The path to the local repository maven will use to store artifacts.

   |

   | Default: ~/.m2/repository

  -->

  <localRepository>~/.m2/repository</localRepository>


이후 잘 동작합니다.

메이븐, 빌드 도구

허광남 kenu.heo@gmail.com

메이븐은 아파치의 오픈 소스 빌드 도구입니다. http://maven.apache.org 사이트에서 정보를 구할 수 있습니다. 빌드란 프로그램 소스의 컴파일을 포함해서 애플리케이션을 사용할 수 있도록 패키징까지 해주는 과정입니다. 개발환경 도구에는 메이븐의 이클립스 플러그인이 함께 설치되어 있습니다. m2eclipse라는 플러그인이며, 이클립스에서 메이븐을 쉽게 사용하도록 도와주는 기능을 제공합니다.

메이븐 프로젝트 소스 구조

메이븐은 설정보다 관례(CoC;Convention over Configuration)라는 컨셉으로, 먼저 나왔던 ANT(http://ant.apache.org) 빌드 도구와 달리 빌드의 설정을 자유롭게 하는 대신 지정된 규칙에 따라 코드를 위치시키면 컴파일, 패키징, 문서화 등의 나머지 작업들을 자동으로 수행해 줍니다.

자바 라이브러리 일괄 관리

메이븐은 여러 프로젝트에 중복 산재해 있는 자바 라이브러리(JAR)를 한 곳에서 관리합니다. 일반적으로 프로젝트에서 소스코드가 차지하는 용량이 3~5메가라고 하면 jar파일의 크기는 30~50메가가 넘는 경우가 많습니다. 이런 경우 버전관리 시스템에서 제외시켜서 관리할 수 있다면 매우 가볍게 작업이 가능합니다.
메이븐은 사용자 홈 디렉토리를 기준으로 .m2 라는 폴더를 만들어서 repository 폴더 하위에 인터넷에서 다운로드 받은 jar 파일을 관리합니다. pom.xml 에서 지정된 라이브러리들을 필요에 따라 복사하거나 참조해서 사용합니다.

메이븐 설치

전자정부 표준프레임워크의 개발환경 서버를 설치하면 메이븐이 함게 설치됩니다. JAVA_HOME 환경변수 같이 MAVEN_HOME을 지정하고, PATH에 추가해도 되지만 메이븐/bin, 폴더만 PATH 환경변수에 추가하겠습니다. 컴퓨터 아이콘을 클릭하고, 컨텍스트 메뉴에서 속성을 선택합니다.
<그림> 환경변수 설정 시작



제어판의 좌측에서 고급 시스템 설정을 클릭합니다.
<그림> 고급 시스템 설정



하단의 시스템 변수에서 Path 항목을 선택합니다. 여기에 들어갈 값은 빌게이츠 친구 탐색기에서 복사할 수 있습니다.
<그림> 시스템 변수 Path



탐색기를 열어서 C:폴더에 들어갑니다. 주소줄을 클릭해서 복사합니다.
<그림> 메이븐 경로 복사



시스템 환경 변수 Path의 제일 앞에 복사한 C:경로를 추가하고 ;을 붙여서 구분해 줍니다.
<그림> 메이븐 경로 Path에 추가



cmd 창을 띄워서 mvn --version 을 입력합니다. 버전이 표시되면 정상적으로 설치가 된 것입니다.
<그림> 메이븐 버전 확인


메이븐 간단 테스트

간단히 템플릿 코드를 생성해 보겠습니다. 다음의 코드를 cmd창에 입력합니다.
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

필요한 jar파일을 알아서 다운로드합니다. 그 파일들을 이용해서 archetype 플러그인의 generate 골을 실행합니다.
<그림> 메이븐 아키타입 실행



tree /f 도스 명령어를 이용해서 생성된 파일들과 폴더를 보면 다음과 같습니다. src/main, src/test 폴더에 각각 지정한 groupId 패키지에 따른 하위 폴더와 각각의 java 샘플이 있고, 가장 상위에는 pom.xml 파일이 있습니다.
<그림> 메이븐 아키타입 퀵스타트 구조



빌드는 mvn package 페이즈(phase)를 통해서 할 수 있습니다.
<그림> 메이븐 pacakge 페이즈 실행



결과는 target 폴더가 만들어지면서 담기게 됩니다. quickstart 샘플의 경우 jar파일이 만들어 집니다.
<그림> 메이븐 산출물 target



target 폴더로 이동해서 java -cp my-app-1.0.SNAPSHOT.jar com.mycompany.app.App 명령을 입력하면 실행할 수 있습니다.
<그림> 메이븐 결과 실행



간단히 메이븐을 설치하고 이용하는 방법을 알아보았습니다.


http://okjsp.tistory.com
http://okjsp.net
http://github.com/kenu
























10/04일에 maven 3.0이 나왔습니다. http://maven.apache.org/
가볍게 2.8M의 파일을 받아서 압축을 풀었습니다. /home/kenu/java/apache-maven-3.0/

환경변수 $PATH에 maven실행파일 경로를 추가했습니다.
JAVA_HOME=/home/kenu/java/jdk1.6.0_18
PATH=$PATH:$JAVA_HOME/bin:/home/kenu/java/apache-maven-3.0/bin
export JAVA_HOME
export PATH

환경변수를 적용하고, mvn 버전을 확인합니다.
$. ~/.profile
$mvn -version
Apache Maven 3.0 (r1004208; 2010-10-04 20:50:56+0900)
Java version: 1.6.0_18
Java home: /home/kenu/java/jdk1.6.0_18/jre
Default locale: ko_KR, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-25-generic" arch: "amd64" Family: "unix"

설치는 잘 되었습니다.
샘플 프로젝트를 만들어봅니다. phase는 generate , groupId는 com.mycompany.app, artifactId는 my-app 정도가 됩니다.
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

이렇게 만들어집니다.
kenu@kenu-ubuntu:~/maven$ cd my-app
kenu@kenu-ubuntu:~/maven/my-app$ tree
.
|-- pom.xml
`-- src
    |-- main
    |   `-- java
    |       `-- com
    |           `-- mycompany
    |               `-- app
    |                   `-- App.java
    `-- test
        `-- java
            `-- com
                `-- mycompany
                    `-- app
                        `-- AppTest.java


이제 컴파일하고 빌드를 해봅니다.
mvn package

경로를 바꾸고 실행은 다음과 같이 할 수 있습니다.
java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App
Hello World!

설치는 잘 되었습니다.
사용자 홈 디렉토리 아래 .m2 라는 폴더가 생겨서 여기에 다운로드되는 파일들이 많이 있습니다. 로컬 캐시역할을 하기 때문에 처음 실행시에는 시간이 많이 걸립니다.

Ant를 넘어서 maven으로 갈아탈 준비중입니다.

+ Recent posts