그런데 주변환경에서 어쩔수 없이 자바를 해야하는 경우가 생긴다..
에휴 신발.. 그리하야 자바 빌드과정을 정리를 한다..
(메이븐이니 그리들이니 이딴건 집어치우고 본질에 집중)
(그리고 여담이지만 한국 지역정보 같은 자료 참조처리할때 GPKI 모듈 사용 하고
어쩌고 하려면 반드시 Java로 신청해라.. C언어로 된것도 테스트할라면
어쩌고 하려면 반드시 Java로 신청해라.. C언어로 된것도 테스트할라면
Java로 해야한다.. 망할넘들 -_-)
[자바 빌드 정리]
javac 사용 예시
javac -encoding UTF-8 -d . -cp "classes;lib/*" src\Main.java
(src폴더 아래에 있는 Main.java파일을 컴파일하는데 참조클래스 경로는 현경로 아래에있는 classes폴더와 lib를 참조하고 Main.java파일을 컴파일 할때는 UTF8로 인코딩으로
하여 빌드하고 최종 출력되는 Main.class 파일은 현재폴더에 출력하라
-cp 옵션일때 근본적으로 모든 파일을 하나하나 묶어야 하지만 * 표현법으로 "lib\*" 라고
표현이 가능함)
javac -d classes -encoding UTF8 src\ownutil\biz\*.java
(src - ownutil - biz 안에 있는 모든 자바파일을 한번에 컴파일하여 루트밑에 있는 classes
폴더에 복사하라 단 인코딩옵션은 utf8이다.)
javac -encoding UTF-8 -d classes -sourcepath src src/Main.java
(src - Main.java를 컴파일하는데 src밑에 있는 하위 패키지들까지 모드 포함하여 classes폴더에 컴파일 하라 src에 Main.java가 있고 그밑에 참조 java파일들이 존재하는 경우)
[cmd 배치파일 명령으로 컴파일]
FOR /R . %f IN (*.java) DO javac -d ..\classes -encoding UTF8 %f
(현재폴더 아래를 재귀적으로 하위폴더까지 돌면서 모든 java파일을 javac로 컴파일하여
한수준 위에 있는 classes폴더에 *.class 파일을 만들어라. 인코딩 옵션은 utf8이다.
jar파일로 묶는 예시
jar -cfv mylib.jar -C classes .
(classes폴더에 있는 모든 class파일을 재귀적으로 돌면서 jar아카이브로 묶꼬 c옵션으로 jar를 새로 생성하고 f옵션으로 생성할 jar파일의 이름을 mylib.jar로 지정하고 v옵션으로 jar파일의 생성과정을 표출하라 단 클래스 아카이브폴더인 classes폴더를 기준으로 하위폴더에 있는 package를 기준으로한다!! -C옵션 중요!!)
jar -cfev myapp.jar Main classes
(classes폴더에 있는 모든 class파일을 재귀적으로 돌면서 jar아카이브로 묶고 c옵션으로 jar를 새로 생성하고 f옵션으로 생성할 jar파일의 이름을 myapp.jar로 지정하고 e옵션으로 실행될 엔트리 포인트는 Main클래스이며 v옵션으로 jar파일의 생성과정을 표출하라. - 이명령은 진입점을 포함함)
java 실행 옵션
java -cp ".;lib\*" Main
(Main.class 파일을 실행하라 참조라이브러리는 현재 폴더 혹은 lib폴더에 있다.
-cp 인 클래스 패스가 중요함!! 거기에 Main.class파일도 있어야함)
-cp 인 클래스 패스가 중요함!! 거기에 Main.class파일도 있어야함)
java -cp "classes;lib\*" Main
(Main.class 파일을 실행하라 참조라이브러리는 classes폴더와 lib폴더에 있다. 이 두개의 폴더중에서 Main.class 파일이 있으니까 찾아서 실행해라.. 만약 Main.class파일이 2개이상있다면 cp옵션에서 지정한 순서중 먼저나오는 아이의 Main.class 파일이 우선적이다.)
java -jar MyApp.jar
jar파일로 묶인 아카이브 파일을 java명령을 통해서 실행함.
jar파일로 묶인 아카이브 파일을 java명령을 통해서 실행함.
*** 윈도우의 배치 파일 명령 ***
자~!! 다 좋다.. 그런데 언제 저거를 일일이 다 치고 있겠는가??
ide를 빌려서 하지.. 하지만 이런식으로 가버리면 javac 명령이건 뭐건
ide를 빌려서 하지.. 하지만 이런식으로 가버리면 javac 명령이건 뭐건
암것도 모르는 툴키드 멍청이가 되것지??
그래서 내부구조를 들여다 볼수있는 배치파일로 만든다~!!
그래서 내부구조를 들여다 볼수있는 배치파일로 만든다~!!
그러면 그럼 이제 폴더 구조부터 잡겠다.
일단 내프로젝트 폴더를 하나만든다 이폴더를 이제 루트(root)폴더 라고 칭하겠다.
그리고 그 밑에 classes폴더, lib폴더, src폴더를 만든다.
classes폴더 -> javac하여 class파일이 들어갈 폴더
lib폴더 -> 프로그램에서 참조하는 라이브러리(*.jar)들이 들어갈 폴더
src폴더 -> Main.java 파일이 있는(public static void main) 폴더임
src폴더 밑에는 mycom - biz 등등 자기가 만든 패키지가 들어가 있음.
src폴더 밑에는 mycom - biz 등등 자기가 만든 패키지가 들어가 있음.
그래서 이런 구조에서 만들고 활용하는 배치파일을 3가지를 준비했다.
buildapp.bat -> 해당구조에서 classes 폴더에 java파일을 빌드해서 class파일로 변경
runapp.bat -> 해당구조에서 Main.class파일을 실행
makejar.bat -> 해당구조에서 Myapp.jar 파일을 생성 (이름바꾸기는 알아서..)
이렇게 3개 이다.
[buildapp.bat]
@echo off
javac -d classes -encoding UTF-8 -cp "lib\*" -sourcepath src src/Main.java[runapp.bat]
@echo off
java -cp "classes;lib\*" Main[makejar.bat]
@echo off
setlocal enabledelayedexpansion
rem 설정값
set JAR_NAME=MyApp.jar
set CLASS_PATH=classes
set LIB_PATH=lib
rem 컴파일
javac -d classes -encoding UTF-8 -cp "lib\*" -sourcepath src src/Main.java
rem 매니페스트 파일 생성 / Class-Path는 Jar 파일 내부에서 라이브러리 경로를 찾기 위한 설정
echo Main-Class: Main > manifest.txt
set classpath_string=
for %%f in ("%LIB_PATH%\*.jar") do (
set "classpath_string=!classpath_string! %LIB_PATH%/%%~nxf"
)
if not "!classpath_string!"=="" (
echo Class-Path: !classpath_string! >> manifest.txt
) else (
echo No library files found in %LIB_PATH%
)
echo Class-Path is !classpath_string!
rem 컴파일된 클래스와 매니페스트 파일을 포함하여 Jar 파일 생성
jar -cvfm "%JAR_NAME%" manifest.txt -C classes .
rem 임시 매니페스트 파일 삭제
del manifest.txt
echo %JAR_NAME% File Create Done.이런식으로 만들었으니 활용하면된다.
java프로그램을 급하게 만들어야 하는 상황이고
난 java를 그닥 좋아하지 않으니까.. 메이븐이나 그리들을 활용하거나
IDE를 활용할 생각은 없다.
ㅋㅋㅋ
댓글 없음:
댓글 쓰기