캠핑과 개발

단순 참조일 경우

maven repository 가 없는 로컬 jar 파알을 maven 프로젝트에 추가 하기 위해서는 사설 repository를 만드는 방법도 있지만

다음과 같이 "dependency" 정의 시 scope 노드와 systemPath 노드를 사용하여 프로젝트에 포함된 jar 파일을 지정하여 줄 수 있다.

<dependency>
    <groupId>smack</groupId>
    <artifactId>smack-custom</artifactId>
    <version>1.0.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/smack-custom.jar</systemPath>
</dependency>

로컬을 Repository를 활용하는 방법

위와 같이 처리하는 경우는 문제점이 있다. scrop 의 system 이기 때문에 maven 빌드 시 해당 jar 파일이 포함되지 않는다.

이런 경우는 pom.xml 에 다음과 같이 정의하여 로컬을 repositoy로 활용하는 방법도 있다.

<dependency>
    <groupId>smack</groupId>
    <artifactId>smack-custom</artifactId>
    <version>1.0.0</version>
</dependency>
<repository>
	<id>in-project</id>
	<name>custom jars</name>
	<url>file://${project.basedir}/lib</url>
</repository>


이 때 ${project.basedir}/lib 는 maven 디렉토리 구조를 따르도록 구성해주어야 한다.

위의 예제에서는 디렉토리 및 파일명은 다음과 같이 구성해야 한다.

${project.basedir}/lib/smack/smack-custom/1.0.0/smack-custom-1.0.0.jar

만일 jenkins에서 maven 빌드를 하는 경우라면 다음과 같이 repository를 하나 더 추가해준다.

<repository>
	<id>in-project-jenkins</id>
	<name>custom jars-jenkins</name>
	<url>file://${JENKINS_HOME}/jobs/${JOB_NAME}/workspace/lib</url>
</repository>


출처 : http://itnp.kr/blog/post/Maven_Repository_%EA%B0%80_%EC%97%86%EB%8A%94_%EB%A1%9C%EC%BB%AC_jar_%ED%8C%8C%EC%9D%BC_%EC%9D%84_maven_project_%EC%97%90_%EC%B6%94%EA%B0%80%ED%95%98%EB%8A%94

'DEVELOPMENT' 카테고리의 다른 글

IDE 단축키  (0) 2018.11.28
hsqldb 사용하기  (0) 2016.07.23
windows에 있는 AppData 폴더란?  (0) 2015.07.30
Git  (0) 2013.12.30
dxf file format  (0) 2012.08.16


Maven으로 프로젝트를 진행하면서 며칠동안 삽질을 한 결과 그나마 조금 이해가 가기 시작하며 영어의 절심함 또한 뼈저리게 느낀다..
하지만 이만한 고생으로 Maven의 편리함이 조금씩 이해가 가기 시작한다.
xml 설정만으로도 이렇게 좋을 수가 있다니 세상 참 넒다..

메이븐을 통해서 빌드를 하는 과정에서 톰캣과 연동하고 프로젝트에 맞게 빌드하는 과정에서 알게된 빌드 라이프 사이클에 대해서 간단히 정리를 한다..

기본적으로 이클립스로 Run As를 누르면 기본적으로 제공되는 Maven 빌드 라이프 사이클을 볼수가 있다.



상단에 m2라고 적힌 부분이 메이븐 플러그인을 설치하면 볼 수 있는 메뉴들이다.

다 써보진 않았지만 간단한 설명을 하자면 다음과 같다.

assembly:assembly : 배포물(jar) 에 해당 라이브러리도 같이 넣을때 사용
build : 빌드를 실행한다.
build... : 새로운 사용자 빌드를 만든다.
generate-sources : 컴파일 과정에 포함될 소스를 생성한다. 예를 들어,  DB 테이블과 매핑되는 자바 코드를 생성해주는 작업이 이 단계에서 실행된다.
clean : target에 지정된 모든 소스를 삭제한다.
install : 로컬 리포지토리에 패키지를 복사한다.
package : 컴파일 된 코드와 자원 파일들을 jar, war와 같은 배포 형식으로 패키징한다.
               (jar - jar:jar, war - war:war, pom - site:attach-descriptor, ejb - ejb:ejb)
