[삽질 가득 서버 설치기] [Apache + Tomcat] 1 - 우분투 JDK 수동 설치, JAVA 수동 설치

반응형

개요

아파치, 톰캣, 우분투, Apache & Tomcat on Ubuntu with AWS

시작하기 전에

  • 커맨드는 $ 표시로 구분하였다.
  • 중요한 내용이 아닌 경우 [참고] 라는 이름으로 별도의 타이틀링을 하였다. 삽질 과정의 주저리로서 무시해도 괜찮은 내용이다.삽질 과정을 모두 기록한 글이기 때문에, 중간 중간 과도하게 상세한 설명이 들어가있다.
  • JDK 설치를 위해서 반드시 진행해야 하는 부분은 [👨🏼‍💻 중요] 표시로 구분하였다. 이 표시만 따라가면 우분투 리눅스에 JDK 를 설치할 수 있다.

참고 블로그

다음 블로그를 참고하였다.

리눅스 우분투에 수동으로 자바 설치하기

 

 

 

sudo 권한이 필요한 명령어들이 있다. (블로그에서는 sudo 권한을 user에게 먼저 주고 시작하였다.)

사전 준비

AWS에서 우분투 인스턴스(EC2) 생성 후 XShell 앱으로 해당 인스턴스에 접속 후 시작한다.

(생활코딩 AWS 강의를 참고하길 바란다.)

우분투 EC2 에 JAVA 설치하기

본 포스팅은 AWS EC2 의 우분투에 JAVA(JDK)를 설치하는 과정이다.

 

반응형

 

JAVA(JDK) 다운로드 받기

[👨🏼‍💻 중요]

wget http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.tar.gz?AuthParam=1528575844_3a5c1a6706ff6a224a1957ffd0b5855a

링크는 오라클 jdk 사이트에 접속하여 직접 링크를 복사했다.(XShell 과 클립보드 공유가 된다.)

wget 을 사용하면 명령어를 실행시킨 디렉토리에 파일을 다운로드 받는다.

 

(2020년 필자의 말) URL 은 버전에 맞게 다시 찾으셔야 할 수도 있습니다. 여기서는 JDK8 을 기준으로 다운로드 받았습니다.

[참고] apt-get 사용하여 다운로드

wget 명령어 대신 apt-get 을 사용할 수도 있다. 다음 사항을 참고한다.
Linux - Ubuntu 서버를 설치하고 세팅해야 할것들[10] : Eclipse for JSP

[참고] apt 사용하여 다운로드

(참고로 필자는 기존에 apt 를 사용하였으나, 도대체 어디에 다운로드 받아지고 설치된것인지 알 수가 없어 원본 파일 다운로드부터 시작하기로 했다.)

 

다음 글로부터 apt 에 다른 버전의 리눅스 운영체제마다 사용해야 할 패키지 매니저를 확인할 수 있었다.
[리눅스] 모든 리눅스 초보자가 알아야 할 5가지 터미널 명령

  • yum
    레드햇, 페도라, 센트 OS
  • apt
    데비안, 우분투, 민트 OS
  • pacman
    아치, 만자로 OS

(linux 를 처음해본 입장에서 아무 블로그나 찾아보던 나는 우분트를 쓰면서 왜 yum 이 안되는지 찾고 있었다...)

[참고] 리눅스 File System Standard, FSSTND

다운로드된 파일은 도대체 어디서 관리하는지 궁금해하다가 아래와 같은 내용을 알게 되었다.
유닉스시스템에서 기본적으로 사용되는 폴더인 /usr /var /home 등의 역할에 대해서 알아보고 싶다면 읽어보자.

보통 "어디에서 다운로드 파일을 관리하나" 이 대답에 대한 답은 구글링 2페이지 내에서조차 답을 찾을 수 없었다.

$ wget -P [Local Directory] [URL]
$ wget [URL] -P [Local Directory] 

위 명령어를 사용하면 원하는 위치에 해당 파일을 다운로드 받을 수 있는 것 같다. -P 명령어 뒤의 위치가 원하는 디렉토리 위치인것 같다.

 

