한참을 삽질했습니다. 구글링을 해보니 mac의 jdk와 호환이 되지 않아서 발생하는 문제라고 합니다.

http://stackoverflow.com/questions/17822795/google-app-engine-javax-servlet-unavailableexception-initialization-failed#comment27168122_17822795


역시나 윈도우 가상머신에 GAE 개발환경 갖추고 실행하니 같은 소스가 잘 동작합니다.



다음은 앱엔진 로그에 나타나는 메시지입니다.

  1. 2013-10-15 16:22:29.386 / 500 5066ms 0kb Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1
    210.98.50.4 - - [15/Oct/2013:16:22:29 -0700] "GET / HTTP/1.1" 500 0 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1" "1.okgawi.appspot.com" ms=5067 cpu_ms=2567 loading_request=1 app_engine_release=1.8.6 instance=00c61b117cc605edbcad33f6d430edbd601896
  2. W2013-10-15 16:22:29.299
    EXCEPTION 
    java.lang.IllegalArgumentException
    	at com.google.appengine.runtime.Request.process-3c18ce8f0ef50d07(Request.java)
    	at java.lang.ClassLoader.loadClass(ClassLoader.java:360)
    	at org.mortbay.util.Loader.loadClass(Loader.java:91)
    	at org.mortbay.util.Loader.loadClass(Loader.java:71)
    	at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
    	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    	at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    	at java.lang.Thread.run(Thread.java:724)
    
  3. E2013-10-15 16:22:29.376
    javax.servlet.ServletContext log: unavailable
    javax.servlet.UnavailableException
    	at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:79)
    	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    	at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:219)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194)
    	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
    	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    	at java.lang.Thread.run(Thread.java:724)
    
  4. W2013-10-15 16:22:29.380
    Failed startup of context com.google.apphosting.utils.jetty.RuntimeAppEngineWebAppContext@1d9525e{/,/base/data/home/apps/s~okgawi/1.370945407503011368}
    java.lang.NullPointerException
    	at java.lang.Class.isAssignableFrom(Native Method)
    	at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:256)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    	at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    	at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    	at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    	at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    	at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.createHandler(AppVersionHandlerMap.java:219)
    	at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.getHandler(AppVersionHandlerMap.java:194)
    	at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:134)
    	at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:446)
    	at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:435)
    	at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:442)
    	at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:186)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:306)
    	at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:298)
    	at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:439)
    	at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
    	at java.lang.Thread.run(Thread.java:724)



쉬운 게 없군요.


맥에 jdk를 설치하면, jdk7부터는 /Library/Java/JavaVirtualMachines/ 아래 설치됩니다. 시스템 환경변수에서 중요한 것이 JAVA_HOME인데, 이 경로를 참고해서 설정을 해야할 것입니다.


이를 편하게 변경하는 기능을 만든 것이 있습니다.

http://www.guigarage.com/downloads/jvc.jar

다운로드를 받으면 적당한 위치로 옮기고, 터미널에서 다음과 같이 명령을 내리면 됩니다.

java -jar jvc.jar



원하는 버전을 선택하고 아래 set Version 버튼을 클릭하면 됩니다. 시스템 비번을 입력하면 설정이 완료됩니다.

터미널을 새로 띄우고, 아래 명령으로 확인합니다.


java -version


참고: http://www.guigarage.com/2013/02/change-java-version-on-mac-os



eGovFrameSvr 서버 2.0.0에는 jdk1.5가 포함되어 있고, hudson의 세팅은 여기에 맞춰져 있습니다. 그래서 jdk1.6이상으로 맞춰진 프로젝트는 컴파일 되지 않는 이슈가 있습니다.


