1. 程式人生 > >基於內嵌Tomcat的應用開發

基於內嵌Tomcat的應用開發

為什麼使用內嵌Tomcat開發?

    開發人員無需搭建Tomcat的環境就可以使用內嵌式Tomcat進行開發,減少搭建J2EE容器環境的時間和開發時容器頻繁啟動所花時間,提高開發的效率.

怎麼搭建內嵌Tomcat環境呢?(以tomcat6和tomcat7為例)

在開發工程(xxxx)的根目錄下新建以下的目錄:

xxxx/Embedded/conf

xxxx/Embedded/lib

xxxx/Embedded/webapps

xxxx/Embedded/work

apache-tomcat-6.0.32

apache官方只提供了apache-tomcat5和apache-tomcat7的內嵌版本,apache-tomcat6是沒有的,但我們同樣可以提供內嵌版本。

1. 將apache-tomcat-6.0.32\lib下所有的jar包拷到xxxx/Embedded/lib下

  • annotations-api.jar
  • catalina.jar
  • catalina-ant.jar
  • catalina-ha.jar
  • catalina-tribes.jar
  • ecj-3.3.1.jar
  • el-api.jar
  • jasper.jar
  • jasper-el.jar
  • jsp-api.jar
  • servlet-api.jar
  • tomcat-coyote.jar
  • tomcat-dbcp.jar
  • tomcat-i18n-es.jar
  • tomcat-i18n-fr.jar
  • tomcat-i18n-ja.jar
2.將apache-tomcat-6.0.32\bin下的tomcat-juli.jar包拷到xxxx/Embedded/lib下。 3.將JDK安裝目錄下的lib中的tools.jar包拷到xxxx/Embedded/lib下。 4.將apache-tomcat-6.0.32\conf下的context.xml和web.xml檔案拷貝到xxxx/Embedded/conf下。 5.將xxxx/Embedded/lib下的所有Jar包都加到工程的classpath下。 6.在工程中新建EmbeddedTomcat類,該類程式碼如下:
public class EmbeddedTomcat {
	private static String CONTEXT_PATH = "/TestForTomcat6";
	private static String PROJECT_PATH = System.getProperty("user.dir");
	private static String WEB_APP_PATH = PROJECT_PATH + File.separatorChar + "WebRoot";
	private static String TOMCAT_HOME = PROJECT_PATH + File.separatorChar + "Embedded" + File.separatorChar + "Tomcat";
	private static String ENCODING = "UTF-8";
	private static int TOMCAT_PORT = 9080;

