[Java] Maven 프로젝트 생성 및 실행하는 방법.

2025. 3. 7. 09:32Language/java

728x90
728x90

Maven 설명.

  • Java 프로젝트의 빌드, 테스트, 배포, 패키징을 자동화하는 도구.
  • XML 기반의 POM (Project Object Model) 파일을 사용하여 프로젝트의 라이프사이클을 관리.

Maven 주요 기능.

기능 설명
의존성(Dependencies) 관리 pom.xml에서 필요한 라이브러리(JUnit, Spring 등) 자동 다운로드
빌드(Build) 자동화 $ mvn package 실행 시 프로젝트를 JAR/WAR로 패키징
테스트 자동 실행 $ mvn test 실행 시 JUnit 테스트 실행
CI/CD 통합         Jenkins 등과 연동 가능
표준 프로젝트 구조 제공         src/main/java, src/test/java 등 표준 구조 사용

Maven 기본 명령어.

명령어 설명
$ mvn compile Java 소스 코드 컴파일 (target/classes/에 .class 생성)
$ mvn test JUnit 테스트 실행 (target/test-classes/에 .class 생성)
$ mvn package JAR 또는 WAR 파일 생성 (target/ 폴더에 app-1.0-SNAPSHOT.jar 생성)
$ mvn install 로컬 저장소에 패키지 설치 (~/.m2/repository에 저장)
$ mvn clean 이전 빌드 결과 삭제 (target/ 폴더 삭제)

작업 환경.

>wmic os get Caption, Version, OSArchitecture
Caption                   OSArchitecture  Version
Microsoft Windows 10 Pro  64비트          10.0.19045


JDK 설치.

 

Download the Latest Java LTS Free

Subscribe to Java SE and get the most comprehensive Java support available, with 24/7 global access to the experts.

www.oracle.com

Maven 설치.

 

Download Apache Maven – Maven

Downloading Apache Maven 3.9.9 Apache Maven 3.9.9 is the latest release: it is the recommended version for all users. System Requirements Java Development Kit (JDK) Maven 3.9+ requires JDK 8 or above to execute. It still allows you to build against 1.3 and

maven.apache.org

JDK 와 Maven 환경 변수 설정 및 적용.

PATH 에 JAVA_HOME, MAVEN_HOME 추가 및 적용.

%JAVA_HOME%\bin
%MAVEN_HOME%\bin

JDK 와 Maven 설치 확인.

>java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)

>mvn -v
Apache Maven 3.9.6 (bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)
Maven home: C:\Program Files\Java\apache-maven-3.9.6
Java version: 1.8.0_271, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_271\jre
Default locale: ko_KR, platform encoding: MS949
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

VSCode(IDE)에서 제공하는 Extension Pack for Java(Java 개발 환경 확장팩) 주요 기능 설명.

  • Java 코드 자동 완성 (Language Support for Java™ by Red Hat)
  • Java 디버깅 (Debugger for Java)
  • Java 테스트 실행 (Test Runner for Java)
    • JUnit, TestNG 등의 Java 테스트 실행 및 결과 확인
  • Maven 프로젝트 지원 (Maven for Java)
    • Maven 프로젝트 지원 (pom.xml 관리, 빌드, 실행)

VSCode에서 Extension Pack for Java 설치.


CMD에서 >mvn archetype:generate ... 로 Maven 프로젝트 생성.

  • -DgroupId=com.example → 패키지
  • -DartifactId=app → 프로젝트 이름
  • -DarchetypeArtifactId=maven-archetype-quickstart → Maven 기본 프로젝트 템플릿
  • -DinteractiveMode=false → 입력 없이 자동 생성
>mvn archetype:generate -DgroupId=com.example -DartifactId=app -Darchetyfalse
[INFO] Scanning for projects...
[INFO] Building Maven Stub Project (No POM) 1
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] >>> archetype:3.3.1:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< archetype:3.3.1:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO]
[INFO] --- archetype:3.3.1:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
Downloading from central: https://repo.maven.apache.org/maven2/archetype-catalog.xml
Downloaded from central: https://repo.maven.apache.org/maven2/archetype-catalog.xml (16 MB at 15 MB/s)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0        
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: D:\codes\java\maven
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: app
[INFO] Parameter: packageName, Value: com.example
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: D:\codes\java\maven\app
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.976 s
[INFO] Finished at: 2025-03-06T19:07:02+09:00
[INFO] ------------------------------------------------------------------------

생성된 Maven 프로젝트 디렉토리 구조.

