基於內嵌Tomcat的應用開發
阿新 • • 發佈:2019-01-30
為什麼使用內嵌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
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
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"/>