	// 開始嵌入式Tomcat伺服器
	public static void startTomcat() throws Exception {
		try {
			long startTime = System.currentTimeMillis();
			Embedded tomcat = new Embedded();
			// 設定Tomcat的工作目錄:工程根目錄/Embedded/Tomcat
			tomcat.setCatalinaHome(TOMCAT_HOME);
			System.out.println("TOMCAT_HOME:" + TOMCAT_HOME);
			
			// 產生Tomcat引擎
			Engine engine = tomcat.createEngine();
			//"localhost"對應的是work下的"Catalina"
			engine.setName("Catalina");
			
			//建立Host,設定Host的工作目錄
			Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome());
			host.setAutoDeploy(true);
			
			//把Host加入Engine
			engine.addChild(host);
			engine.setDefaultHost(host.getName());
			
			//建立Context,並加入Host中
			Context context = null;
			context = tomcat.createContext(CONTEXT_PATH, WEB_APP_PATH);
			
			host.addChild(context);
            host.addChild(tomcat.createContext("", ""));
			if (!new File(WEB_APP_PATH).exists()) {
				System.err.println("請檢查應用的目錄以及相關資源是否存在.");
			}
			tomcat.addEngine(engine);
			
			Connector connector = tomcat.createConnector((java.net.InetAddress) null, TOMCAT_PORT, false);
			connector.setURIEncoding(ENCODING);
			connector.setUseBodyEncodingForURI(true);
			tomcat.addConnector(connector);
			AprLifecycleListener listener = new AprLifecycleListener();
			tomcat.addLifecycleListener(listener);
			tomcat.start();
			//停住一個小時(3600秒)
			Thread.sleep(3600000);
			tomcat.stop();
			System.err.println("Tomcat started in " + (System.currentTimeMillis() - startTime) + " ms.");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) {
		try {
			EmbeddedTomcat.startTomcat();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}


}

apache-tomcat-7.0.22 1.請先到apache-tomcat官方網站下載apache-tomcat-7.0.23-embed內嵌版本,解壓後將apache-tomcat-7.0.23-embed下的所有jar包拷貝到xxxx/Embedded/lib下,具體的jar如下:
  • ecj-3.7.jar
  • tomcat-dbcp.jar
  • tomcat-embed-core.jar
  • tomcat-embed-jasper.jar
  • tomcat-embed-logging-juli.jar
  • tomcat-embed-logging-log4j.jar
2.將apache-tomcat-7.0.23/conf下的context.xml和web.xml檔案拷貝到xxxx/Embedded/conf下。
3.將xxxx/Embedded/lib下的所有Jar包都加到工程的classpath下。 4.在工程中新建EmbeddedTomcat類,該類程式碼如下:
public class EmbededTomcat {
	private final Log log=LogFactory.getLog(getClass());
	private static String CONTEXT_PATH = "/TestForTomcat7";
	private static String PROJECT_PATH = System.getProperty("user.dir");
	private static String WEB_APP_PATH = PROJECT_PATH + File.separatorChar + "WebRoot";
	private static String CATALINA_HOME = PROJECT_PATH + "/Embedded/Tomcat";
	private Tomcat tomcat = new Tomcat();
    private int port;
	
    public EmbededTomcat(int port){
        this.port=port;
    }
    
	public void start()throws Exception{
		tomcat.setPort(port);
		tomcat.setBaseDir(CATALINA_HOME);
		tomcat.getHost().setAppBase(WEB_APP_PATH);
		try{
			StandardServer server = (StandardServer)tomcat.getServer();
		    AprLifecycleListener listener = new AprLifecycleListener();
		    server.addLifecycleListener(listener);
			tomcat.addWebapp(CONTEXT_PATH, WEB_APP_PATH);
		}catch(ServletException e){
			e.printStackTrace();
			log.error(e.getMessage());
			throw e;
		}
		try{
			tomcat.start();
			tomcat.getServer().await();
		}catch(LifecycleException e){
			e.printStackTrace();
			log.error(e.getMessage());
			throw e;
		}
		log.info("Tomcat started.");
	}
	
	public void stop()throws Exception{
            try{
                tomcat.stop();
            }
            catch(LifecycleException ex){
                ex.printStackTrace();
                log.error(ex.getMessage());
                throw ex;
            }
            log.info("Tomcat stoped");
	}
        
    public void setPort(int port){
        this.port=port;
    }
    public int getPort(){
        return this.port;
    }
    
    public static void main(String[] args) throws Exception {
    	EmbededTomcat embededTomcat = new EmbededTomcat(7080);
    	embededTomcat.start();
	}
}

遇到問題怎麼辦? 1. 內嵌Tomcat啟動時報OutOfMemoryError異常,如何設定JVM的記憶體大小?

答:請按照以下步驟設定JVM的記憶體大小:

(1)點選“Window->Preferences->Java->Installed JREs”可以看到所有的JRE。

(2)點中當前使用的JRE,再點選右邊的“Edit”。

(3)為該JRE的“Default VM Arguments”配置引數值:-Xmx1024M -Xms512M -XX:MaxPermSize=256m。

2.如何配置資料庫的JNDI資料來源?

答:開啟XXXX\Embedded\Tomcat\conf\context.xml配置檔案,新增<Resource>節點的屬性來新建資料來源配置,如下:

<Resource name="xxxxDataSource" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@localhost:1521:xxxxx"
              username="xxxx" password="xxxx" maxActive="15" maxIdle="10" initialSize="2"
              testWhileIdle="true" validationQuery="select 1 from dual" testOnBorrow="true"/>