man 명령어로 wget 의 매뉴얼을 출력하면 다음과 같은 내용을 확인할 수 있다.

  -P,  --directory-prefix=PREFIX   save files to PREFIX/..

어랏? '우분투 디렉토리 목적'이라는 키워드 검색으로 다음과 같은 에메랄딕한 사이트를 찾았다.

리눅스 시스템 관리자 가이드 - Ch3. 디렉토리 트리의 개괄

살펴볼 가치가 있다. 세상에, 무려 The Linux System Administrarotors' Guide 이지 않은가!
일단... 내 질문은 가이드에서 소개할만큼 기초적인 내용이었다는 것이겠지.
무려 tree구조를 설명하기 위해 아기곰 푸우 의 일부를 인용하고 있다.

(하... 정말 따뜻하다...)

" Two days later, there was Pooh, sitting on his branch, dangling his legs, and there, beside him, were four pots of honey..." (A.A. Milne)
" 이틀 후에, 푸우가 나타났는데, 그는 나뭇가지 위에 앉아, 다리를 흔들고 있었다, 그리고 거기, 그 옆에는, 네통의 꿀단지가 있었다... " (A.A. Milne의 아기곰 푸우 중에서)

일명 FileSystemSTaNDard, 줄여서 FSSTND

(이렇게 줄이면 원래 뜻을 어떻게 알라고...)

유닉스-기본-디렉토리-트리-구조
유닉스 디렉토리 트리의 각 부분들. 점선은 각 파티션 영역의 경계를 나타낸다. 풍화가 일어난듯 희미하다.

98년도 번역본인 것은 아쉽긴 하다.

(난 열심히 창의력을 키우고 있었지 키득키득)

/usr 디렉토리

시스템이 정상적으로 가동되는 데에 필요한 모든 명령들과 라이브러리들 그리고 메뉴얼 페이지들이 위치한다. 네트워크 상에서 공유되고 있는 파일들이고, 읽기전용으로 관리되기를 권유하고 있다.

필자는 생각했다. 윈도우즈의 '사용자' 의 Document 도의 디렉토리라고. 그렇게 계속 생각할뻔 했는데... 그런 의미에서 이 문서를 꽤 잘 찾은 것 같다. 심지어 /usr/local/ 에는 games 라는 아카이브가 있었다. ㅠㅠ 오해할만도 하지...

블로그에도 설명되어 있지만,

 

[👨🏼‍💻 중요]
유닉스 시스템, 리눅스의 /usr/local 은 윈도우로 보자면 C:/Program Files 용도로 사용된다고 한다.

/var 디렉토리

(뭔 말인지 모르겠는 말들 이후...) 계속 변화하는 파일들을 위한 공간이다.

필자는 생각했다. 하하. 이제 왜 폴더 이름이 var 인지 알겠다. 버라이어티.

/home 디렉토리

각 사용자들의 홈 디렉토리다. 아주 중요하다. 사용자 데이터가 있으니까 쉽게 백업 될 수 있는 공간으로서 분리 되어 있다.

몰랐는데... ~ 표시가 /home/ubuntu 이라는 뜻이다. ubuntu 사용자의 디렉토리라는 의미가 된다. coldmater라는 user 를 생성한다면, /home/coldmater라는 디렉토리가 생길 것이다.

$ cd ~

처음 접속했을 때 ~ 디렉토리에 있다는 표시를 프롬프트가 알려준다.

[참고] 리눅스 tomcat PATH

apt-get 을 사용하여 tomcat8 을 설치하고 도대체 환경변수 설정시 PATH 를 어디로 해야하는지를 모르겠었었다. /var/lib/tomcat8 폴더인지, /usr/bin/tomcat8 인지... 둘 다 존재했고, 다른 디렉토리 및 파일 구성을 가지고 있었다.

참고 블로그를 좀더 읽어보니까... /usr/local 에 위치하는 것이었다.

[참고] 아카이빙, tar

