달력

5

« 2025/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
.. .. ..
select a.name index_space_name  ,d.table_name table_name , e.user_name user_name , b.index_name index_name
from v$tablespaces a , system_.SYS_INDICES_ b , v$index c , system_.SYS_TABLES_  d , system_.sys_users_ e
where a.id=b.tbs_id and b.index_id=c.INDEX_ID and b.table_id = d.table_id and b.user_id = e.user_id
.
:
Posted by .07274.
2010. 11. 17. 11:08

[펌] Maven 기초 I.lib()/I.lib(Maven)2010. 11. 17. 11:08

.. .. ..

필자의 경우 Maven을 사용한지 2년이 넘어가는 데, Maven을 접한 이후 특별한 제약이 없는 한 Maven을 이용해서 프로젝트를 진행하고 있다. 흔히 Maven을 Ant와 비슷한 빌드(build) 도구로 생각하기도 하는데, Ant가 Build에 초점이 맞춰져 있다면 Maven은 프로젝트의 빌드 라이프사이클 기반 프레임워크를 제공하는데 초점이 맞춰져 있다.

본 글에서는 Maven을 이용해서 프로젝트를 생성하는 방법과, 디렉토리 구조, POM 파일 기본 구성, Maven 라이프 사이클 그리고 Maven 프로젝트를 이클립스 프로젝트로 생성하는 방법을 살펴보도록 하겠다.

Maven 설치

http://maven.apache.org/ 사이트를 방문하면 최신 버전의 Maven을 다운로드 받을 수 있다. 현재 최신 버전은 2.0.9이며, apache-maven-2.0.9-bin.zip 파일이나 apache-maven-2.0.9-bin.tar.gz 파일 등 원하는 형식으로 압축된 파일을 다운로드 받으면 된다.

파일을 다운로드 받은 뒤에는 다음과 같은 순서로 설치 작업을 해 주면 된다.

  1. 다운로드 받은 파일의 압축을 푼다. 예를 들면 /usr/local 디렉터리나 C:\ 에 압축을 푼다.
  2. M2_HOME 환경 변수에 설치 디렉터리를 값으로 설정한다. 예, M2_HOME=c:\apache-maven-2.0.9
  3. PATH 환경 변수에 M2를 추가한다. 예, PATH=%M2_HOME%\bin;%PATH%
  4. JAVA_HOME 환경 변수가 JDK 설치 디렉터리를 가리키고 있는 지 확인한다. 예, JAVA_HOME=c:\jdk1.6.0_07

환경 변수를 모두 설정해 주었다면 아래의 명령어를 사용해서 Maven이 제대로 실행되는 지 확인해보자.

C:\Users\madvirus>mvn -version
Maven version: 2.0.9
Java version: 1.5.0_16
OS name: "windows vista" version: "6.0" arch: "x86" Family: "windows"


Maven 프로젝트 생성하기

설치가 끝났다면 Maven 프로젝트를 생성해 보자. 명령 프롬프트에서 아래 명령어를 실행하면 된다. (아래 명령어를 처음 실행할 경우 꽤 오랜 시간이 걸리는데, 그 이유는 Maven이 필요한 플러그인과 모듈을 다운로드 받기 때문이다. Maven 배포판은 최초로 Maven을 사용하는 데 필요한 모듈만 포함하고 있고, 그 외에 archetype 플러그인, compiler 플러그인 등 Maven을 사용하는 데 필요한 모듈은 포함하고 있지 않다. 이들 모듈은 실제로 필요할 때 Maven 중앙 리포지토리에서 로딩된다.)

mvn archetype:generate

위 명령어를 실행하면 Maven 프로젝트를 생성하는 데 필요한 정보를 입력하라는 메시지가 단계적으로 뜨고, 각 항목별로 알맞은 값을 입력해주면 된다. 아래는 실행 화면 예이다. 붉은색으로 표시한 것은 입력한 값이다.

$ mvn archetype:generate
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:generate] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Preparing archetype:generate
...
Choose archetype:
1: internal -> appfuse-basic-jsf (AppFuse archetype for creating a web application with Hibernate, Spring and JSF)
...
...
15: internal -> maven-archetype-quickstart ()
16: internal -> maven-archetype-site-simple (A simple site generation project)
17: internal -> maven-archetype-site (A more complex site project)
18: internal -> maven-archetype-webapp (A simple Java web application)
...
41: internal -> gmaven-archetype-mojo (Groovy mojo archetype)
Choose a number:  (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/.../41) 15: : 15
Define value for groupId: : net.daum.cafe
Define value for artifactId: : simple-app
Define value for version:  1.0-SNAPSHOT: :
Define value for package:  net.daum.cafe: :
Confirm properties configuration:
groupId: net.daum.cafe
artifactId: simple-app
version: 1.0-SNAPSHOT
package: net.daum.cafe
 Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating OldArchetype: maven-archetype-quickstart:RELEASE
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: net.daum.cafe
[INFO] Parameter: packageName, Value: net.daum.cafe
[INFO] Parameter: basedir, Value: c:\work\eclipse34workspace\personal
[INFO] Parameter: package, Value: net.daum.cafe
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: artifactId, Value: simple-app
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] OldArchetype created in dir: c:\work\eclipse34workspace\personal\simple-app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 minutes 5 seconds
[INFO] Finished at: Mon Dec 15 11:37:07 KST 2008
[INFO] Final Memory: 7M/14M
[INFO] ------------------------------------------------------------------------ 

