윈도우에서 확장자를 .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 %*
이상.
'이것저것' 카테고리의 다른 글
윈도우 서비스에 실행파일 등록하기 (1) | 2024.02.09 |
---|---|
톰캣 - 글자깨짐 (1) | 2024.02.07 |
[Axis2] Code Generator 도구를 위한 명령 줄 Ant Task 개발 지침서 (0) | 2024.02.05 |
기업이 가장 기대하는 3대 컴퓨터 비전 기술 (0) | 2023.04.15 |
해상도 및 DPI 문제 안내 (0) | 2023.03.25 |