.tar.gz.rpm의 차이가 무엇일까?

  • .tar.gz
    현재 유저의 프라이빗 버전 (tar 가 tarball 이라고 한다. Tape ARchaive 의 abbreviation)
  • .rpm
    모든 유저를 위한 전시스템 수준의 설치 (root access 필요)

JAVA(JDK) 압축 풀기

[👨🏼‍💻 중요]

$ tar xvfz jdk-8u-[이하 java 파일명]

근데 not in gzip format 이라는 오류가 뜰 뿐... 검색해보니 파일이 망가졌을 가능성이 크다고 한다. 어쩐지 파일이 빨리 받아지기는 했었다. (잘못된 URL 을 가져와서 생긴 문제였다.)

[참고] 리눅스 명령어 tar xvfz 의미

tar 압축하기

  • gunzip 을 이용해서 원래는 압축했었나보다 그게 tar 의 -z 옵션으로 들어간 것 같다.
  • c : create (새 아카이브 생성, 즉 아카이브라는 개념이 있다.)
  • v : verbose
  • f : 파일이름 지정
  • z : gzip 으로 압축된 아카이브를 만들겠다는 뜻(tar.gz 과 tgz 는 같은 의미)
    • $ tar cvf [Archaive Name].tar [Target Directory]
    • $ tar cvfz [Archaive Name].tar.gz [Target Directory]
  • j : z 대신 즉, gzip 말고 bzip2 사용할 수 있는 옵션(압축률은 좋은데 조금 더 느리다고 한다.)

tar 압축풀기

  • x : extract
    • $ tar xvf [Archaive Name].tar
    • $ tar xvfz [Archaive Name].tar.gz

tar 명령어의 사용에 관하여는 다음 블로그를 참고한다.
[linux] 리눅스 tar 명령어 사용 예제(원하는 파일 형식만 또는 특정 파일 제외하고 아카이브 만들기)

[참고] Oracle 공식문서에서 소개하는 JAVA(JDK) 설치

그래도 매뉴얼대로 해보자 싶어 오라클 instruction 을 들어갔다.

Installation of the JDK on Linux from Archive Binaries and RPM Packages

Oracle 의 공식문서에서는 참고블로그와는 조금 다르게 설명되어있었다.

$ tar zxvf jdk-8u-...

위와 똑같은 에러가 난다. xvfzzxvf 든 문제는 아닌것 같다. 파일을 다시 받아보기로 한다. 결국 위의 xvfz 의미를 곱씹어보면 zxvfxvfz 나 순서만 다를 뿐 같은 의미다.

(이래서 기초가 중요함...)

$ ls -lh

-l 옵션은 long listing format
-h 옵션은 human readable format

파일 크기를 나타내주는데 세상에.. 5.2K!!!!!!... ㅎㅎ 5.2K밖에 안되는 파일이 JDK일리 없다!!...

리눅스-화면-캡쳐
잘못 받은 JDK 파일, 파일 크기가 5.2K 이다.
ㅎㅎ... ㅋㅋ... 뭘받은거니... ㅎㅎ


심지어 링크를 클릭했더니... Sorry 란다...

다른 방법을 고려해보았다. 윈도우(등의) 다른 운영체제에서 따로 파일을 받아 ftp 로 넘겨주는 방식을 생각했다.
그래도 마음을 다시 다잡고, 블로그 글을 보니, 다운로드 받는 도중의 링크(결국 잘못된 링크)를 가져왔었던 것이었다.

제대로 된 JDK 파일의 링크는 아래와 같다. 훨씬 길며 우아(?)하다.

 

JDK 파일 링크
http://download.oracle.com/otn-pub/java/jdk/8u171-b11/512cd62ec5174c3487ac17c61aaa89e8/jdk-8u171-linux-x64.tar.gz?AuthParam=1528575844_3a5c1a6706ff6a224a1957ffd0b5855a

다시 위에서 사용했던 tar zvxf 명령어를 사용하였더니 제대로 풀렸다.