위 과정에서 실제로 입력하는 값은 다음과 같다.

  • groupId - 프로젝트 속하는 그룹 식별 값. 회사, 본부, 또는 단체를 의미하는 값이 오며, 패키지 형식으로 계층을 표현한다. 위에서는 net.daum.cafe를 groupId로 이용하였다.
  • artifactId - 프로젝트 결과물의 식별 값. 프로젝트나 모듈을 의미하는 값이 온다. 위에서는 simple-app을 artifactId로 이용하였다.
  • version - 결과물의 버전을 입력한다. 위에서는 기본 값인 1.0-SNAPSHOT을 사용하였다.
  • package - 기본적으로 생성할 패키지를 입력한다. 별도로 입력하지 않을 경우 groupId와 동일한 구조의 패키지를 생성한다.
기존에는 archetype:create 골을 이용해서 프로젝트를 생성했었다. 하지만, maven-archetype-plugin의 버전이 올라가면서 archetype:generate 골이 추가되었고, archetype:create 골은 deprecated 되었다. 하지만, 하위 호환을 위해 archetype:create 골은 아직 지원되고 있다.

Maven 프로젝트의 기본 디렉토리 구조

archetype:generate 골이 성공적으로 실행되면, artifactId에 입력한 값과 동일한 이름의 디렉터리가 생성된다. 위 경우에는 현재 디렉터리에 simple-app 이라는 하위 디렉터리가 생성된다. 위 과정에서 선택한 archetype은 maven-archetype-quickstart 인데, 이 archetype을 선택했을 때 생성되는 디렉터리 구조는 다음과 같다.

simple-app
├─src
│   ├─main
│   │  └─java
│   │      └─net
│   │          └─daum
│   │              └─cafe
│   │                  └─App.java
│   ├─test
│       └─java
│           └─net
│               └─daum
│                   └─cafe
│                      └─AppTest.java
└─pom.xml

기본적으로 생성되는 디렉터리를 포함한 Maven 프로젝트의 주요 디렉터리는 다음과 같다.

  • src/main/java - 자바 소스 파일이 위치한다.
  • src/main/resources - 프로퍼티나 XML 등 리소스 파일이 위치한다. 클래스패스에 포함된다.
  • src/main/webapp - 웹 어플리케이션 관련 파일이 위치한다. (WEB-INF 디렉터리, JSP 파일 등)
  • src/test/java - 테스트 자바 소스 파일이 위치한다.
  • src/test/resources - 테스트 과정에서 사용되는 리소스 파일이 위치한다. 테스트 시에 사용되는 클래스패스에 포함된다.

기본적으로 생성되지 않은 디렉터리라 하더라도 직접 생성해주면 된다. 예를 들어, src/main 디렉터리에 resources 디렉터리를 생성해주면 Maven은 리소스 디렉터리로 인식한다.

컴파일 해보기/테스트 실행 해보기/패키지 해보기

이제 간단하게 컴파일과 테스트를 실행해보자. 소스 코드를 컴파일 하려면 다음과 같은 명령어를 실행해주면 된다.

mvn compile

컴파일 된 결과는 target/classes 디렉터리에 생성된다.

테스트 클래스를 실행해보고 싶다면 다음과 같은 명령어를 사용하면 된다.

$ mvn test
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building simple-app
[INFO]    task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test]
[INFO] Surefire report directory: c:\work\eclipse34workspace\personal\simple-app\target\surefire-reports
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running net.daum.cafe.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.051 sec
Results :
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Tue Dec 16 14:26:00 KST 2008
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

그러면, 테스트 코드를 컴파일한 뒤 테스트 코드를 실행한다. 그리고 테스트 성공 실패 여부를 화면에 출력한다. 컴파일 된 테스트 클래스들은 target/test-classes 디렉터리에 생성되고, 테스트 결과 리포트는 target/surefire-reports 디렉터리에 저장된다.

(아무것도 한게 없으니 당연하지만) 모든 코드가 정상적으로 만들어지고 테스트도 통과했으니, 이제 배포 가능한 jar 파일을 만들어보자. 아래 명령어를 실행하면 프로젝트를 패키징해서 결과물을 생성한다.

$ mvn package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building simple-app
[INFO]    task-segment: [package]
[INFO] ------------------------------------------------------------------------
...
...
[INFO] [jar:jar]
[INFO] Building jar: c:\work\eclipse34workspace\personal\simple-app\target\simple-app-1.0-SNAPSHOT.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Tue Dec 16 15:20:10 KST 2008
[INFO] Final Memory: 6M/13M
[INFO] ------------------------------------------------------------------------

mvn package가 성공적으로 실행되면, target 디렉터리에 프로젝트 이름과 버전에 따라 알맞은 이름을 갖는 jar 파일이 생성된다. 위 예제의 경우에는 simple-app-1.0-SNAPSHOT.jar 파일이 생성된 것을 확인할 수 있다.

POM 파일 기본

Maven 프로젝트를 생성하면 pom.xml 파일이 프로젝트 루트 디렉터리에 생성된다. 이 pom.xml 파일은 Project Object Model 정보를 담고 있는 파일로서, 이 파일에서 다루는 주요 설정 정보는 다음과 같다.

  • 프로젝트 정보 - 프로젝트의 이름, 개발자 목록, 라이센스 등의 정보를 기술
  • 빌드 설정 - 소스, 리소스, 라이프 사이클 별 실행할 플러그인 등 빌드와 관련된 설정을 기술
  • 빌드 환경 - 사용자 환경 별로 달라질 수 있는 프로파일 정보를 기술
  • POM 연관 정보 - 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등을 기술

