package onjava; import java.net.URL; import org.apache.catalina.Connector; import org.apache.catalina.Context; import org.apache.catalina.Deployer; import org.apache.catalina.Engine; import org.apache.catalina.Host; import org.apache.catalina.logger.SystemOutLogger; import org.apache.catalina.startup.Embedded; import org.apache.catalina.Container; public class EmbeddedTomcat { private String path = null; private Embedded embedded = null; private Host host = null; /** * Default Constructor * */ public EmbeddedTomcat() { } /** * Basic Accessor setting the value of the context path * * @param path - the path */ public void setPath(String path) { this.path = path; } /** * Basic Accessor returning the value of the context path * * @return - the context path */ public String getPath() { return path; } /** * This method Starts the Tomcat server. */ public void startTomcat() throws Exception { Engine engine = null; // Set the home directory System.setProperty("catalina.home", getPath()); // Create an embedded server embedded = new Embedded(); // print all log statments to standard error embedded.setDebug(0); embedded.setLogger(new SystemOutLogger()); // Create an engine engine = embedded.createEngine(); engine.setDefaultHost("localhost"); // Create a default virtual host host = embedded.createHost("localhost", getPath() + "/webapps"); engine.addChild(host); // Create the ROOT context Context context = embedded.createContext("", getPath() + "/webapps/ROOT"); host.addChild(context); // Install the assembled container hierarchy embedded.addEngine(engine); // Assemble and install a default HTTP connector Connector connector = embedded.createConnector(null, 8080, false); embedded.addConnector(connector); // Start the embedded server embedded.start(); } /** * This method Stops the Tomcat server. */ public void stopTomcat() throws Exception { // Stop the embedded server embedded.stop(); } /** * Registers a WAR with the container. * * @param contextPath - the context path under which the * application will be registered * @param warFile - the URL of the WAR to be * registered. */ public void registerWAR(String contextPath, URL warFile) throws Exception { if ( contextPath == null ) { throw new Exception("Invalid Path : " + contextPath); } if( contextPath.equals("/") ) { contextPath = ""; } if ( warFile == null ) { throw new Exception("Invalid WAR : " + warFile); } Deployer deployer = (Deployer)host; Context context = deployer.findDeployedApp(contextPath); if (context != null) { throw new Exception("Context " + contextPath + " Already Exists!"); } deployer.install(contextPath, warFile); } /** * Unregisters a WAR from the web server. * * @param contextPath - the context path to be removed */ public void unregisterWAR(String contextPath) throws Exception { Context context = host.map(contextPath); if ( context != null ) { embedded.removeContext(context); } else { throw new Exception("Context does not exist for named path : + contextPath); } } public static void main(String args[]) { try { EmbeddedTomcat tomcat = new EmbeddedTomcat(); tomcat.setPath("d:/jakarta-tomcat-4.0.1"); tomcat.startTomcat(); URL url = new URL("file:D:/jakarta-tomcat-4.0.1" + "/webapps/onjava"); tomcat.registerWAR("/onjava", url); Thread.sleep(1000000); tomcat.stopTomcat(); System.exit(0); } catch( Exception e ) { e.printStackTrace(); } } }이 EmbeddedTomcat 애플리케이션 소스는 main() 메소드부터 검토를 시작해야 한다. 이 메소드는 처음에 EmbeddedTomcat 클래스의 인스턴스를 생성한다. 다음에 Tomcat 인스턴스를 서비스할 Tomcat이 설치된 패스를 설정한다. 이 패스는
// 홈디렉토리를 지정한다. System.setProperty("catalina.home", getPath());
// 임베디드 서버를 생성 embedded = new Embedded(); embedded.setDebug(5); // 표준 오류에 대한 모든 로그 문장 출력 embedded.setLogger(new SystemOutLogger());
// 엔진을 생성 engine = embedded.createEngine(); engine.setDefaultHost("localhost");
// 기본 가상 호스트 생성 host = embedded.createHost("localhost", getPath() + "/webapps"); engine.addChild(host);
// Create the ROOT context Context context = embedded.createContext("", getPath() + "/webapps/ROOT"); host.addChild(context);
// 조합된 컨테이너 계층구조 설치 embedded.addEngine(engine);
// Assemble and install a default HTTP connector Connector connector = embedded.createConnector(null, 8080, false); embedded.addConnector(connector);
embedded.start();
URL url = new URL("file:D:/jakarta-tomcat-4.0.1" + "/webapps/onjava"); tomcat.registerWAR("/onjava", url);그리고 나면 주 애플리케이션은 서비스 요청이 들어올 때까지 임베디드 서버를 대기하도록 한다. 애플리케이션이 요청되면 임베디드 서버는 작업을 중지하고 애플리케이션을 빠져 나온다.
java onjava.EmbeddedTomcat
HttpProcessor[8080][0] Starting background thread HttpProcessor[8080][0] Background thread has been started HttpProcessor[8080][1] Starting background thread HttpProcessor[8080][1] Background thread has been started HttpProcessor[8080][2] Starting background thread HttpProcessor[8080][2] Background thread has been started HttpProcessor[8080][3] Starting background thread HttpProcessor[8080][3] Background thread has been started HttpProcessor[8080][4] Starting background thread HttpProcessor[8080][4] Background thread has been started일단 앞의 문장을 보았다면 아래 URL을 사용하여 ROOT와 /onjava 웹 애플리케이션에 접근할 수 있을 것이다.
이전 글 : 에릭 하게만 시리즈 5 - 수치처리 파이썬으로 배우는 확산의 개념
다음 글 : 귀도 반 로섬과의 인터뷰
최신 콘텐츠