JDK 파일 지우기

[👨🏼‍💻 중요]

$ rm jdk-8u171...

정상적으로 압축이 풀렸다면 다운로드 받은 파일을 지워준다.

오라클 인스트럭션에서는 저장공간 확보를 위해 지우길 권장하고 있다.

JDK 링크(ln) 생성하기

java 파일에 접근을 용이하게 하기 위하여 링크를 생성하자.

 

먼저 jdk 가 있는 곳으로 이동한다.

[👨🏼‍💻 중요]

$ mv jdk1.8.0_171 /usr/local

다음 명령어를 입력하여 jdk 파일의 링크를 생성한다.

[👨🏼‍💻 중요]

$ ln -s jdk1.8.0_171 java

-s : symbolic link(바로가기의 의미만 갖는) --help 의 설명상 instead of hard links 라고 되어있다.

[참고] symbolic link vs hard link

그렇다면 하드 링크란? 원래 파일의 데이터에 대한 또 다른 접근 경로

리눅스 심볼릭링크 생성 실습

ls -l 에서 리스팅된 목록에서 권한 바로 오른쪽 열의 숫자가 하드링크의 개수라고 한다.

[참고] ls -l 각 컬럼 정보

ls -l명령어를 사용했을 때, 표현되는 각 정보는 순서대로 다음을 의미한다.

  1. file permissions
  2. number of links
  3. owner name
  4. owner group
  5. file size
  6. time of last modification
  7. file
  8. directory name

file permission 은 user/group/others 순서로 rwx (read, write, execute)를 의미한다.

다음 글에서 그 내용을 자세히 확인할 수 있다.
What do the fields in ls -al output mean? - stackExchange

[참고] java 파일 구조

여기서 잠깐, java 의 파일 구조를 보고 가는 것도 나쁘지 않을 것 같다.

개발자에게 JAVA 의 개발과 실행에 중요한 두 파일은 javajavac 이고, 이 파일의 위치는 다음과 같다.

  • /jdk1.8.0_171/bin/java
  • /jdk1.8.0_171/bin/javac
  • /jdk1.8.0_171/jre/bin/java
  • (이는 아래 환경변수에서 설명하겠지만, java 링크로 연결된 jdk1.8.0_171 가 환경변수 $JAVA\_HOME 의 대상임을 알 수 있다.)

즉, 컴파일러(javac)는 하나만 존재하는데, java 는 두 곳에 존재했다.
굳이 따져보았다.

  • jdk(압축 풀었을 때 생생되는 아카이브)의 bin 에 java 와 javac
  • jdk/jre/bin 의 java
  • 이는 윈도우에서 java jdk 를 설치했을 때와 다른 점이다.
    • 윈도우에서는 java 라는 폴더 내부에 jdk 폴더와 jre 폴더가 따로 생성된다.
    • 파일 구성은 리눅스와 비슷한 것 같다.

리눅스 JAVA 환경변수 설정

vim 에디터로 /etc/profile 파일을 연다.

 

[👨🏼‍💻 중요]

$ vi /etc/profile

파일의 맨 밑에(vim 에 접속한 직후 NORMAL 모드에서 SHIFT + G) 다음과 같은 내용을 입력한다.
(I(i)를 누르면 문자를 입력할 수 있다. 모두 입력한 뒤 esc키로 빠져나와 :wq를 입력하면 저장 후 빠져나올 수 있다.)

[👨🏼‍💻 중요]

export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
PATH=$PATH:$JAVA_HOME/bin

🚨 주의! 띄어쓰기에 주의한다. = 의 양 옆에는 공백이 없다! -> not a valid identifier(source 명령어 사용시)
띄어쓰기는 export 바로 오른쪽에만 존재한다.

[참고] 환경변수란 무엇일까?

다음 글을 참고하자
Linux 공부 4 - 쉘 변수와 환경 변수

필자는 생각했다. 아마도, jdkjre 가 설치된 경로(환경)은 사용자마다 다를 것이고, 이를 처리하기 위한 접점을 지정하기 위한 용도가 환경변수인 것 같다.