archetype:create 골 실행시 maven-archetype-quickstart Archetype을 선택한 경우 생성되는 pom.xml 파일은 다음과 같다.

[기본으로 생성되는 pom.xml 파일]

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>net.daum.cafe</groupId>
  <artifactId>simple-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>simple-app</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

위 POM 파일에서 프로젝트 정보를 기술하는 태그는 다음과 같다.

  • <name> - 프로젝트 이름
  • <url> - 프로젝트 사이트 URL

POM 연관 정보는 프로젝트간 연관 정보를 기술하는데, 관련 태그는 다음과 같다.

  • <groupId> - 프로젝트의 그룹 ID 설정
  • <artifactId> - 프로젝트의 Artifact ID 설정
  • <version> - 버전 설정
  • <packaging> - 패키징 타입 설정. 위 코드의 경우 프로젝트의 결과 Artifact가 jar 파일로 생성됨을 의미한다. jar 뿐만 아니라 웹 어플리케이션을 위한 war나 JEE를 위한 ear 등의 패키징 타입이 존재한다.
  • <dependencies> - 이 프로젝트에서 의존하는 다른 프로젝트 정보를 기술한다.
    • <dependency> - 의존하는 프로젝트 POM 정보를 기술
      • <groupId> - 의존하는 프로젝트의 그룹 ID
      • <artifactId> - 의존하는 프로젝트의 artifact ID
      • <version> - 의존하는 프로젝트의 버전
      • <scope> - 의존하는 범위를 설정

의존 설정

<dependency> 부분의 설정에 대해서 좀 더 살펴보도록 하자.

Maven을 사용하지 않을 경우 개발자들은 코드에서 필요로 하는 라이브러리를 각각 다운로드 받아야 한다. 예를 들어, 아파치 commons DBCP 라이브러리를 사용하기 위해서는 DBCP 뿐만 아니라 common pool 라이브러리도 다운로드 받아야 한다. 물론, commons logging을 비롯한 라이브러리도 모두 추가로 다운로드 받아 설치해 주어야 한다. 즉, 코드에서 필요로 하는 라이브러리 뿐만 아니라 그 라이브러리가 필요로 하는 또 다른 라이브러리도 직접 찾아서 설치해 주어야 한다.

하지만, Maven을 사용할 경우에는 코드에서 직접적으로 사용하는 모듈에 대한 의존만 추가해주면 된다. 예를 들어, commons-dbcp 모듈을 사용하고 싶은 경우 다음과 같은 <dependency> 코드만 추가해주면 된다.

<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.2.1</version>
</dependency>

그러면, Maven은 commons-dbcp 뿐만 아니라 commons-dbcp가 의존하는 라이브러리가 자동으로 처리해준다. 실제로 1.2.1 버전의 commons-dbcp 모듈의 pom.xml 파일을 보면 의존 부분이 다음과 같이 설정되어 확인할 수 있다.

  <dependencies>
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>commons-pool</groupId>
      <artifactId>commons-pool</artifactId>
      <version>1.2</version>
    </dependency>
    <dependency>
      <groupId>javax.sql</groupId>
      <artifactId>jdbc-stdext</artifactId>
      <version>2.0</version>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>xml-apis</groupId>
      <artifactId>xml-apis</artifactId>
      <version>2.0.2</version>
    </dependency>
    <dependency>
      <groupId>xerces</groupId>
      <artifactId>xerces</artifactId>
      <version>2.0.2</version>
    </dependency>
  </dependencies>

Maven은 commons-dbcp 모듈을 다운로드 받을 때 관련 POM 파일도 함께 다운로드 받는다. (다운로드 받은 파일은 로컬 리포지토리에 저장되는데 이에 대한 내용은 뒤에서 다시 설명하겠다.) 그리고 POM 파일에 명시한 의존 모듈을 함께 다운로드 받는다. 즉, commons-dbcp 1.2.1 버전의 경우 commons-collections 2.1 버전과 commons-pool 1.2 버전 등을 함께 다운로드 받는다. 이런 식으로 반복해서 다운로드 받은 모듈이 필요로 하는 모듈을 다운로드 받고 이들 모듈을 현재 프로젝트에서 사용할 클래스패스에 추가해준다.

따라서, 개발자는 일일이 필요한 모듈을 다운로드 받을 필요가 없으며, 현재 코드에서 직접적으로 필요로 하는 모듈에 대해서만 <dependency>로 추가해주면 된다. 나머지 의존은 모두 Maven이 알맞게 처리해준다.

mvnrepository.com 사이트에서 POM 정보 찾기

Maven을 사용할 때 가장 많이 찾게 되는 사이트가 mvnrepository.com이다. mvnrepository.org는 Maven 중앙 리포지토리에 등록된 POM 정보를 검색해주는 기능을 제공해준다. 이 사이트를 통해서 추가할 라이브러리의 <dependency> 설정 정보를 구할 수 있다.


의존의 scope: compile, runtime, provided, test

