아래와 같이 에러가 나는 경우

Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]

원인 : 순환참조 문제.

조치 :

tomcat container path에 해당하는 conf/catalina.properties

org.apache.catalina.startup.ContextConfig.jarsToSkip=bcprov*.jar

bcprov*.jar 추가.

로그전체.

java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:56 오후 org.apache.catalina.core.AprLifecycleListener init
심각: An incompatible version 1.1.31 of the APR based Apache Tomcat Native library is installed, while Tomcat requires version 1.1.32
12월 20, 2017 2:31:57 오후 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["http-bio-8080"]
12월 20, 2017 2:31:57 오후 org.apache.coyote.AbstractProtocol init
정보: Initializing ProtocolHandler ["ajp-bio-8019"]
12월 20, 2017 2:31:57 오후 org.apache.catalina.startup.Catalina load
정보: Initialization processed in 404 ms
12월 20, 2017 2:31:57 오후 org.apache.catalina.core.StandardService startInternal
정보: Starting service Catalina
12월 20, 2017 2:31:57 오후 org.apache.catalina.core.StandardEngine startInternal
정보: Starting Servlet Engine:
12월 20, 2017 2:31:58 오후 org.apache.catalina.core.ContainerBase startInternal
심각: A child container failed during start
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at java.util.concurrent.FutureTask.report(FutureTask.java:122)
      at java.util.concurrent.FutureTask.get(FutureTask.java:192)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
      at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:816)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
      ... 6 more
Caused by: java.lang.IllegalStateException: Unable to complete the scan for annotations for web application [] due to a StackOverflowError. Possible root causes include a too low setting for -Xss and illegal cyclic inheritance dependencies. The class hierarchy being processed was [org.bouncycastle.asn1.ASN1EncodableVector->org.bouncycastle.asn1.DEREncodableVector->org.bouncycastle.asn1.ASN1EncodableVector]
      at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:2126)
      at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2072)
      at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1947)
      at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1913)
      at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1898)
      at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1330)
      at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:889)
      at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)

Posted by 다인,보리아빠
,

요즘의 웹어플리케이션 개발의 상당수가 Java를 이용한 Spring Frameworks으로 개발을 많이 한다.

Eclipse를 이용하거나 Eclipse 기반의 STS(Spring Tool Suite)을 이용하여 개발을 하게 된다.


대부분의 개발자들은 아래와 같은 식으로 개발을 하게 된다.

Eclipse에서 제공하는 Tomcat 을 이용하여 개발과 디버깅을 한다.

이 경우 개발환경이 대부분이 개인PC(대부분 Windows OS)에서 개발을 하게 된다.

개발과 디버깅시 실제 서비스가 실행되는 Linux 와는 환경적으로 다른점이 많다.


JPDA(The Java Platform Debugger Architecture)는 이러한 환경적인 문제를 해결할 수 있는 한 방법이다.

JPDA를 이용하면 Linux 에 설치 되어 있는 Tomcat내 소스에 대해서 기존에 Eclipse에서 디버깅 하던것을 할 수 있다.

즉 서버(예: LINUX)의 TOMCAT에 접속하여 디버깅을 할 수 있는 것이다.

더 쉽게 이야기해주면 특정 위치에 있는 Tomcat에 대해서 원격으로 디버깅이 가능하다는 것이다.


환경을 보면 

상용서버는 Linux, Tomcat

개발/스테이징 서버도 Linux, Tomcat

개발자가 개발과 디버깅시 : windows, Tomcat

JPDA 를 이용할시 디버깅시  : Linux(개발서버 또는 스테이징), Tomcat #사실 OS 구분없이 어느 Tomcat이든 가능하다.


JPDA를 이용하여 원격으로 Linux 에 있는 Tomcat 에 접속하기 위해서는 사전 작업이 필요하다.


아래 절차를 보면서 세팅을 해보도록 하자.

1. Linux 내 Tomcat JPDA Port 확인 및 Tomcat Start

#tomcat 의 bin 디렉토리로 이동 후 아래 명령 실행하여 JPDA PORT 를 확인한다.
[root@localhost bin]> grep JPDA_ADDRESS= ./catalina.sh
    JPDA_ADDRESS="8000"

#8000번 포트로 확인이 되었다.
#이제 Tomcat을 JPDA 모드로 실행을 시킨다.
[root@localhost bin]> ./catalina.sh jpda start
Using CATALINA_BASE:   /svc/webapp/was/tomcat6026
Using CATALINA_HOME:   /svc/webapp/was/tomcat6026
Using CATALINA_TMPDIR: /svc/webapp/was/tomcat6026/temp
Using JRE_HOME:        /usr/local/jdk1.6.0_20
Using CLASSPATH:       /svc/webapp/was/tomcat6026/bin/bootstrap.jar

# 포트가 정상적으로 열렸는지 확인해 본다.
[root@localhost bin]> netstat -nap | grep :8000
tcp        0      0 0.0.0.0:8000                0.0.0.0:*                   LISTEN      2348/java
# 이상 서버 세팅 끝!

    

2. Eclipse 또는 STS내 Remote Java Application 설정

- 이클립스(STS 포함) 디버그 버튼(벌레)의 화살표를 누른다.


- Debug Configurations... 을 선택한다.


- Remote Java Application 을 더블클릭한다.


- New_Configuration에 정보를 입력한다.

Name : 이름을 바꾸고 싶으면 편집.
Project : Browse 버튼을 선택하여 해당 되는 소스를 선택한다.
Host : 위의 리눅스 서버의 IP를 적어준다.
Port : 위 1번에서 확인하였던
JPDA_ADDRESS="8000"의 8000을 선택한다.

모든게 완료되면 Debug 버튼을 선택한다.


- 정상적으로 완료되면 아래와 같이 Thread 정보가 나오게 된다. 


3. Break Point 설정 및 Debug Perspective 사용

이후는 로컬에서 디버깅 하던 방법과 동일하다. 즉 Breakpoints, Watch, Variables 등등 모두 동일하게 사용하면 된다.
디버깅시에는 꼭 Debug Perspective를 이용하자.
Debug Perspective가 없다면 아래와 같이 추가할 수 있다.
메뉴 Window -> open 
Perspective를 눌러 Debug를 추가하거나 선택하면 된다. 



참고 사항

1. 내가 가지고 있는 소스가 서버와 일치해야 Break point 잡힌 부분이 상이하지 않게 된다. 개발서버(Linux)환경에서 쭈욱 디버깅하고 개발하고자 한다면 Autoftp와 같은 plugin 을 설치하여 소스 수정시 마다 자동으로 개발서버로 적용이 되도록 하면 좋다.

2. Tomcat 에 JNDI를 사용하고 있다면 그것은 그대로 사용된다. 모든 세팅은 서버에 되어 있는대로이며 단순하게 디버깅만 원격으로 되는 것이라고 생각하면 된다.

3. 톰캣과 이클립스로만 적어놓았지만 JPDA는 다른 WAS, 다른 IDE에서도 사용가능하다.

4. JSP 디버깅은 잘 안되기도 하니 참고하세요!



역시 개발자는 디버깅을 잘해야죠!

'디버깅' 카테고리의 다른 글

Android webview 디버깅 하기  (2) 2015.03.16
Posted by 다인,보리아빠
,