rm, mv, mkdir 등 어느 경로에서나 해당 명령어를 실행할 수 있는 이유는 해당 이름을 가진 파일들의 경로가 환경변수에 등록되어있기 때문이다.

[참고] /etc/profile 와 환경변수

/etc/profile 파일에서 작성한 export 는 환경변수를 지정, 변경, 보여주는 명령어다. 단, 로그아웃 전까지만 유효하다.

그렇기 때문에 profile 파일을 통해 매 로그인시마다 불러와지게 만드는 것 같다.

[참고] java 환경변수 분석

총 3가지의 환경변수를 지정했다. JAVA_HOME, CLATHPATH, PATH

JAVA_HOME 환경변수

export JAVA_HOME=/usr/local/java

 

말그대로 java 의 집이다. 이 변수는 CLASSPATHPATH에서 호출된다.

CLATHPATH 환경변수

export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar

 

JAVA 에서 classpath 란 클래스를 찾기 위한 경로이다. *.class 파일을 찾기 위한 대상을 지정한다.
: 는 환경변수의 구분자이다. 즉 CLASSPATH 라는 환경변수는 다음과 같은 classpath 세가지 디렉토리를 의미한다.
🚨 윈도우 환경에서는 환경변수의 구분자가 ;이다.

  • . (현재 디렉토리)
  • $JAVA\_HOME/jre/lib/ext
  • $JAVA\_HOME/lib/tools.jar

java 는 실행될 때, class 를 위 3 폴더를 기준으로 참조하게 될 것이다.

classpath 관한 자세한 내용은 다음 글을 참고하자.

자바 클래스패스(classpath)란?

PATH 환경변수

PATH=$PATH:$JAVA_HOME/bin

 

PATH 변수는 자신을 참조하여 자기자신($PATH)에 $JAVA_HOME/bin을 덧붙여서 정의한다. 해당 폴더에는 java, javac 와 같은 실행가능한 파일이 존재하고, PATH 에 해당 파일이 존재하는 디렉토리가 등록되어있기 때문에, 리눅스상의 어느 디렉토리에서든 해당 파일을 실행시킬 수 있게 되는 것이다.

 

PATH 는 export 가 없는데 그 이유는 linux 자체적으로 PATH 라는 환경변수를 갖고 있기 때문일 것이다. 다음 링크에서 export의 의미를 확인할 수 있다. 쉘 변수를 환경변수로 변경해준다고 한다. 즉, 쉘 자체에서 사용하는 변수에서 운영체제가 사용하는 변수로 승격해주는 명령어이다.


쉘변수는 bash 에서만 사용가능하다고 한다. 즉, 운영체제단에서는 존재여부를 알 수 없는 함수이다. 반면, 환경변수는 모든 쉘에서 접근 가능한 변수이다.

[리눅스] 환경변수 설정할 때 env, set, export, declare

[리눅스] bash 쉘변수 와 환경변수 (예 : java 설치시)

환경변수 확인하기

환경변수가 제대로 적용했는지 확인하도록 한다.

#리눅스 환경변수 확인하기
$ env

리눅스-환경변수-출력-화면
env 명령어로 환경변수를 확인했다. PATH 에 java의 경로가 추가되어있지 않다.


특히 여기서 PATH 를 주목하자. java 의 경로가 추가되지 않았다.

환경변수 적용하기

source 다음 명령어를 활용하면 /etc/profile의 내용을 리눅스 로그인이나 재시작 없이 바로 적용할 수 있다.
즉, java 환경변수를 바로 적용할 수 있는 명령어이다.

[👨🏼‍💻 중요]

$ source /etc/profile

source 명령어는 리눅스에 사용자가 로그인하거나 또는 재시작했을 때 적용되는 bash 명령어 등의 파일을 바로 적용하는 명령어이다. 자세한 내용을 알고싶다면 다음 글을 참고하자. source 명령어란

 