앞의 pom.xml 파일에서 <dependency> 부분을 보면 <scope>를 포함하고 있는 것과 그렇지 않은 것이 존재한다는 것을 알 수 있다. <scope>는 의존하는 모듈이 언제 사용되는 지를 설정할 때 사용되며, <scope>에 올 수 있는 값은 다음의 네 가지가 존재한다.

  • compile - 컴파일 할 때 필요. 테스트 및 런타임에도 클래스패스에 포함된다. <scope>를 설정하지 않을 경우 기본 값은 compile 이다.
  • runtime - 런타임에 필요. JDBC 드라이버 등이 예가 된다. 프로젝트의 코드를 컴파일 할 때는 필요하지 않지만, 실행할 때 필요하다는 것을 의미한다. 배포시 포함된다.
  • provided - 컴파일 할 때 필요하지만, 실제 런타임 때에는 컨테이너 같은 것에서 기본으로 제공되는 모듈임을 의미한다. 예를 들어, 서블릿이나 JSP API 등이 이에 해당한다. 배포시 제외된다.
  • test - 테스트 코드를 컴파일 할 때 필요. Mock 테스트를 위한 모듈이 예이다. 테스트 시에 클래스패스에 포함되며, 배포시 제외된다.


원격 리포지토리와 로컬 리포지토리

Maven은 컴파일이나 패키징 등 작업을 실행할 때 필요한 플러그인이나 pom.xml 파일의 <dependency> 등에 설정한 모듈을 Maven 중앙 리포지토리에서 다운로드 받는다. 현재 중앙 리포지토리의 주소는 http://repo1.maven.org/maven2/ 이다.

원격 리포지토리에서 다운로드 받은 모듈은 로컬 리포지토리에 저장된다. 로컬 리포지토리는 [USER_HOME]/.m2/repository 디렉터리에 생성되며, 로컬 리포지토리에는 다음과 같은 형식의 디렉터리를 생성한 뒤 다운로드 받은 모듈을 저장한다.

[groupId]/[artifactId]/[version]

예를 들어, commons-dbcp 1.2.1 버전의 경우, 모듈 및 관련 POM 파일이 저장되는 디렉터리는 다음과 같다.

[USER_HOME]/.m2/repository/commons-dbcp/commons-dbcp/1.2.1

위 디렉터리에 저장되는 파일은 패키징 된 모듈 파일, pom 파일, 그리고 소스 코드 다운로드 옵션을 실행한 경우에는 소스 코드를 포함한 jar 파일이 포함된다.

일단 원격 리포지토리로부터 파일을 다운로드해서 로컬 리포지토리에 저장하면, 그 뒤로는 로컬 리포지토리에 저장된 파일을 사용하게 된다.

Maven 라이프사이클(Lifecycle)과 플러그인 실행

본 글의 서두에 Maven은 프로젝트의 라이프사이클 기반 프레임워크를 제공한다고 했다. 앞서 프로젝트를 생성한 뒤 컴파일하고(mvn compile), 테스트 하고(mvn test), 패키징 하는(mvn package) 과정을 정해진 명령어를 이용해서 실행했는데, 이때 compile, test, package는 모두 빌드 라이프사이클에 속하는 단계이다.

Maven은 clean, build (default), site의 세 가지 라이프사이클을 제공하고 있다. 각 라이프사이클은 순서를 갖는 단계(phase)로 구성된다. 또한, 각 단계별로 기본적으로 실행되는 플러그인(plugin) 골(goal)이 정의되어 있어서 각 단계마다 알맞은 작업이 실행된다. 아래 표는 디폴트 라이프사이클을 구성하고 있는 주요 실행 단계를 순서대로 정리한 것이다.

[표] 디폴트 라이프사이클의 주요 단계(phase)

 단계 설명  단계에 묶인 플러그인 실행
generate-sources 컴파일 과정에 포함될 소스를 생성한다. 예를 들어,  DB 테이블과 매핑되는 자바 코드를 생성해주는 작업이 이 단계에서 실행된다.
process-sources 필터와 같은 작업을 소스 코드에 처리한다.  
generate-resources 패키지에 포함될 자원을 생성한다.   
process-resources 필터와 같은 작업을 자원 파일에 처리하고, 자원 파일을 클래스 출력 디렉토리에 복사한다. resources:resources 
compile 소스 코드를 컴파일해서 클래스 출력 디렉터리에 클래스를 생성한다. compiler:compile
generate-test-sources 테스트 소스 코드를 생성한다. 예를 들어, 특정 클래스에서 자동으로 테스트 케이스를 만드는 작업이 이 단계에서 실행된다.
process-test-sources 필터와 같은 작업을 테스트 소스 코드에 처리한다. resources:testResources 
generate-test-resources 테스트를 위한 자원 파일을 생성한다.   
process-test-resources 필터와 같은 작업을 테스트 자원 파일에 처리하고, 테스트 자원 파일을 테스트 클래스 출력 디렉터리에 복사한다.  
test-compile 테스트 소스 코드를 컴파일해서 테스트 클래스 추력 디렉터리에 클래스를 생성한다. compiler:testCompile
test 테스트를 실행한다. surefire:test
package 컴파일 된 코드와 자원 파일들을 jar, war와 같은 배포 형식으로 패키징한다. 패키징에 따라 다름
jar - jar:jar
war - war:war
pom - site:attach-descriptor
ejb - ejb:ejb
install 로컬 리포지토리에 패키지를 복사한다. install:install
deploy 생성된 패키지 파일을 원격 리포지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 한다. deploy:deploy

라이프사이클의 특정 단계를 실행하려면 다음과 같이 mvn [단계이름] 명령어를 실행하면 된다.

mvn test
mvn deploy

라이프사이클의 특정 단계를 실행하면 그 단계의 앞에 위치한 모든 단계가 실행된다. 예를 들어, test 단계를 실행하면 test 단계를 실행하기에 앞서 'generate-sources' 단계부터 'test-compile' 단계까지 각 단계를 순서대로 실행한다. 각 단계가 실행될 때는 각 단계에 묶인 골(goal)이 실행된다.