>tree /a /f
\---app
    |   pom.xml
    |
    +---src
    |   +---main
    |   |   \---java
    |   |       \---com
    |   |           \---example
    |   |                   App.java
    |   |
    |   \---test
    |       \---java
    |           \---com
    |               \---example
    |                       AppTest.java
    |
    \---target
        +---classes
        |   \---com
        |       \---example
        |               App.class
        |
        \---test-classes
            \---com
                \---example
                        AppTest.class

생성된 pom.xml 설명.

  • Maven 프로젝트를 생성하면 자동으로 pom.xml(Project Object Model)이 생성됨.
  • Maven이 프로젝트를 빌드하는 데 필요한 모든 정보를 포함.
>type 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>com.example</groupId>
  <artifactId>app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>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>

생성된 *.java 파일.

>type App.java
package com.example;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

>type AppTest.java
package com.example;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * Unit test for simple App.
 */
public class AppTest 
    extends TestCase
{
    /**
     * Create the test case
     *
     * @param testName name of the test case
     */
    public AppTest( String testName )
    {
        super( testName );
    }

    /**
     * @return the suite of tests being tested
     */
    public static Test suite()
    {
        return new TestSuite( AppTest.class );
    }

    /**
     * Rigourous Test :-)
     */
    public void testApp()
    {
        assertTrue( true );
    }
}

이전 빌드 결과 삭제 후 빌드 및 테스트 실행.

