ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 극한의 자바 컴파일
    프로그래밍/Java 2020. 5. 7. 14:52
    반응형

    안녕. 난 매우 자바를 싫어해

    왜냐하면 이클립스, maven 같은걸 이해도 못하고 싫어하면서 컴파일하기 위해 사용하는게 너무 찜찜하고 역겨워

    그래서 오늘은 극한의 컴파일을 해볼거야.

     


    환경

    윈도우10 64bit

    Java 1.8.0_231java version "1.8.0_231"
    Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
    Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

    processJoker(가제)

    • lib
    • src

    lib에는 

    • logback-classic-1.1.7.jar
    • logback-core-1.1.7.jar
    • postgresql-9.3-1100.jdbc4.jar
    • slf4j-api-1.7.25.jar

    가 있고

    src에는

    • main/java/com/free/power/monitor/Checker.java
    • main/java/com/free/power/monitor/DatabaseHandler.java
    • main/java/com/free/power/monitor/PowerChecker.java
    • main/java/com/free/power/monitor/FreeGoblin.java

    이 자바 파일들은 com.free.power.monitor 패키지에 속해있음


    1. cmd를 켜서 processJoker 폴더의 위치로 간다

    C:\dev\java_project\processjoker>

    2. javac에 파라미터로 자바파일 위치를 넣어준다.

    C:\dev\java_project\processjoker>javac src\main\java\com\free\power\monitor\Checker.java

    여기서 잠깐) 티스토리 버그 ->

    더보기

    (글자).(6자리 이하 글자) 이런형태가 되는 문자열을 복사하면 

    www.efjsoef.eveeee

    이 따위로 복사가 됨. 평생 불러와봐라 불러와지나

    3. 인코딩이 안맞는지 이런 에러가 나왔다.

    error: unmappable character for encoding MS949

    if (!gb1.isAlive() && !gb2.isAlive()) {  //?몢媛쒖쓽 ?뒪?젅?뱶媛? ?젙吏??븷硫? ?봽濡쒖꽭?뒪 醫낅즺?븣源뚯? 湲곕떎由곕떎

    어느 친절하고 똑똑하신분의 글을 보고 해결했다.

    4. 컴파일시 뒤에 -encoding utf-8 옵션을 주고 해결했다.

    javac src\main\java\com\free\power\monitor\Checker.java -encoding utf-8

    C:\dev\java_project\processchecker>javac src\main\java\com\free\power\monitor\Checker.java -encoding utf-8
    src\main\java\com\free\power\monitor\Checker.java:9: error: package org.slf4j does not exist
    import org.slf4j.Logger;
                    ^
    src\main\java\com\free\power\monitor\Checker.java:10: error: package org.slf4j does not exist
    import org.slf4j.LoggerFactory;
                    ^
    src\main\java\com\free\power\monitor\Checker.java:14: error: cannot find symbol
            private final static Logger logger = LoggerFactory.getLogger(Checker.class);
                                 ^
      symbol:   class Logger
      location: class Checker
    src\main\java\com\free\power\monitor\Checker.java:14: error: cannot find symbol
            private final static Logger logger = LoggerFactory.getLogger(Checker.class);

    그러자 이딴 에러가 나왔다.

    org.slf4j가 존재하지 않고 Logger가 뭐 없는지 어쨌는지 그래서 클래스 패스를 잡아주기로 함

    5. 실패. 그리고 포기

    6. 다시 도전. 쓰레기 정보들이 넘실거리는 인터넷의 바다에서 헤엄치다 결국 이클립스 설치

    7. 옛날 생각이 나면서 초조해짐. 신경쇠약과 정신착란이 약간 생김

    8. import > General > Existing Project into Workspace로 프로젝트 불러옴

    9. 실행해보니깐 되길래 Run As .. > Run Configuration 들어가서 Show Command Line을 봄

    C:\Program Files\Java\jre1.8.0_231\bin\javaw.exe -Dfile.encoding=UTF-8
    -classpath "C:\dev\java_project\processchecker\target\classes;
    C:\dev\java_project\processchecker\lib\postgresql-9.3-1100.jdbc4.jar;
    C:\dev\java_project\processchecker\lib\logback-classic-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\logback-core-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\slf4j-api-1.7.25.jar" com.free.power.monitor.Checker

    저렇게 무섭고 징그러운 것이 한줄로 구성되어 있었다. 정말 누구 생각인지 절대 경로로 모든 jar파일들의 경로로 들어가 있는 것을 보고 너무 역겨웠다. 다들 어떻게 자바로 코딩할 생각을 하는거지..? 이딴식으로 만들어 놓았으니 욕을 쳐먹어야한다. 

    저기 보면 javaw라고 되어 있는데, 

    javac가 보통 콘솔창에서 실행되는 것과는 다르게 window 프로그램처럼 실행된다. 보통의 경우 window프로그래밍을 작성하지 않았으니 실체가 없어서 실행되지만 안보이는 것 같다.

    여튼 저걸 좀 바꿔서 실행했다.

    javac -d target -cp
    "C:\dev\java_project\processchecker\target\classes;
    C:\dev\java_project\processchecker\lib\postgresql-9.3-1100.jdbc4.jar;
    C:\dev\java_project\processchecker\lib\logback-classic-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\logback-core-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\slf4j-api-1.7.25.jar" 
    c:\dev\java_project\processchecker\src\main\java\com\free\power\monitor\*.java 
    -encoding utf-8

    10.  이렇게 하니 target 폴더가 없다고 해서 만들어주니 기적같이 class 파일들이 생겼다. library 파일들 경로도 잡혀지고 여러 서로 참조하는 java 파일들 class도 만들어졌다. 정말 싫어하고 질색하던 이클립스였지만 가장 큰 도움을 받아서 과거는 잊기로 했다. 당장은 힘들겠지만 서로 좋은 사이로 남을 수 있도록 노력해야겠다.

    CAUTION) -d를 안쓰면 명령어를 쓴 위치에 com폴더부터 쭉 생김

    11. 여튼 target/com/free/power/monitor/~.class 이런식으로 class 파일 완성. 문제는 이 클래스 파일들을 어떻게 실행해야 하는가. 이다.

    12. 여러 시도 끝에 실패. 포기

    13. 어떤 분(블로그분)이 찾아주신 eclipse의 빌드. eclipse는 빌드를 자동으로(build automatically를 선택할시 자동) 하는데 위치가 target/classes이다. 그리고 이클립스는 실행할때 이렇게 사용한다.

    실행할때도 library 경로를 잡아줘야 한다!

    C:\Program Files\Java\jre1.8.0_231\bin\javaw.exe 
    -Dfile.encoding=UTF-8 
    -classpath "C:\dev\java_project\processchecker\target\classes;
    C:\dev\java_project\processchecker\lib\postgresql-9.3-1100.jdbc4.jar;
    C:\dev\java_project\processchecker\lib\logback-classic-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\logback-core-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\slf4j-api-1.7.25.jar" 
    com.free.power.monitor.Checker

    이걸 참고해서 이렇게 수정하고 실행하니

    java -classpath 
    "C:\dev\java_project\processchecker\target\classes;
    C:\dev\java_project\processchecker\lib\postgresql-9.3-1100.jdbc4.jar;
    C:\dev\java_project\processchecker\lib\logback-classic-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\logback-core-1.1.7.jar;
    C:\dev\java_project\processchecker\lib\slf4j-api-1.7.25.jar"
    com.free.power.monitor.Checker

    정상 동작했다. class들이 target/classes 밑에 있고 그 중 main 부분이 Checker class에 있었기 때문인 것 같다.

    하면서 궁금한점이 몇가지 생겼는데

    1. class path는 절대 경로여야만 하는가?

     - 일단 절대경로 + *.jar 은 실패했고

     - 상대 경로도 실패했음.

    테스트를 제대로 한게 맞다면 아주 편협하고 지독한 놈이 확실하다.

    이래서 서버에 java 코드를 안올리고 다 class 파일만 쳐올리나 보다. 요즘 화가 많아졌는데 이놈때문에 더더욱 못살겠다.

     

    아 결론은

    1. 패키지 같은 경우는 한방에 컴파일 해야한다. *.java

    2. 클래스패스 상대경로로 쓸생각은 하지마라. 

    3. 왠만하면 cmd로 안하는게 좋다. IDE를 사용하거나 maven, gradle이 낫다.

    4. 근데 maven, gradle 모르고 쓰다가는 엽총자살각이 나온다.

     


    2020.05.08 추가

      이토록 컴파일하려면 쳐야하는 명령어가 많고, 실행할때도 똑같이 library 포함시키는 명령어 쳐야되고 따옴표 안에 들어가서 tab으로 자동완성도 안되니깐 아주 열불이 나고 짜증이 난다. 그래서 윈도우에서 사용할때는 IDE를 쓰거나 여의치 않은 경우 BATCH 파일(*.bat)을 만들어 사용하는 것 같다. BATCH 파일은 아직 잘 모르고 리눅스에서 사용하는 쉘 스크립트 파일은 예전에 사용하던 게 있어서 그걸 가져와서 조금 변경해서 사용했다.

      내 입맛에 완전히 맞으려면 좀 수정이 필요하긴 하지만 기본적으로 확인하기도 좋고 일단 작동하는게 눈에 보이니깐 한번 예시로 올려본다.

    #!/bin/bash
    
    export NLS_LANG=AMERICAN_AMERICA.UTF8
    THE_CLASSPATH=
    PRG_ALIAS_NAME=com.free.power.monitor.Checker
    PRG_ALIAS=Checker
    SRC_FOLDER=/home/free/프로젝트가 있는 폴더 위치
    
    cd $SRC_FOLDER
    echo $PWD
    for i in `ls ./lib/*.jar`
        do  
            THE_CLASSPATH=${THE_CLASSPATH}:${i}
        done
    
    javac -d . -cp ".:${THE_CLASSPATH}" ${SRC_FOLDER}/src/main/java/com/free/power/monitor/*.java 
    -encoding utf-8

    SRC_FOLDER 부분에 '프로젝트가 있는 폴더 위치' 부분에 자기 프로젝트 위치 넣고 사용하면 왠만하면 될거다.

    좀 고칠 부분이 보이긴 하는데 일단 쉘스크립트가 알아서 lib 폴더에 있는 jar 파일들을 한번 훑고 THE_CLASSPATH 변수에 자동으로 붙여 넣어 주니깐 편하다. 생각해보니 저 export 부분은 없어도 되네 안쓰네. 

    누군가에게 도움이 됐으면 좋겠다.

     

    PS) 놓친 부분 있으면 추가 할 것

     

     

    반응형

    댓글

Designed by Tistory. Flag Counter