플러그인을 직접 실행할 수도 있다. mvn 명령어에 단계 대신 실행할 플러그인을 지정하면 된다.

mvn surefire:test

단, 플러그인 골을 직접 명시한 경우에는 해당 플러그인만 실행되기 때문에 라이프사이클의 단계가 실행되지는 않는다.

플러그인 골(Plugin Goal)

Maven에서 플러그인을 실행할 때에는 '플러그인이름:플러그인지원골'의 형식으로 실행할 기능을 선택한다. 예를 들어, compiler:compile은 'compiler'는 플러그인에서 'compile' 기능(goal)을 실행한다는 것을 뜻한다.


맺음말

이번 글에서는 Maven의 기본 사용법을 살펴봤다. Maven이 제공하는 의존 관리는 개발자를 jar 지옥(?)에서 구해준다는 것을 알 수 있었다. 또한, Maven은 표준화된 라이프사이클을 제공하고 있기 때문에 개발자가 컴파일-테스트-패키징 등의 과정을 손으로 정의하지 않아도 되며, 개발자는 Maven이 제공하는 단계 중 필요한 단계만 실행하면 된다. 그럼, 나머지 작업(컴파일, 테스트 실행, jar 파일 생성)은 모두 Maven이 처리해준다.

다음 글에서는 많이 사용되고 있는 개발툴인 이클립스에서 Maven 프로젝트를 import하는 방법과 컴파일러 버전을 명시하는 방법을 살펴보도록 하겠다.


관련 자료:

 

[펌] http://javacan.tistory.com/129

.
:
Posted by .07274.
2010. 11. 11. 15:37

Java String charset 바꾸기 I.lib()/I.lib(Unix)2010. 11. 11. 15:37

.. .. ..

/*address = new String(info.getAddress().getBytes("ISO-8859-1"), "UTF-8");
   System.out.println(address.getBytes());
   System.out.println("ISO-8859-1 => UTF-8 : "+new String(address.getBytes("ISO-8859-1"), "UTF-8"));
   System.out.println("ISO-8859-1 => EUC-KR : "+new String(address.getBytes("ISO-8859-1"), "EUC-KR"));
   System.out.println("ISO-8859-1 => ISO-8859-1 : "+new String(address.getBytes("ISO-8859-1"), "ISO-8859-1"));
   System.out.println("ISO-8859-1 => MS949 : "+new String(address.getBytes("ISO-8859-1"), "MS949"));
   System.out.println("UTF-8 => UTF-8 : "+new String(address.getBytes("UTF-8"), "UTF-8"));
   System.out.println("UTF-8 => EUC-KR : "+new String(address.getBytes("UTF-8"), "EUC-KR"));
   System.out.println("UTF-8 => ISO-8859-1 : "+new String(address.getBytes("UTF-8"), "ISO-8859-1"));
   System.out.println("UTF-8 => MS949 : "+new String(address.getBytes("UTF-8"), "MS949"));
   System.out.println("EUC-KR => UTF-8 : "+new String(address.getBytes("EUC-KR"), "UTF-8"));
   System.out.println("EUC-KR => EUC-KR : "+new String(address.getBytes("EUC-KR"), "EUC-KR"));
   System.out.println("EUC-KR => ISO-8859-1 : "+new String(address.getBytes("EUC-KR"), "ISO-8859-1"));
   System.out.println("EUC-KR => MS949 : "+new String(address.getBytes("EUC-KR"), "MS949"));
   System.out.println("MS949 => UTF-8 : "+new String(address.getBytes("MS949"), "UTF-8"));
   System.out.println("MS949 => EUC-KR : "+new String(address.getBytes("MS949"), "EUC-KR"));
   System.out.println("MS949 => ISO-8859-1 : "+new String(address.getBytes("MS949"), "ISO-8859-1"));
   System.out.println("MS949 => MS949 : "+new String(address.getBytes("MS949"), "MS949"));*/

'I.lib() > I.lib(Unix)' 카테고리의 다른 글

rm -rf 복구 방법  (0) 2011.06.03
아파치 & 톰켓 실행 순서 및 확인.  (1) 2011.02.07
VI로 문자열 바꾸기.  (0) 2010.11.04
Crontab 설정  (0) 2010.10.11
REDHAT VERSION (버젼) 정보  (0) 2010.07.30
.
:
Posted by .07274.
2010. 11. 4. 17:41

VI로 문자열 바꾸기. I.lib()/I.lib(Unix)2010. 11. 4. 17:41

.. .. ..
%s/2010\/10\/01/2010\/11\/01/

%s 는 데이터 총 Row
2010\/10\/01 는 2010/10/01 을 의미한다.
2010\/11\/01 는 2010/11/01 을 의미한다.

2010/10/01 을 2010/11/01로 변환한다라는 뜻.

'I.lib() > I.lib(Unix)' 카테고리의 다른 글

아파치 & 톰켓 실행 순서 및 확인.  (1) 2011.02.07
Java String charset 바꾸기  (1) 2010.11.11
Crontab 설정  (0) 2010.10.11
REDHAT VERSION (버젼) 정보  (0) 2010.07.30
^M 문자열이 생기는 이유 & 삭제 방법  (0) 2010.07.16
.
:
Posted by .07274.
.. .. ..