>mvn clean test
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------------< com.example:app >---------------------------
[INFO] Building app 1.0-SNAPSHOT
[INFO]   from pom.xml
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- clean:3.2.0:clean (default-clean) @ app ---
[INFO] Deleting D:\codes\java\maven\app\target
[INFO] 
[INFO] --- resources:3.3.1:resources (default-resources) @ app ---
[WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\codes\java\maven\app\src\main\resources
[INFO] 
[INFO] --- compiler:3.11.0:compile (default-compile) @ app ---
[INFO] Changes detected - recompiling the module! :source
[WARNING] File encoding has not been set, using platform encoding MS949, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 1.8] to target\classes
[INFO] 
[INFO] --- resources:3.3.1:testResources (default-testResources) @ app ---
[WARNING] Using platform encoding (MS949 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\codes\java\maven\app\src\test\resources
[INFO]
[INFO] --- compiler:3.11.0:testCompile (default-testCompile) @ app ---
[INFO] Changes detected - recompiling the module! :dependency
[WARNING] File encoding has not been set, using platform encoding MS949, i.e. build is platform dependent!
[INFO] Compiling 1 source file with javac [debug target 1.8] to target\test-classes
[INFO] 
[INFO] --- surefire:3.2.2:test (default-test) @ app ---
[INFO] Using auto detected provider org.apache.maven.surefire.junit.JUnit3Provider
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.AppTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 s -- in com.example.AppTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.139 s
[INFO] Finished at: 2025-03-06T19:20:37+09:00
[INFO] ------------------------------------------------------------------------

생성된 테스트 결과 파일 확인.

>type app/target/surefire-reports/com.example.AppTest.txt
-------------------------------------------------------------------------------
Test set: com.example.AppTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.022 s -- in com.example.AppTest

>type app/target/surefire-reports/TEST-com.example.AppTest.xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://maven.apache.org/surefire/maven-surefire-plugin/xsd/surefire-test-report-3.0.xsd" version="3.0" name="com.example.AppTest" time="0.022" tests="1" errors="0" skipped="0" failures="0">
  <properties>
    <property name="sun.desktop" value="windows"/>
    <property name="awt.toolkit" value="sun.awt.windows.WToolkit"/>
    <property name="file.encoding.pkg" value="sun.io"/>
    <property name="java.specification.version" value="1.8"/>
    <property name="sun.cpu.isalist" value="amd64"/>
    <property name="sun.jnu.encoding" value="MS949"/>
    <property name="java.class.path" value="D:\codes\java\maven\app\target\test-classes;D:\codes\java\maven\app\target\classes;C:\Users\tmax\.m2\repository\junit\junit\3.8.1\junit-3.8.1.jar;"/>
    <property name="java.vm.vendor" value="Oracle Corporation"/>
    <property name="sun.arch.data.model" value="64"/>
    <property name="user.variant" value=""/>
    <property name="java.vendor.url" value="http://java.oracle.com/"/>
    <property name="user.timezone" value="Asia/Seoul"/>
    <property name="java.vm.specification.version" value="1.8"/>
    <property name="os.name" value="Windows 10"/>
    <property name="user.country" value="KR"/>
    <property name="sun.java.launcher" value="SUN_STANDARD"/>
    <property name="sun.boot.library.path" value="C:\Program Files\Java\jdk1.8.0_271\jre\bin"/>
    <property name="sun.java.command" value="C:\Windows\Temp\surefire8899476915709626672\surefirebooter-20250306192037049_3.jar C:\Windows\Temp\surefire8899476915709626672 2025-03-06T19-20-36_796-jvmRun1 surefire-20250306192037049_1tmp surefire_0-20250306192037049_2tmp"/>
    <property name="surefire.test.class.path" value="D:\codes\java\maven\app\target\test-classes;D:\codes\java\maven\app\target\classes;C:\Users\tmax\.m2\repository\junit\junit\3.8.1\junit-3.8.1.jar;"/>
    <property name="sun.cpu.endian" value="little"/>
    <property name="user.home" value="C:\Users\tmax"/>
    <property name="user.language" value="ko"/>
    <property name="java.specification.vendor" value="Oracle Corporation"/>
    <property name="java.home" value="C:\Program Files\Java\jdk1.8.0_271\jre"/>
    <property name="basedir" value="D:\codes\java\maven\app"/>
    <property name="file.separator" value="\"/>
    <property name="line.separator" value="&#10;"/>
    <property name="java.vm.specification.vendor" value="Oracle Corporation"/>
    <property name="java.specification.name" value="Java Platform API Specification"/>
    <property name="java.awt.graphicsenv" value="sun.awt.Win32GraphicsEnvironment"/>
    <property name="surefire.real.class.path" value="C:\Windows\Temp\surefire8899476915709626672\surefirebooter-20250306192037049_3.jar"/>
    <property name="sun.boot.class.path" value="C:\Program Files\Java\jdk1.8.0_271\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\rt.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\sunrsasign.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_271\jre\classes"/>
    <property name="user.script" value=""/>
    <property name="sun.management.compiler" value="HotSpot 64-Bit Tiered Compilers"/>
    <property name="java.runtime.version" value="1.8.0_271-b09"/>
    <property name="user.name" value="tmax"/>
    <property name="path.separator" value=";"/>
    <property name="os.version" value="10.0"/>
    <property name="java.endorsed.dirs" value="C:\Program Files\Java\jdk1.8.0_271\jre\lib\endorsed"/>
    <property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/>
    <property name="file.encoding" value="MS949"/>
    <property name="java.vm.name" value="Java HotSpot(TM) 64-Bit Server VM"/>
    <property name="localRepository" value="C:\Users\tmax\.m2\repository"/>
    <property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/>
    <property name="java.io.tmpdir" value="C:\WINDOWS\TEMP\"/>
    <property name="java.version" value="1.8.0_271"/>
    <property name="user.dir" value="D:\codes\java\maven\app"/>
    <property name="os.arch" value="amd64"/>
    <property name="java.vm.specification.name" value="Java Virtual Machine Specification"/>
    <property name="java.awt.printerjob" value="sun.awt.windows.WPrinterJob"/>
    <property name="sun.os.patch.level" value=""/>
    <property name="java.library.path" value="C:\Program Files\Java\jdk1.8.0_271\jre\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python\Scripts\;C:\Program Files\Python\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;C:\Program Files (x86)\NetSarang\Xshell 7\;C:\MinGW\bin;C:\Program Files\Java\jdk1.8.0_271\\bin;C:\Program Files\Java\apache-maven-3.9.6\bin;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Git\cmd;C:\Program Files\Git\bin;C:\Program Files\TortoiseGit\bin;C:\Program Files\Java\jdk1.8.0_271\bin;;C:\Microsoft VS Code\bin;."/>
    <property name="java.vm.info" value="mixed mode"/>
    <property name="java.vendor" value="Oracle Corporation"/>
    <property name="java.vm.version" value="25.271-b09"/>
    <property name="java.ext.dirs" value="C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext;C:\WINDOWS\Sun\Java\lib\ext"/>
    <property name="sun.io.unicode.encoding" value="UnicodeLittle"/>
    <property name="java.class.version" value="52.0"/>
  </properties>
  <testcase name="testApp" classname="com.example.AppTest" time="0.0"/>
</testsuite>

테스트 실행 후 생성된 두 가지 파일(.txt, .xml) 설명.

1.텍스트 기반 테스트 결과(com.example.AppTest.txt)

  • JUnit 테스트 실행 로그를 텍스트 파일로 저장.
  • 콘솔에 출력되는 테스트 결과가 그대로 저장됨.
  • 사람이 확인할 수 있도록 로그 파일 형태로 보관.

2.XML 기반 테스트 결과(TEST-com.example.AppTest.xml)

  • JUnit 테스트 실행 결과를 XML 파일로 저장.
  • 시스템, CI/CD 도구(Jenkins, GitLab CI 등)가 읽고 분석할 수 있도록 설계됨.
728x90
728x90