이것저것 공부기록
[부스트코스] 자바 직접 컴파일하고 실행하기 본문
*부스트코스 <쉽게 배우는 자바1> 강의를 통해 학습한 내용+개인적으로 공부한 내용을 바탕으로 작성한 글입니다.
지금까지 이클립스라는 좋은 도구를 통해 손쉽게 자바로 프로그램을 만들 수 있었다.
이클립스에서 자바 소스코드를 작성하고 실행 버튼을 누르면, 알아서 클래스 파일로 컴파일되고 이를 실행해주었던 것이다.
이번 글에서는 이클립스 없이 자바 파일을 직접 컴파일하고 실행해보자.
직접 컴파일하고 실행할 수 있다는 것은 이클립스가 없는 어떤 환경에서도 자바로 프로그래밍할 수 있다는 뜻이다.
자바 설치 경로 확인하기
직접 컴파일하려면 먼저 자바의 설치 경로를 알아야 한다.
나는 윈도우로 실습을 진행했으므로 윈도우를 기준으로 살펴보겠다.
C:\Program Files\Java\...\bin
위 경로를 따라가보면 쉽게 java.exe와 javac.exe를 찾을 수 있다. (어디에서 다운받았느냐에 따라 경로는 다를 수 있다.)
컴파일하기 위해서는 javac가 필요한데, 나는 위 경로에는 java만 있어서 파일 탐색기로 찾아보았더니 javac는
C:\Users\user\corretto\jdk11.0.9_11\bin에 있었다.
여기에 java도 있고 javac도 있는데, 그렇다면 내가 cmd창에 java를 입력했을 때 같은 이름의 프로그램이 두 개가 있는데, 어떤 건지 알고 컴퓨터가 실행하는 걸까?
그 이유는 환경변수에 경로가 이미 입력되어있기 때문이다.
환경변수란?
환경변수란 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임이다. (말이 어렵다..)
쉽게 말하면, 환경변수는 OS(운영체제)가 프로세스를 실행하기 위해 참조하는 변수인데, 그중 path라는 변수에 주목하자.
path 변수는 OS가 어떤 프로세스를 실행시킬 때 그 경로를 찾는데 이용되는 변수로, 외부 명령어를 검색할 위치를 저장하는 변수이다.
명령 프롬프트에서 javac를 입력하면 사용법과 옵션이 뜨는데, 앞서 찾았던 경로가 아님에도 불구하고 프로그램이 실행되는 것을 알 수 있다. 이때 cmd에 javac를 입력했을 때 컴퓨터에서 javac를 찾아 실행하는 과정은 다음과 같다.
1. 운영체제는 javac라는 내부 명령어가 있는지 검사한다.
2. javac라는 내부 명령어는 존재하지 않으므로 환경변수 중 Path 변수에 설정된 경로를 차례대로 모두 검사한다.
3. javac.exe를 발견하면 실행한다.
Path 변수에 javac이 있는 경로가 입력되어있지 않았다면, 'javac'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 라는 문구가 뜰 것이며, 그럴 경우 매번 javac가 있는 경로로 이동한 후 실행시켜야 할 것이다.
환경변수를 확인하려면 윈도우 탐색기에서 내 PC 우클릭 - 속성 - 고급 시스템 설정 - 고급 탭의 환경 변수 를 클릭한다.
위처럼 환경 변수 목록을 확인할 수 있고, Path를 더블클릭하면 경로를 추가하거나 수정, 삭제할 수 있다.
컴파일(Compile)
이제 직접 컴파일을 진행해보자.
먼저 명령 프롬프트(cmd)에서 cd(Change Directory) 명령어를 통해 프로젝트 디렉토리로 이동한다.
dir 명령어로 현재 디렉토리에 어떤 파일들이 있는지 볼 수 있다.
public class Compile {
public static void main(String args[]) {
System.out.println(1);
}
}
내가 만든 Compile 프로젝트가 위치한 경로는 C:\Java\Compile이고, Compile.java 파일 코드는 위와 같으며 클래스 파일은 지워둔 상태이다.
프로젝트 디렉토리로 이동한 후, 자바 파일을 컴파일한다.
프롬프트에 javac을 입력하면 사용법이 나오는데, javac <options> <source files>을 차례로 입력하면 된다.
javac Compile.java
컴파일하고 나면 Compile.class가 생성된 것을 확인할 수 있다.
클래스 파일 실행
클래스 파일을 생성했으므로 실행해보도록 하자.
java 명령어로 컴파일된 파일(클래스 파일)을 가상 머신(JVM)에서 실행하는 작업이다.
이때 .class 확장자를 쓰면 안된다.
java Compile
** Error: A JNI error has occured, please check your installation and try again
강의에서는 저렇게 했을 때 되던데... 난 위와 같은 오류가 발생했다.
Error: A JNI error has occurrd, please check your installation and try again
구글링해봤더니 컴파일 설정된 SDK 버전과 실행하고 있는 자바의 버전이 다를 경우 발생하는 에러라고 하는데, 대충 읽어보니 컴파일한 클래스 파일 버전이 자바 런타임의 버전보다 높아서 생긴 문제 같다.
55=Java 11, 52=Java 8과 같다고 해서 자바 11을 다시 설치하고, 자바가 설치된 경로를 환경변수에 추가해주니 성공적으로 실행되었다.
외부 라이브러리를 이용하는 프로그램 컴파일하기
위의 Compile이라는 프로그램은 외부 라이브러리를 사용하지 않고, 간단하게 출력 한 줄만 하는 프로그램이었다.
그러나 외부 라이브러리의 객체들을 사용하는 프로그램을 컴파일할 때는 프로그램에 사용된 라이브러리가 어디있는지 컴퓨터에게 알려주어야 한다.
이전에 만들었던 Ok_javaGoInHome으로 컴파일 실습을 진행했다.
import org.opentutorials.iot.Elevator;
import org.opentutorials.iot.Lighting;
import org.opentutorials.iot.Security;
public class Ok_javaGoInHome {
public static void main(String[] args) {
String address = "JAVA APT 203";
// 집에 가는 길
// Elevator call
Elevator myElevator = new Elevator(address);
myElevator.callForUp(1);
// Security off
Security mySecurity = new Security(address);
mySecurity.off();
// Light on
Lighting hallLamp = new Lighting(address + " / Hall Lamp");
hallLamp.on();
Lighting floorLamp = new Lighting(address + " / floor Lamp");
floorLamp.on();
}
}
import한 부분을 보면, org.opentutorials.iot의 클래스들을 불러들이는데, 이때 org 폴더가 Ok_javaGoInHome 클래스가 존재하는 폴더 안에 함께 있다는 사실을 주목해야 한다.
외부 라이브러리를 포함해서 컴파일하려면 javac 명령어의 옵션 중
--class-path 옵션을 이용해야 한다.
경로를 나타낼 때 온점(.)은 현재 디렉토리를 뜻한다.
javac -cp "." Ok_javaGoInHome.java
이번에는 org 폴더의 위치를 조금 바꿔볼 것이다.
프로젝트 폴더 안에 lib라는 폴더를 만들고, org 폴더를 그 안으로 이동시킨다.
이제는 org.opentutorials.iot 패키지가 lib 라이브러리의 일부가 된 것이다.
앞서 했던 명령어를 똑같이 치면 컴파일이 잘 될까?
성공적으로 컴파일하지 못했다. 저 아래로도 쭉 오류가 발생하는데, 오류 메시지를 보면 패키지가 존재하지 않는다고 한다. 이런 오류 메시지가 뜨는 이유는 org.opentutorials.iot 패키지의 위치를 제대로 알려주지 않았기 때문이다.
컴파일할 때 class path를 현재 디렉토리로만 설정했는데, org 폴더는 lib 폴더 안에 들어있으므로 현재 디렉토리에서는 찾을 수 없는 것이다. 이때는 아래와 같이 경로를 추가해준다. 경로 구분은 세미콜론(;)으로 해주면 된다.
javac -cp ".;lib" Ok_javaGoInHome.java
현재 폴더(.)와 lib 폴더에서 필요한 파일들을 찾아 컴파일하라는 의미이다.
외부 라이브러리를 이용하는 프로그램 실행하기
외부 라이브러리의 클래스들을 사용하는 프로그램을 실행하려면 컴파일했을 때와 마찬가지로 cp 옵션을 활용하면 된다.
java -cp ".;lib" Ok_javaGoInHome
Argument를 전달하여 프로그램 실행하기
이전 글에서 입력 값을 전달하여 실행하는 프로그램을 만들었었다.
컴파일하는 과정은 위와 같다. 필요한 외부 라이브러리의 경로만 주의하면 될 것 같다.
javac -cp ".;lib" Ok_javaGoInHome2.java
이클립스에서 실행할 때는 Argument 탭에서 입력을 해서 실행했었고, 지금처럼 터미널에서 argument를 전달하기 위해서는 아래와 같이 실행할 클래스 파일 이름 다음에 입력값을 입력해주면 된다.
java -cp ".;lib" Ok_javaGoInHome2 "Dory APT 202" 20.0
<reference>
[JAVA] 환경변수 설정하는 이유 및 환경변수란 무엇인가 - dololak.tistory.com/20
1-1 환경변수란? 환경변수와 path - blog.naver.com/PostView.nhn?blogId=zxwnstn&logNo=221521038431&proxyReferer=https:%2F%2Fwww.google.com%2F
직접 컴파일하고 실행하는 것은 어려울 것이라고 막연히 생각했었는데, 프로그램이 실행되는 과정을 따라 컴파일러 등 어차피 다양한 도구를 활용하기 때문에 그다지 어렵지 않았다. (리눅스 명령어 환경에 익숙해서 그런 것 같다.) 환경변수에 관한 에러는 직접 마주친 적이 없었어서 그동안은 '그냥 뭔가 복잡한 거구나'라고만 생각하고 넘어갔는데, 이번에 환경변수의 개념을 알고 갈 수 있어서 좋았다.
다 함께 배우고 성장하는 부스트코스
부스트코스(boostcourse)는 모두 함께 배우고 성장하는 비영리 SW 온라인 플랫폼입니다.
www.boostcourse.org
'부스트코스 서포터즈 3기' 카테고리의 다른 글
[부스트코스] 자바로 회계 처리 프로그램 만들기_1 (변수, 입력값) (0) | 2021.01.26 |
---|---|
[부스트코스] 자바 API와 클래스, 인스턴스, 패키지, 상속 (0) | 2021.01.25 |
[부스트코스] 자바 입력과 출력 (0) | 2021.01.18 |
[부스트코스] 프로그램의 의미, IoT 모의 프로그램 만들기, 디버거 (0) | 2021.01.14 |
[부스트코스] 데이터 타입과 변수 (0) | 2021.01.12 |