서버에 기본적으로 접근하는 주소들 (ex.10.12.120.217  신규 1서버) 은 Apache 로 들어가게 되며 80포트로 접근하게 된다.
이때 jsp 파일같은 경우는 Tomcat으로 보내서 Tomcat이 처리하게 하는데 중요한건
Apache와 Tomcat을 연결해줘야 둘이 호환한다는 것.

     1. apache2/conf/httpd.conf 파일을 열어서 mod_jk.conf 라는 파일을 import 해준다.
           
  include conf/mod_jk.conf
     2. apache2/conf/mod_jk.conf 파일을 만들어 준다.
               
LoadModule    jk_module  modules/mod_jk.so
JkWorkersFile "/usr/local/web/apache2/conf/workers.properties"
JkShmFile    "/usr/local/web/apache2/bin/mod_jk.shm"
JkLogLevel    info
#JkLogFile  "|/usr/local/web/apache2/bin/rotatelogs /usr/local/web/apache2/logs/mod_jk_log.%Y%m%d 86400"
JkLogFile "logs/mod_jk.log"
JkOptions  +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories

## Mount Configuration
JkMount /*.jsp node1
#JkMount /*.do node1
JkMount /servlet/* node1


    3. mod_jk.conf 파일에 프로퍼티 파일인 /apache2/conf/workers.properties 파일을 만들어준다.
   
            ###################################
               ## [ Define Round Robin 2 worker using ajp13 ]
               ###################################
               worker.list=node1,jkstatus                     #node1 이라는 놈을 만든다.

               ###################################
               ## 0. Define loadbalancer
               ###################################
               ## 1. Set properties for worker (ajp13)
               ## worker.list=node1
               ###################################
               worker.node1.type=ajp13                #Apache 와 Tomcat 이 asp13 프로토콜과 주고받는타입.               
               worker.node1.host=127.0.0.1
               worker.node1.port=8009                        #node1의 포트. 이건 tomcat의 포트를 의미한다.
               worker.node1.lbfactor=1                       #로드 벨런싱 관련 프로퍼티.
               worker.node1.socket_timeout=300          
               worker.node1.socket_keepalive=False

               ## Do not use cachesize with values higher then 1 on Apache 2.x prefork or Apache 1.3.x
               ## Its default value (eq. connection_pool_minsize) is (connection_pool_size+1)/2
               worker.node1.connection_pool_size=1
               worker.node1.connection_pool_minsize=1
               worker.node1.connection_pool_timeout=60

               worker.jkstatus.type=status



※ 혹시 Version 이 바뀌어 mod_jk 이 정상작동하지 않을시(Log를 보면 확인가능) 아파치 사이트에서 mod_jk 관련 문서를 받아서 설정값을 살펴보도록 한다.


위와같이 했다면 연결이 끝났다~! 이제 Apache를 Restart시킨다. 그리고 웹에 접근하면 첫화면이야 잘나오겠지만
실제 jsp가 Tomcat 과 연동지 않는것을 알수있다. 이부분은 Tomcat 에 필요한 웹 서비스가 Context로 등록되지 않았기 때문이다. Tomcat 의 administration 에서 tomcat server/Service /Host/Context 에 필요로 하는 웹 서비스가 있는지 확인하고 없다면 등록하면 된다.

.
:
Posted by .07274.
.. .. ..
1. 파일 2가지를 준비한다.
     spy.properties , p6spy.jar

2. Jar 파일은 lib 폴더같은곳에 넣어 Tomcat이 돌때 같이 올라갈수 있도록 둔다.

3. properties 파일은 classes 파일에 log4j.properties에 두는곳과 같은곳에 둔다.

4. driverclassname 에 com.p6spy.engine.spy.P6SpyDriver 라고 Spy Driver Class 이름을 적어준다.

5. spy.properties 에 realdriver=Altibase.jdbc.driver.AltibaseDriver라고 설정해준다.
   ( altibase 일때.. 다른 DB를 사용할 경우 그 db의 DriveClassname 을 적어준다.)

6. 원리
DB요청 - > Tomcat -> Axis2 - > Service - > 설정된 driverclass Load(  Spy Driver Class 로 설정되있으므로 Spy Load)
-> Spy는 spy.properties 파일을 Load하고 설정된 Drive로 연결 - > DB 접속.
 이때 spy를 거치고 DB를 in/out 하기때문에  spy.properties에 설정된 Log 부분에 Query 문을 저장하게 된다.

'I.lib() > I.lib(Java)' 카테고리의 다른 글

JAVA에서 엑셀 파일 읽고 쓰기  (0) 2011.07.04
Spy 설정 방법.  (1) 2011.03.31
JNI (JAVA Native Interface ) 란? & 사용법.  (0) 2010.07.27
Heapdump 파일 생성 이유  (0) 2010.05.19
JNDI 란?  (1) 2010.04.08
.
:
Posted by .07274.
.. .. ..
aexport의 사용법은 아래와 같습니다.

1. aexport를 수행합니다.
 (편의를 위해 새로운 디렉토리를 생성하고 (ex. /home/altibase/aexport) 그 디렉토리 내에서 작업.)
  -> sh> aexport -S 127.0.0.1 -U sys -P manager
    (위 작업중 다른 계정으로 사용하고 싶으면 사용계정 id , pw를 넣으면 된다.)

2. 작업이 완료되면 여러 파일이 생성된다 . 그 파일들의 명칭은 아래와 같다.
SYS_CRT_USER.sql : 유저 생성
SYS_PRIV_USER.sql : 유저 권한.
SYS_CRT_TBS.sql : 테이블 스페이스 생성
SYS_CRT_REP.sql : 이중화 객체 생성
ALL_CRT_VIEW.sql : 뷰 생성
ALL_CRT_PROC.sql : 저장 프로시저 생성.
{유저명}_CRT_TBL.sql : 테이블 생성
{유저명}_CRT_INDEX.sql : 인덱스 생성
{유저명}_CRT_FK.sql : 외래키 생성

run_il_in.sh : 데이터 로드 스크립트
run_il_out.sh : 데이터 다운로드 스크립트
run_is.sh : 스키마 생성 스크립트
run_is_fk.sh : 외래키 생성 스크립트
run_is_index.sh : 인덱스 생성 스크립트.


3. aexport 에 의하여 생성된 쉘 스크립트(.sh)를 실행하여 테이블의 데이터를 추출한다.
   --> sh>sh run_il_out.sh
  (위 스크립트는 iloader를 이용하여 모든 테이블의 데이터를 download 받는 스크립트입니다.)

4. 3번 작업을 완료하면, 테이블의 개수만큼 fmt파일, dat파일, log파일들이 생성되어 있을 겁니다.

5. 4번작업까지 완료하면 기존의 데이터베이스에서 데이터를 다운로드 하는 작업(백업)까지 완료된 것입니다.
  생성된 파일들을 백업파일로 보관하시면 됩니다.
6번 작업부터는 새로운 서버에 데이터베이스를 덥로드 하는 방법입니다.

6. 데이터베이스가 설치될 대상 서버에 알티베이스를 설치합니다. (db를 지우고 새로 설치하는 경우도 포함)

7. 4번까지의 작업을 통해 생성된 쉘스크립트를 이용해 대상 데이터베이스 구조를 생성.
  - sh> sh run_is.sh

8. 완료후 isql로 접속해 db 구조가 기존의 구조와 동일한지 확인.

9, 정상 생성되었다면 대상 데이터베이스에 기존의 데이터를 업로드 하는 작업을 수행.
  -> sh> sh run_il_in.sh

10. 9번 작업은 3번 작업으로 생성된 fmt파일dat파일 log파일들을 이용해 기존의 데이터를 대상 데이터베이스에 업로드 하는 작업이다.

11. 9번 작업이 완료되면 대상 데이터베이스에 인덱스 및 외래 키를 생성합니다.
--> sh> sh run_is_index.sh


TIP .  테이블 전체의 백업이 아닌 부분의 백업이 필요하다면 .sh 파일들을 원하는 테이블 부분만 돌아가도록 수정하면 된다.

.
:
Posted by .07274.
2010. 10. 11. 10:17

Crontab 설정 I.lib()/I.lib(Unix)2010. 10. 11. 10:17

.. .. ..

 
crontab 이란?
서버 스스로 정해둔 명령을 일정 기간마다 실행하도록 하는 것입니다.

1. Crontab 실행 및 종료
   실행 : /etc/rc.d/init.d/crond start
   종료 : /etc/rc.d/init.d/crond stop

2. 설정 
크론 설정 : /etc/crontab ( ~]$crontab 해도 됨.)

option
  -e : 설정된 파일을 새롭게 편집
  -d : 등록된 내용을 삭제
  -l  : 현재 등록된 내용 보기

3. 시간 등록 
ex) 01 03 * * * /disk/script/tomcatctl start

 필드 의미  내용
 필드 1 (01)  분  0-59
 필드 2 (03)  시  0-23
 필드 3 (*)  일  0-31
 필드 4 (*)  월  1-12
 필드 5 (*)  요일   0-7 (0 또는 7=일, 1=월, 2=화, ...)
 필드 6 (/disk/script/tomcatctl start)  명령어 실행할 명령어 

연속으로 수행하는 법 : 콤마로 구분

ex 1 00,01,08,13,17,20 * * * /disk/start.sh

00시, 01시, 08시 .. 1분에 start.sh를 수행하게 됨.


사용형식

crontab [ -u 사용자 id] 파일
crontab [-u 사용자 id] { -l | -r | -e}

# crontab -l : 예약된 작업리스트
# crontab -e : 예약된 작업 수정
# crontab -r : 예약된 작업 삭제

cron 실행 확인
# ps -ef | grep crond

cron 시작
# /etc/init.d/cron start{restart | stop}

일반사용자에게 crontab 명령어 사용하도록 설정 허가
/etc/cron.allow 여기에 ID 등록

일반사용자의 crontab 명령어사용을 제한
/etc/cron.deny  에 ID를 등록

등록 내용 설정
"분,시,일,월,요일, 실행명령" 순으로 설정

crontab 파일 형식
------    --------  ---------------------------------------------------
필  드    의  미    범  위
------    --------  ---------------------------------------------------
첫번째    분        0-59
두번째    시        0-23
세번째    일        0-31
네번째    월        1-12
다섯번째  요일      0-7 (0 또는 7=일요일, 1=월, 2=화,...)
여섯번째  명령어    실행할 명령을 한줄로 쓴다.
------    --------  ---------------------------------------------------

- 한 줄당 하나의 명령 (두줄로 나눠서 표시할 수 없음)
- # 으로 시작하는 줄은 실행하지 않는다 (주석)


/etc 에 아래 특정 폴더를 등록해 놓으면 그 폴더안의 실행 파일을 crontab의 설정 시간 마다 실행 
특정폴더: /etc/cron.hourly   /etc/cron.daily   /etc/cron.weekly   /etc/cron.monthly 


$ crontab -e
# /home 디렉토리를 /BACKUP/home 으로 백업해둠
# 30분, 새벽 4시와 낮 12시, 모든 일, 모든 월, 모든 요일 
30 4,12 * * *  /usr/bin/rsync -avxH --delete /home /BACKUP/home > /dev/null 2>&1

 # 파일/디렉토리 퍼미션 설정
 # 40분, 새벽 1시, 매주 일요일
40 1    * * 0  /root/bin/perm_set.sh   > /dev/null 2>&1

 # 20분마다 실행

 */20 * * * * /shell/mrtg

