為什么使用內嵌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類,該類代碼如下:
-
1 public class EmbeddedTomcat { 2 private static String CONTEXT_PATH = "/TestForTomcat6"; 3 private static String PROJECT_PATH = System.getProperty("user.dir"); 4 private static String WEB_APP_PATH = PROJECT_PATH + File.separatorChar + "WebRoot"; 5 private static String TOMCAT_HOME = PROJECT_PATH + File.separatorChar + "Embedded" + File.separatorChar + "Tomcat"; 6 private static String ENCODING = "UTF-8"; 7 private static int TOMCAT_PORT = 9080; 8 9 // 開始嵌入式Tomcat服務器 10 public static void startTomcat() throws Exception { 11 try { 12 long startTime = System.currentTimeMillis(); 13 Embedded tomcat = new Embedded(); 14 // 設置Tomcat的工作目錄:工程根目錄/Embedded/Tomcat 15 tomcat.setCatalinaHome(TOMCAT_HOME); 16 System.out.println("TOMCAT_HOME:" + TOMCAT_HOME); 17 18 // 產生Tomcat引擎 19 Engine engine = tomcat.createEngine(); 20 //"localhost"對應的是work下的"Catalina" 21 engine.setName("Catalina"); 22 23 //創建Host,設置Host的工作目錄 24 Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()); 25 host.setAutoDeploy(true); 26 27 //把Host加入Engine 28 engine.addChild(host); 29 engine.setDefaultHost(host.getName()); 30 31 //創建Context,並加入Host中 32 Context context = null; 33 context = tomcat.createContext(CONTEXT_PATH, WEB_APP_PATH); 34 35 host.addChild(context); 36 host.addChild(tomcat.createContext("", "")); 37 if (!new File(WEB_APP_PATH).exists()) { 38 System.err.println("請檢查應用的目錄以及相關資源是否存在."); 39 } 40 tomcat.addEngine(engine); 41 42 Connector connector = tomcat.createConnector((java.net.InetAddress) null, TOMCAT_PORT, false); 43 connector.setURIEncoding(ENCODING); 44 connector.setUseBodyEncodingForURI(true); 45 tomcat.addConnector(connector); 46 AprLifecycleListener listener = new AprLifecycleListener(); 47 tomcat.addLifecycleListener(listener); 48 tomcat.start(); 49 //停住一個小時(3600秒) 50 Thread.sleep(3600000); 51 tomcat.stop(); 52 System.err.println("Tomcat started in " + (System.currentTimeMillis() - startTime) + " ms."); 53 } catch (Exception e) { 54 e.printStackTrace(); 55 } 56 } 57 58 public static void main(String[] args) { 59 try { 60 EmbeddedTomcat.startTomcat(); 61 } catch (Exception e) { 62 e.printStackTrace(); 63 } 64 } 65 66 67 }
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類,該類代碼如下:
-
1 public class EmbededTomcat { 2 private final Log log=LogFactory.getLog(getClass()); 3 private static String CONTEXT_PATH = "/TestForTomcat7"; 4 private static String PROJECT_PATH = System.getProperty("user.dir"); 5 private static String WEB_APP_PATH = PROJECT_PATH + File.separatorChar + "WebRoot"; 6 private static String CATALINA_HOME = PROJECT_PATH + "/Embedded/Tomcat"; 7 private Tomcat tomcat = new Tomcat(); 8 private int port; 9 10 public EmbededTomcat(int port){ 11 this.port=port; 12 } 13 14 public void start()throws Exception{ 15 tomcat.setPort(port); 16 tomcat.setBaseDir(CATALINA_HOME); 17 tomcat.getHost().setAppBase(WEB_APP_PATH); 18 try{ 19 StandardServer server = (StandardServer)tomcat.getServer(); 20 AprLifecycleListener listener = new AprLifecycleListener(); 21 server.addLifecycleListener(listener); 22 tomcat.addWebapp(CONTEXT_PATH, WEB_APP_PATH); 23 }catch(ServletException e){ 24 e.printStackTrace(); 25 log.error(e.getMessage()); 26 throw e; 27 } 28 try{ 29 tomcat.start(); 30 tomcat.getServer().await(); 31 }catch(LifecycleException e){ 32 e.printStackTrace(); 33 log.error(e.getMessage()); 34 throw e; 35 } 36 log.info("Tomcat started."); 37 } 38 39 public void stop()throws Exception{ 40 try{ 41 tomcat.stop(); 42 } 43 catch(LifecycleException ex){ 44 ex.printStackTrace(); 45 log.error(ex.getMessage()); 46 throw ex; 47 } 48 log.info("Tomcat stoped"); 49 } 50 51 public void setPort(int port){ 52 this.port=port; 53 } 54 public int getPort(){ 55 return this.port; 56 } 57 58 public static void main(String[] args) throws Exception { 59 EmbededTomcat embededTomcat = new EmbededTomcat(7080); 60 embededTomcat.start(); 61 } 62 }
遇到問題怎么辦?
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>節點的屬性來新建數據源配置,如下:
-
1 <Resource name="xxxxDataSource" auth="Container" 2 type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver" 3 url="jdbc:oracle:thin:@localhost:1521:xxxxx" 4 username="xxxx" password="xxxx" maxActive="15" maxIdle="10" initialSize="2" 5 testWhileIdle="true" validationQuery="select 1 from dual" testOnBorrow="true"/>