1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Exception in thread "rebel-messaging-executor-24" java.lang.OutOfMemoryError : PermGen space
        at org.zeroturnaround.javarebel.reporting.MixpanelMetrics$4.build(SourceFile:159)
        at org.zeroturnaround.javarebel.reporting.MixpanelMetrics$10.run(SourceFile:308)
        at org.zeroturnaround.javarebel.reporting.MetricsExecutor.runTask(SourceFile:63)
        at org.zeroturnaround.javarebel.reporting.MetricsExecutor.run(SourceFile:49)
        at java.lagn.Thread.run(Thread.java:662)
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: java.lang.OutOfMemoryError: PermGen space
cs


이클립스 콘솔 창에서 이러한 오류가 계속 뜨면서 톰캣 실행이 되지 않았다.

원인은 톰캣 서버의 공간이 부족해서 일어난 에러였고, 해결 방법은 이러하다.



서버 클릭 > Open launch configuration 클릭 > Arguments 탭 클릭 > 'VM arguments' 부분에

 

 -XX:MaxpermSize=256m -Xms256m -Xmx512m

를 추가하고, 이클립스를 재시작 한 뒤 서버를 다시 기동한다.

1. 정의

디렉토리의 기본 웹 페이지

디렉토리를 방문 했을 때 그 디렉토리에 맞는 기본 화면을 제공하기 때문에 웰컴 파일이라 함

url을 파일명이 아닌 디렉토리명으로 받았을 경우, 기본적으로 불러올 파일명을 지정해야 함



2. 특징

여러 개의 welcome 파일을 등록시 디렉토리에서 웰컴 파일을 찾을 때 태그에 선언된 위 > 아래 순서대로 조회하여 먼저 찾은 순대로 클라이언트로 보냄

둘 다 없을 시, 디렉토리 내의 모든 파일을 보여주거나 404 에러를 내보내기도 함



3. 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
 
</web-app>
cs



* 이러한 welcome-file-list 태그는 Tomcat 내의 기본 web.xml인 %CATALINA_HOME%/conf/web.xml 에도 존재하고, 프로젝트의 web.xml 두 곳에 모두 존재하나 프로젝트 내의 web.xml의 순위가 더 높음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Servlet 2.2
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app />
 
 
Servlet 2.3
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app />
 
 
Servlet 2.4
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="servlet-2_4" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
 
 
Servlet 2.5
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="servlet-2_5" version="2.5">
</web-app>
 
 
Servlet 3.0
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
cs


웹 어플리케이션 프로젝트를 분석하다가 다음과 같은 오류가 계속 발생했다.



javax.naming.NamingException: Could not load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory]

라는 오류가 발생하였고 인터넷을 검색하던 중 오류를 해결할 수 있게 되었다.

실제로 현재 톰캣8.5 버전을 사용하고 있는데,


1
2
3
4
5
6
7
8
9
10
11
12
 <Context>
     <Resource name="jdbc/OracleDB" 
         auth="Container"
         type="javax.sql.DataSource" 
         username="dbid23geb" 
         password="dbpass23geb"
         driverClassName="oracle.jdbc.OracleDriver"
         factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
         url="jdbc:oracle:thin:@localhost:1521:XE"
         maxActive="500" 
         maxIdle="100"/>  
 </Context>
cs


Context Resource factory 요소를 다음과 같이 사용하고 있었다.

factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"

톰캣8.0 이상을 사용하는 경우에는 factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" 로 바꿔줘야 한다.

톰캣7.0 이하일 경우 dpcp, 톰캣8.0 이상일 경우에는 dbcp2로 사용하면 된다.

1. 정의

web.xml 에서 서블릿 설정시 들어가는 숫자

해당 서블릿의 init() 메소드가 호출되는 시기와 순서를 정하는 것


보통의 서블릿은 반드시 '해당 서블릿'에 최초 요청이 들어올 때에만 해당 인스턴스화 초기 설정을 하게 되는데, 시간이 너무 오래 걸리기 때문에 Context의 웹 애플리케이션이 톰캣에 의해 인식되는 시점에 서블릿이 초기화 되도록 설정하는 것

(애노테이션이나 web.xml에 설정한 이름으로 서블릿을 호출하기 전에, 미리 톰캣 시작될 때 해당 서블릿을 호출하는 기술)



2. 방법

음수 : 톰캣 실행시 자동으로 서블릿이 호출되지 않고 load-on-startup을 설정하지 않은 서블릿과 동일해짐(일반 서블릿)

양수 : 0에 가까울수록 먼저 초기화됨. 같은 숫자가 mapping되었을 경우 먼저 작성된 서블릿부터 초기화됨



3. 예시
    1) web.xml 에 mapping하는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
 
    <display-name>Customer Support Application</display-name>
 
    <servlet>
        <servlet-name>TicketServlet</servlet-name>
        <servlet-class>/tickets</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
 
</web-app>
cs


2) 애노테이션으로 mapping하는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.wrox;
 
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
 
//loadOnStartup : tomcat 실행시 무조건 실행(서블릿 실행시가 아니라)
//                숫자가 0보다 크면 서버가 시작될 때 무조건 해당 서블릿을 초기화
//                (숫자가 0에 가까울 수록 먼저 초기화, 숫자 중복시 먼저 작성된 서블릿부터 초기화)
//                숫자가 음수일 경우 톰캣 호출시 서블릿이 호출되지 않고 그냥 보통의 서블릿으로 적용됨
//                web.xml에서 설정 가능
@WebServlet(name = "TicketServlet", urlPatterns = { "/tickets" }, loadOnStartup = 1)
public class TicketServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
cs


+ Recent posts