[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 10 source files to C:\eGovFrameSvr\hudson\jobs\ok.egov\workspace\target\classes
[HUDSON] Archiving C:\eGovFrameSvr\hudson\jobs\ok.egov\workspace\pom.xml to C:\eGovFrameSvr\hudson\jobs\ok.egov\modules\ok$egov\builds\2013-07-01_15-22-31\archive\ok\egov\1.0.0\pom.xml
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure
Failure executing javac, but could not parse the error:
javac: invalid target release: 1.6
Usage: javac <options> <source files>
where possible options include:
  -g                         Generate all debugging info
  -g:none                    Generate no debugging info
  -g:{lines,vars,source}     Generate only some debugging info
  -nowarn                    Generate no warnings
  -verbose                   Output messages about what the compiler is doing
  -deprecation               Output source locations where deprecated APIs are used
  -classpath <path>          Specify where to find user class files
  -cp <path>                 Specify where to find user class files
  -sourcepath <path>         Specify where to find input source files
  -bootclasspath <path>      Override location of bootstrap class files
  -extdirs <dirs>            Override location of installed extensions
  -endorseddirs <dirs>       Override location of endorsed standards path
  -d <directory>             Specify where to place generated class files
  -encoding <encoding>       Specify character encoding used by source files
  -source <release>          Provide source compatibility with specified release
  -target <release>          Generate class files for specific VM version
  -version                   Version information
  -help                      Print a synopsis of standard options
  -X                         Print a synopsis of nonstandard options
  -J<flag>                   Pass <flag> directly to the runtime system



[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 31 seconds
[INFO] Finished at: Mon Jul 01 15:24:06 KST 2013
[INFO] Final Memory: 17M/31M
[INFO] ------------------------------------------------------------------------
Waiting for Hudson to finish collecting data
channel stopped
Finished: FAILURE


이를 해결하려면 허드슨 관리에서 JDK의 버전을 1.6 이상으로 맞춰 줘야 합니다. 메인 페이지에서 Hudson 관리 > Configure System > JDK 섹션으로 이동합니다.




수정 후에는 이상없이 빌드될 것입니다.



JAVA_HOME 환경변수는 자바 개발의 시작입니다. 윈도우7에서 환경변수를 설정하는 방법을 알아봅니다.


탐색기에서 컴퓨터를 선택하고 컨텍스트 메뉴의 속성을 엽니다. 좌측에서 고급 시스템 설정을 클릭합니다.



고급 탭에서 하단의 환경 변수(N)... 버튼을 클릭합니다.



하단의 시스템 변수(S) 항목에서 JAVA_HOME을 선택하고 편집 버튼을 클릭합니다. 만약 처음이라면 새로 만들기(W)... 버튼을 클릭합니다.


변수 이름에 JAVA_HOME 을 입력하고, 변수 값에 설치된 경로를 붙여넣습니다. 

그리고 확인 버튼으로 열린 창들을 닫습니다.


cmd 창을 닫았다가 다시 엽니다. echo %JAVA_HOME% 라고 입력하면 설정된 환경변수 값을 확인할 수 있습니다.


한 가지 환경변수가 더 설정이 되어야 합니다. 바로 %Path% 입니다.

%JAVA_HOME%\bin; 

위 경로를 시스템 환경 변수 Path에 추가합니다. 

참고: http://okjsp.tistory.com/1165643255


jdk1.7이 현재 배포되는 버전입니다. 이전 버전인 jdk1.6을 다운로드 받으려면 http://java.sun.com 에서 Java SE로 이동합니다. 


Previous Releases 를 선택합니다.



Java SE 6를 선택합니다. 이전의 자바도 다운로드 받을 수 있게 링크가 제공됩니다. 하지만, 오라클의 정책에 따라서 이전 버전들은 로그인 해야 다운로드 받을 수 있습니다.




Java SE Development Kit 6u45 링크를 선택합니다. 1.6의 45번째 업데이트 버전입니다.



동의 항목을 체크하고 하단에서 OS에 맞는 jdk를 다운로드 하면 됩니다.



로그인을 해야 다운로드 받을 수 있습니다.



다운로드를 다 받으면 폴더를 열어서 파일을 실행합니다.



설치를 마치면 C:\Program Files\Java\jdk1.6.0_45 폴더에 설치됩니다. 이 경로는 JAVA_HOME 환경변수 값이 됩니다.



환경변수 JAVA_HOME을 아래 링크를 참고해서 적용하세요.

http://okjsp.tistory.com/tag/java_home


http://java.sun.com/ 에서 jdk7을 http://netbeans.org/ 에서 netbeans7을 구할 수 있습니다.


JDK 경로는 Program Files 에서 java로 변경합니다. 폴더명에 공백이 들어가지 않게 하기 위해서입니다.  


JRE는 그냥 기본 위치에 설치합니다.


이제 NetBeans를 설치합니다. http://netbeans.org/ 로 접속하면 됩니다.


NetBeans도 java 디렉토리로 설치합니다.


http://www.oracle.com/java 접속
http://java.sun.com/ 접속해도 됩니다만 격세지감만 느껴집니다. 세상 참 빠르게 변합니다.



jdk6 update3 를 설치하다 발견한 내용입니다.
다운로드 받은 패키지는 68메가인데, 설치 공간은 거의 600메가를 육박하는군요.
한번에 5가지가 설치됩니다. 옵션으로 조정이 가능하고 다음 화면에서 설치 경로와 5가지의 설치여부를 결정할 수 있습니다.

사용자 삽입 이미지

  1. 개발 도구 300메가입니다. 내부적으로 JRE포함하고 있습니다. Private JRE라고 합니다.
  2. 데모와 샘플 46메가입니다.
  3. 자바 API클래스에 대한 소스코드로 49메가입니다.
  4. 독립 JRE, Public JRE라고 173메가입니다. 브라우저 플러그인을 비롯해 배포용으로 사용되는 Java Web Start 포함합니다.
  5. Java DB 25메가입니다. 클라우드스케이프에서 아파치 더비로 변모했는데, 이것이 같이 설치됩니다.
압축이 꽤 많이 되었군요. 텍스트 형태의 소스가 많아서 그런듯 합니다.
참고하세요. ^^

java 프로젝트 생성시 jdk의 버전을 달리 할 수 있습니다.
시스템 환경변수 JAVA_HOME 을 jdk1.6으로 잡아 놓았습니다. 이 때 이클립스는 보통 1.6 기반으로 시작이 됩니다.
사용자 삽입 이미지

jdk1.4로 프로젝트 만들기


하단의 메시지는 명확하게 얘기해 줍니다. 기본 컴파일러는 1.5인데, 새로운 프로젝트는 1.4 버전의 컴파일러가 사용된다고 말이죠.

+ Recent posts