환경변수 작성시 띄어쓰기에 주의한다. not a vailid identifier 라는 오류를 띄울 수 있다.

리눅스-환경변수-출력-화면
PATH 환경변수에 /usr/local/java/bin 이 추가된 것을 확인할 수 있다.

놀랍게도 JAVA_HOME, CLASSPATH가 추가되었고, PATH에는 JAVA_HOME의 내용이 추가된 모습을 확인할 수 있다.

[참고] /etc/profile

/etc/profile 파일은 리눅스 OS 가 시작할 때 2번째로 시작되는 파일이다. 리눅스가 실행될 때 실행되는 대상은 다음의 다섯가지 파일의 순서대로 실행된다.

리눅스 실행시 profile 및 bash 파일 실행 순서에 관한 자세한 내용은 다음 링크를 확인하도록 하자.

profile bashrc bash profile 실행 순서
(위 링크는 실행 순서가 조금 다른것 같다. 원문은 아래 링크인듯 하다.)
Execution sequence for .bash_profile, .bashrc, .bash_login, .profile and .bash_logout

 

즉, 루트에 접근 할 수 있을 때와 없을 때의 설치법이 구분된다. profile 파일을 직접 건드릴 수 있다면 profile 에 환경변수 관련 설정 명령어를 넣을 수 있을 것이다. profile 에 접근하지 못하는 경우, 자바 환경변수들만을 위한 .sh 파일들을 추가할 수 있는거다.

 

그래서 위 링크대로 profile 파일을 실행시키면 profile.d 폴더 내의 모든 sh 파일을 실행시키므로 다음 내용을 가지고 있는 sh 파일을 profile.d 폴더 내부에 만들어보도록 하자.

먼저 sh 파일을 만든다.

$ vim cold.sh (sudo 로 실행시켜줘야 했다. 이 때문에, root 권한이 없는 경우 profile 수정하는듯 하다. 응?? 근데 왜 )

cold.sh 파일의 내용으로 다음을 입력한다.

export COLDMATER=/nothing/is/here

그리고 리부트(라고 썼지만, 그럴 필요가 있나? 위에서 설명했던 것처럼, source 명령어를 사용하면 적용될 것 같다.)

그리고 환경변수를 확인해보자.

$ env

내가 추가한 .sh 파일이 실행되어 환경변수에 cold.sh 에서 정의한 COLDMATER 변수가 추가됨을 확인할 수 있다.

다시 환경변수 확인하기

[👨🏼‍💻 중요]

$ echo $JAVA_HOME
$ echo $PATH

리눅스-echo-명령어-수행-동작
echo 명령어로 환경변수를 호출($[환경변수이름])하여 확인했다.

(뻘짓) export 명령어를 통해 의미없는 경로를 추가해보았다. 없는 경로인데도 추가된다. 즉 환경변수가 꼭 경로를 저장하기 위한 용도는 아니라는 것이다. (위 스샷의 LS_COLOR 같은 경우 어떤 색깔의 정보를 갖고 있는것처럼)

 

vi 를 사용하여 계속 편집했었는데, vim 이라는 에디터를 범용적으로 사용한단다. 마우스를 사용하지 않는 궁극의 에디터라는데. 익숙해져보자.

(2020년 돌아와 편집하는 필자는 vim 에 익숙해졌다. 뿌듯 ㅎㅎ)

 

echo 명령어도 탭 자동완성 기능을 지원한다. $ 와 환경변수의 첫 몇개의 문자까지 타이핑한 뒤 Tab을 누르면 환경변수를 확인할 수 있다.

자바 설치 확인하기

[👨🏼‍💻 중요]

$ java -version    
$ javac -version

현재 디렉토리에 java 라는 파일이 없음에도 불구하고 명령어가 실행된다. 환경변수인 PATH에 등록된 경로를 모두 탐색하여 java 실행파일을 찾아 실행시킨 것이다.

리눅스-java-및-javac-명령어-동작-확인
java 와 javac 의 버전을 확인할 수 있다.

반응형

Designed by JB FACTORY