source:jar : 소스를 jar 파일로 패키징 한다.
test : 테스트를 실행한다.
compile : 소스 코드를 컴파일해서 클래스 출력 디렉터리에 클래스를 생성한다 (compiler:compile)
deploy : 생성된 패키지 파일을 원격 리포지토리에 등록하여, 다른 프로젝트에서 사용할 수 있도록 한다. (deploy:deploy)

build...를 이용한 사용자 빌드 추가

사용자가 새로운 임의 빌드를 만들수도 있다 build... 메뉴를 사용하면 되는데 새로운 플러그인인이 추가 될때마다 새로운 goal을 제공하기 때문에 적절하게 만들어서 사용을 하면 된다.


사용법은 위에 창이 뜨면 Name, Goals를 등록해주고 Apply를 적용하여 실행하면 된다.

Name : 사용자가 생성한 build 이름
Goals : 추가할 빌드 명령

예는 아래와 같다.


이름을 빌드1이라고 주고 명령은 다음과 같이 줬다.

compile war:inplace tomcat:stop tomcat:start

이는 예제를 설명하기 위해서 다음과 같은 명령을 준것으로 4가지의 명령을 실행하고 있다.
이렇게 명령을 주기 위해서는 공백을 주고 다른 명령을 주면 된다.
일반적으로 명령어 창에서 주려면 아래와 같이 mvn을 주고 명령을 주지만 이클립스에선 그냥 명령만 주면 된다. 
mvn compile war:war
mvn package


메모..

compile war:war : 컴파일 후 war 파일을 생성한다. target 폴더에  projectName-0.0.1-SNAPSHOT 폴더와 projectName-0.0.1-SNAPSHOT.war가 생긴다. projectName-0.0.1-SNAPSHOT 폴더 안에는 바로 배포할수 있도록 리소스가 들어 있다. 

 compile war:exploded : 컴파일 후 projectName-0.0.1-SNAPSHOT 폴더가 생성이 되었다. 이 폴더안에 모든 배포할수 있게 리소스가 들어 있다.

compile war:inplace : compile war:exploded 와 동일한 기능을 하지만 추가로 src/main/webapp/WEB-INF/clssses, src/main/webapp/WEB-INF/lib 폴더에 컴파일된 class, jar 파일이 포함이 되었다. 








'DEVELOPMENT' 카테고리의 다른 글

Git  (0) 2013.12.30
dxf file format  (0) 2012.08.16
XSLT 빠른 가이드  (0) 2012.01.13
Oracle, MSSQL, MySql 요약 설명서  (0) 2010.05.18
ServerVariables 콜렉션  (0) 2009.03.10

매번 찾기는 귀찮고 소스 뒤지기도 귀찮은 것들을 정리함.

#자바소스 설정

1
2
3
<build>
    <sourceDirectory>src/main/java</sourceDirectory>
</build>
cs


#자바소스 여러 개  설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
        <execution>
            <id>add-source-dir</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>another/src/main/java</source>
                    <source>others/src</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>
cs




#저장소 추가

1
2
3
4
5
6
7
<repositories>
    <repository>
        <id>저장소 ID</id>
        <url>저장소 URL</url>
    </repository>
</repositories> 
cs


개인적으로만 저장소를 쓴다면 .m2\settings.xml에서
profiles > profile > repositories 밑에 repository 설정을 넣으면 됨.

#컴파일러 소스 및 타겟 버전 설정, UTF-8 인코딩 지정 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.0.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build> 
cs

#클래스패스 설정과 -jar 옵션으로 시작할 때 사용할 메인 클래스 지정
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <Main-Class>org.krakenapps.main.Kraken</Main-Class>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
cs

