[윈도우]배치 파일 및 스크립트

2024. 2. 6. 20:31이것저것

728x90

윈도우에서 확장자를 .bat 으로 만들면 배치 파일을 만들 수 있습니다.

이 특수한 확장자는 윈도우 사용자로 하여금 간단하게 명령을 실행 할 수 있는 형태의 제공 해 주기 위한 하나의 방식이 아닐까 하는 데요.

이 배치 파일을 사용하다 보면, 약간 복잡한 형태의 기능을 넣어서 실행 하기를 원할 때가 있습니다.

 

예를 들어, 자바 프로그램의 실행의 경우

자바는 java.exe 를 사용해서 실행 되며 클래스를 해석하여 실행 되는 형태이죠.

자바 클래스 안에서 어떤 의존성 있는 라이브러리를 사용하게 되었을 경우,

나의 자바 프로그램이 실행 할 때, 이 의존성 라이브러리가 어디에 있는 지 알려 줄 필요가 있습니다.

 

만약 내가 만든 자바 프로그램과 그 의존성 라이브러리가 완벽하게 구성 되지 않았을 경우에는 이런 에러 메시지를 당연히 받을 것입니다.

 

NoClassDefFoundError 라는 오류 인 것이죠...

◆ 일반적으로 Exception 은 무시하고 어떤 식으로든 실행 할 수가 있지만, 이런 Error 가 발행 하는 경우에는 프로그램이 더 이상 진행하지 않습니다.

 

아파치 프로젝트 중 axis2 라는 프로젝트 내에 lib 폴더를 보면 약 115개의 jar 파일이 존재하며, 이 라브러리를 사용해서 어떤 프로그램을 작성 하였다면 이 라이브러리가 모두 잡혀 있어야만 합니다.

 

어디에 잡혀 있어야 한다구요? 바로...CLASSPATH 라는 환경 변수에 모두 참조 되어 있어야만 한다는 것이죠.

SET CLASSPATH=a.jar;b.jar;c.jar;d.jar.................................많이....

일일이 이 jar 파일들의 경로를 잡을 수는 있지만, 불편하기도하도 여러가지 상황을 맞이 할 수도 있을 것입니다.

 

배치 스크립트

위와 같이 CLASSPATH 에 수백 혹은 수천개의 라이브러리를 잡아 주기 위해서 약간의 프로그래밍을 할 수 있도록 만들어 주었습니다.

아래는 wsdl2java.bat 파일이라는 axis2 내의 배치 파일 전문입니다.

(주석은 삭제 했습니다...)

@echo off
... 라이선스 ...

rem ---------------------------------------------------------------------------
rem Startup script for the WSDLJava
rem
rem Environment Variable Prequisites
rem
rem   AXIS2_HOME      Must point at your AXIS2 directory 
rem
rem   JAVA_HOME       Must point at your Java Development Kit installation.
rem
rem   JAVA_OPTS       (Optional) Java runtime options 
rem ---------------------------------------------------------------------------
set CURRENT_DIR=%cd%

rem Make sure prerequisite environment variables are set
if not "%JAVA_HOME%" == "" goto gotJavaHome
echo The JAVA_HOME environment variable is not defined
echo This environment variable is needed to run this program
goto end
:gotJavaHome
if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
goto okJavaHome
:noJavaHome
echo The JAVA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
echo NB: JAVA_HOME should point to a JDK/JRE
goto end
:okJavaHome

rem check the AXIS2_HOME environment variable
if not "%AXIS2_HOME%" == "" goto gotHome
set AXIS2_HOME=%CURRENT_DIR%
if exist "%AXIS2_HOME%\bin\axis2.bat" goto okHome

rem guess the home. Jump one directory up to check if that is the home
cd ..
set AXIS2_HOME=%cd%
cd %CURRENT_DIR%

:gotHome
if EXIST "%AXIS2_HOME%\lib\axis2*.jar" goto okHome
echo The AXIS2_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end

:okHome
rem set the classes
setlocal EnableDelayedExpansion
rem loop through the libs and add them to the class path
set AXIS2_CLASS_PATH=%AXIS2_HOME%
FOR %%c in ("%AXIS2_HOME%\lib\*.jar") DO set AXIS2_CLASS_PATH=!AXIS2_CLASS_PATH!;%%c

rem ----- Execute The Requested Command ---------------------------------------
echo Using AXIS2_HOME:   %AXIS2_HOME%
echo Using JAVA_HOME:    %JAVA_HOME%
set _RUNJAVA="%JAVA_HOME%\bin\java"

%_RUNJAVA% %JAVA_OPTS% -cp "!AXIS2_CLASS_PATH!" org.apache.axis2.wsdl.WSDL2Java %*
endlocal
:end
 
 

디렉토리의 유무 확인

환경 변수의 유무 확인의 경우 다음과 같이 IF 문을 사용합니다.

if not "%JAVA_HOME%" == "" goto gotJavaHome
 

혹은 디렉토리의 유무 확인의 경우,

if not exist "%JAVA_HOME%\bin\java.exe" goto noJavaHome
goto okJavaHome
 

그 다음으로 순차적으로 진행하거나, goto 문을 이용해서 해당하는 위치로 점프 할 수 있도록 되어 있습니다. else 문이 없어서 위에서 처럼 else 문 대신에 if에 맞지 않을 경우 goto 로 else 역할을 대신 하는 군요...

 

순환문

마지막으로 CLASSPATH 를 잡기 위해서 다음과 같은 순환문을 구성하게 됩니다.

set AXIS2_CLASS_PATH=%AXIS2_HOME%
FOR %%c in ("%AXIS2_HOME%\lib\*.jar") DO set AXIS2_CLASS_PATH=!AXIS2_CLASS_PATH!;%%c
 

실행문

자바의 경우 실행문의 형태는 모든 조건을 만족 할 경우 마지막에 다음과 같이 명시 되는 것을 확인 할 수 있습니다.

%_RUNJAVA% %JAVA_OPTS% -cp "!AXIS2_CLASS_PATH!" org.apache.axis2.wsdl.WSDL2Java %*
 

 

이상.

 

728x90