위는 매일 4:30분과 12:30분에 rsync 명령을, 매주 일요일 1:40분에 perm_set.sh를 실행함을 의미한다.


설정 예

시간 설정에서 몇가지 의미있는 것들을 알아보자.

- '*'표시는 해당 필드의 모든 시간을 의미한다.
- 3,5,7 와 같이 콤마(,)로 구분하여 여러 시간대를 지정할 수 있다.
- 2-10와 같이 하이픈(-)으로 시간 범위도 지정할 수 있다.
- 2-10/3와 같이 하이픈(-)으로 시간 범위를 슬래쉬(/)로 시간 간격을 지정할 수 있다.
  (2~10까지 3간격으로. 즉, 3,6,9를 의미함)

=>  > /dev/null  2>&1 이 무슨 뜻입니까?
  지정한 명령어 처리 결과와 발생할지 모르는 에러메시지를 출력하지 않고 모두 버린다는(/dev/null)는
  뜻입니다. 만약 결과와 에러를 파일로 저장하려면 /dev/null 대신 파일명을 적어주면 됩니다.

예)
20 2 * * 6 명령어 => 매주 토요일 새벽 2:20
0 4-6 * * * 명령어 => 매일 오후 4,5,6시
5 */2 * * * 명령어 => 매일 2시간간격으로 5분대에
15 1 1 * * 명령어 => 매월 1일 새벽 1:15
30 0 1 1,7 * 명령어 => 1,7월 1일 새벽 0:30