#의존하는 라이브러리를 포함하여 하나의 JAR 파일로 패키징
POM에 아래 설정해놓고 콘솔에서 mvn assembly:assembly 명령
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
<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <Main-Class>org.krakenapps.main.Kraken</Main-Class>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
<!--//-->
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-war-plugin</artifactId>
       <configuration>
        <warSourceDirectory>src/main/webapp</warSourceDirectory>    
          <!--<warSourceExcludes>common/**</warSourceExcludes> warSourceExcludes는 warSourceDirectory를 기준 특정 폴더 제외-->
       </configuration>
</plugin> 
cs
    

#기본 디렉토리 변경
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!-- 변경전 --> 
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="questionbox">
        <wb-resource deploy-path="/" source-path="/src/main/webapp" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/test/java" />
        <property name="context-root" value="questionbox" />
        <property name="java-output-path" />
    </wb-module>
</project-modules>
<!-- 변경후 -->
<?xml version="1.0" encoding="UTF-8"?>
<project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="questionbox">
        <wb-resource deploy-path="/" source-path="webapp" />
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src" />
        <property name="context-root" value="questionbox" />
        <property name="java-output-path" />
    </wb-module>
</project-modules>
cs

# 메이븐 /src/main/java에 java 외에 파일도 target/classes로 이동

#레포팅 관련
<reporting>
<plugins>
<!-- FindBugs 리포트 생성 플러그인 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<forceEncoding>UTF-8</forceEncoding>
<findbugsXmlOutput>true</findbugsXmlOutput>
<findbugsXmlWithMessages>true</findbugsXmlWithMessages>
<xmlOutput>true</xmlOutput>
<xmlOutputDirectory>${basedir}/target/site</xmlOutputDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>javancss-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<forceEncoding>UTF-8</forceEncoding>
<lineThreshold>30</lineThreshold>
<xmlOutputDirectory>${basedir}/target/site</xmlOutputDirectory>
<failOnViolation>true</failOnViolation>
<ccnLimit>10</ccnLimit>
<ncssLimit>100</ncssLimit>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jdepend-maven-plugin</artifactId>
<version>2.0-beta-2</version>
</plugin>
<!-- PMD 리포트 생성 플러그인 -->
<plugin>
<artifactId>maven-pmd-plugin</artifactId>
<configuration>
<rulesets>
<ruleset>/rulesets/basic.xml</ruleset>
<ruleset>/rulesets/unusedcode.xml</ruleset>
</rulesets>
<sourceEncoding>UTF-8</sourceEncoding>
<targetJdk>1.5</targetJdk>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</reporting>

#maven-jar-plugin 으로 배포시 특정파일 제외하기
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<excludes>
<exclude>*.properties</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>


#source도 depoly하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <version>2.1.2</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
cs


# 의존관계이 있는 jar파일을 특정 폴더로 복사

메이븐에서는 war이 아닌 jar 패키징일 경우 의존하는 라이브러리는 함께 패키징 되지 않는다.

이럴 경우 maven-dependency-plugin을 사용하여 의존 관계에 있는 jar 파일을 복사해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/lib</outputDirectory>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>
 
 
cs


#MANIFEST.MF 파일을 만들때 사용

MANIFEST.MF 파일을 만들고 싶을 때 사용하는 플러그으로 jar 실행 파일을 만들고 싶다면 간단하게 maven-jar-plugin으로

만들수가 있다. 현재 경로에서의 lib 폴더의 jar파일들을 classpath로 추가 시키며, test.Main 클래스는 test 패키지의 Main 클래스 이다.

실행은 java -jar jar명.jar 을 할 수 있다 

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>test.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>
cs


#특정 경로를 리소스를 지정된 경로로 복사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<plugin>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${project.basedir}/target/classes/resources</outputDirectory>
                <resources>
                    <resource>
                        <directory>${project.basedir}/resources</directory>
                        <filtering>false</filtering>
                        <includes>
                            <include>map/**</include>
                            <include>properties/**</include>
                        </includes>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>
cs