10 2 * * * /app11/minsang/APP/ldap/run.sh > /app11/minsang/APP/ldap/cron_error.log
55 13 * * * /run.sh > /mail_cron_error.log
0,30 8-19 * * * /sendAdmin.sh > /cron_admin_error.log

'I.lib() > I.lib(Unix)' 카테고리의 다른 글

Java String charset 바꾸기  (1) 2010.11.11
VI로 문자열 바꾸기.  (0) 2010.11.04
REDHAT VERSION (버젼) 정보  (0) 2010.07.30
^M 문자열이 생기는 이유 & 삭제 방법  (0) 2010.07.16
chmod 설정 (사용법)  (0) 2010.07.15
.
:
Posted by .07274.
2010. 9. 7. 11:15

오라클 페이징 처리 I.lib()/I.lib(Oracle)2010. 9. 7. 11:15

.. .. ..
<sql id="oraclePageHeader">
        <isNotEqual property="pagesize" compareValue="0">
        SELECT *
          FROM (SELECT ROWNUM AS rowindex,
                       original.*
                  FROM (
        </isNotEqual>   
    </sql>
   
    <sql id="oraclePageFooter">
        <isNotEqual property="pagesize" compareValue="0">
            ) original
        ) WHERE rowindex BETWEEN (#pageno# * DECODE (#pagesize#, 0, 10, #pagesize#) + 1)
                                           AND ( (#pageno# + 1) * DECODE (#pagesize#, 0, 10, #pagesize#))
        </isNotEqual>   
    </sql>
.
:
Posted by .07274.
2010. 9. 6. 18:56

AXIS2 정리 및 요약 I.lib()/I.lib(Axis2)2010. 9. 6. 18:56

.. .. ..

Axis2 소개

http://www.ibm.com/developerworks/kr/library/ws-soa-axis2-1/index.html

Axis2 Documentation

POJO Web Services using Axis2

Axis2 integration with the Spring Framework

 

 

Axis2 개발

 

Eclipse에서 Axis2 개발환경

Axis2 1.4.1 version을 기준. 1.5 버전은 Eclipse WTP에 문제 있음. - 09/11/17

Eclipse WTP를 이용한 Axis2 웹서비스 개발 가이드

Eclipse WS Tutorial

maven이용한 빌드: http://mail-archives.apache.org/mod_mbox/ws-axis-user/200811.mbox/%3C200811052035.56924.dojeda-list@integra.la%3E

 

Another eclipse ws tutorial

Bottom up WS: http://www.softwareagility.gr/index.php?q=node/21

 

Top down WS

 

 

Axis2 튜토리얼

 

WTP에서 Axis2를 이용한 웹 서비스 구현하기 Part 1: 개발 환경 구축과 웹 서비스 판매 프로세스 개발 준비

http://www.ibm.com/developerworks/kr/library/dwcod/20071120/

 

WTP에서 Axis2를 이용한 웹 서비스 구현하기 Part 2: 상품 검색 기능

http://www.ibm.com/developerworks/kr/library/dwcod/20080108/

 

http://blog.naver.com/ixoixo/120054662617

http://blog.naver.com/chambab72?Redirect=Log&logNo=100058777928

 

 

Working with Maven

Maven2 AAR Plug-in Guide



 [펌] :
http://gtko.springnote.com/pages/4655115

'I.lib() > I.lib(Axis2)' 카테고리의 다른 글

CXF 를 이용해 Web Service 이용하기 (axis2비슷)  (0) 2013.08.08
Axis + eclipse 이용 client 설정  (0) 2010.05.20
axis2 + eclipse Server 올리는 설정  (1) 2010.05.20
AXIS2 관련 ERROR  (2) 2010.05.19
Axis2 설치 / 설정  (2) 2010.04.27
.
:
Posted by .07274.