私は現在、本番環境でTomcat 6でWebアプリケーションを実行していますが、Tomcatが組み込みモードで動作しているか評価したいと考えています。HowtoはTomcat 6を埋め込んでいますか?
api documentationに記載されているもの以外に、良いチュートリアルやその他のリソースはありますか?
私は現在、本番環境でTomcat 6でWebアプリケーションを実行していますが、Tomcatが組み込みモードで動作しているか評価したいと考えています。HowtoはTomcat 6を埋め込んでいますか?
api documentationに記載されているもの以外に、良いチュートリアルやその他のリソースはありますか?
コードはそれ自身のために話す。 Tomcatを実行するには、pom.xmlスニペットとクラスを参照してください。
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>catalina</artifactId>
<version>6.0.18</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>coyote</artifactId>
<version>6.0.18</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>jasper</artifactId>
<version>6.0.18</version>
<scope>test</scope>
</dependency>
public class RunWebApplicationTomcat {
private String path = null;
private Embedded container = null;
private Log logger = LogFactory.getLog(getClass());
/**
* The directory to create the Tomcat server configuration under.
*/
private String catalinaHome = "tomcat";
/**
* The port to run the Tomcat server on.
*/
private int port = 8089;
/**
* The classes directory for the web application being run.
*/
private String classesDir = "target/classes";
/**
* The web resources directory for the web application being run.
*/
private String webappDir = "mywebapp";
/**
* Creates a single-webapp configuration to be run in Tomcat on port 8089. If module name does
* not conform to the 'contextname-webapp' convention, use the two-args constructor.
*
* @param contextName without leading slash, for example, "mywebapp"
* @throws IOException
*/
public RunWebApplicationTomcat(String contextName) {
Assert.isTrue(!contextName.startsWith("/"));
path = "/" + contextName;
}
/**
* Starts the embedded Tomcat server.
*
* @throws LifecycleException
* @throws MalformedURLException if the server could not be configured
* @throws LifecycleException if the server could not be started
* @throws MalformedURLException
*/
public void run(int port) throws LifecycleException, MalformedURLException {
this.port = port;
// create server
container = new Embedded();
container.setCatalinaHome(catalinaHome);
container.setRealm(new MemoryRealm());
// create webapp loader
WebappLoader loader = new WebappLoader(this.getClass().getClassLoader());
if (classesDir != null) {
loader.addRepository(new File(classesDir).toURI().toURL().toString());
}
// create context
// TODO: Context rootContext = container.createContext(path, webappDir);
Context rootContext = container.createContext(path, webappDir);
rootContext.setLoader(loader);
rootContext.setReloadable(true);
// create host
// String appBase = new File(catalinaHome, "webapps").getAbsolutePath();
Host localHost = container.createHost("localHost", new File("target").getAbsolutePath());
localHost.addChild(rootContext);
// create engine
Engine engine = container.createEngine();
engine.setName("localEngine");
engine.addChild(localHost);
engine.setDefaultHost(localHost.getName());
container.addEngine(engine);
// create http connector
Connector httpConnector = container.createConnector((InetAddress) null, port, false);
container.addConnector(httpConnector);
container.setAwait(true);
// start server
container.start();
// add shutdown hook to stop server
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
stopContainer();
}
});
}
/**
* Stops the embedded Tomcat server.
*/
public void stopContainer() {
try {
if (container != null) {
container.stop();
}
} catch (LifecycleException exception) {
logger.warn("Cannot Stop Tomcat" + exception.getMessage());
}
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public static void main(String[] args) throws Exception {
RunWebApplicationTomcat inst = new RunWebApplicationTomcat("mywebapp");
inst.run(8089);
}
public int getPort() {
return port;
}
}
これは役に立ちます。
あなたはTomcat6.xのソースパッケージをダウンロードした場合、あなたはこのクラスを取得:
Embeddクラスの使用方法の一例である:停止するそのシェルを|特定を開始Tomcatのインストール。 (つまり、既存のTomcatインストールを指すようにCATALINA_BASE
を設定することができます)。
あなたはこのように実行することができ、このコンパイルする場合:
のjava -D "catalina.base =%CATALINA_BASE%" -D "catalina.home =%CATALINA_HOME%" org.apache.catalina.startup.Catalinaをstart
このコードを変更してサーバをシャットダウンする方法がわかりません!
は、1つの桟橋上でTomcatを使用する理由はいくつかあります:
ポイント#5です私の仕事で重要だった。たとえば、Tomcatを使用してJSPWikiインスタンスに直接アクセスできますが、Jettyを使用すると完全にアクセスできません。私は2007年にその解決策を尋ねましたが、まだ答えを聞いていません。私はGlassfishとGrizzlyに目を通しましたが、これまでTomcatは最も安定していて、よく文書化されたWebコンテナです(これはあまり意味がありません)。
"各Webアプリケーションが独自のJVMにオープンします":この情報はどこから入手できましたか?私はこれが正確であるとは思わない。 – Bruno
もっとクラスローダーのようなものです。伝えるのは難しい。 –
私はかなり自らのJVMでwebappsが開かないことを確信しています。彼らはデフォルトで別のクラスローダーを使用します。あなたが望むクラスローダーの振る舞いを得るには 'webapp.setParentLoaderPriority(true);'を使用してください - これはJettyのドキュメントにあると思います。 –
この記事は、私はそれはいくつかの他の「時間
package com.creativefella;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardContext;
import org.apache.catalina.startup.Embedded;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TomcatServer {
private Embedded server;
private int port;
private boolean isRunning;
private static final Logger LOG = LoggerFactory.getLogger(TomcatServer.class);
private static final boolean isInfo = LOG.isInfoEnabled();
/**
* Create a new Tomcat embedded server instance. Setup looks like:
* <pre><Server>
* <Service>
* <Connector />
* <Engine>
* <Host>
* <Context />
* </Host>
* </Engine>
* </Service>
*</Server></pre>
* <Server> & <Service> will be created automcatically. We need to hook the remaining to an {@link Embedded} instnace
* @param contextPath Context path for the application
* @param port Port number to be used for the embedded Tomcat server
* @param appBase Path to the Application files (for Maven based web apps, in general: <code>/src/main/</code>)
* @param shutdownHook If true, registers a server' shutdown hook with JVM. This is useful to shutdown the server
* in erroneous cases.
* @throws Exception
*/
public TomcatServer(String contextPath, int port, String appBase, boolean shutdownHook) {
if(contextPath == null || appBase == null || appBase.length() == 0) {
throw new IllegalArgumentException("Context path or appbase should not be null");
}
if(!contextPath.startsWith("/")) {
contextPath = "/" + contextPath;
}
this.port = port;
server = new Embedded();
server.setName("TomcatEmbeddedServer");
Host localHost = server.createHost("localhost", appBase);
localHost.setAutoDeploy(false);
StandardContext rootContext = (StandardContext) server.createContext(contextPath, "webapp");
rootContext.setDefaultWebXml("web.xml");
localHost.addChild(rootContext);
Engine engine = server.createEngine();
engine.setDefaultHost(localHost.getName());
engine.setName("TomcatEngine");
engine.addChild(localHost);
server.addEngine(engine);
Connector connector = server.createConnector(localHost.getName(), port, false);
server.addConnector(connector);
// register shutdown hook
if(shutdownHook) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
if(isRunning) {
if(isInfo) LOG.info("Stopping the Tomcat server, through shutdown hook");
try {
if (server != null) {
server.stop();
}
} catch (LifecycleException e) {
LOG.error("Error while stopping the Tomcat server, through shutdown hook", e);
}
}
}
});
}
}
/**
* Start the tomcat embedded server
*/
public void start() throws LifecycleException {
if(isRunning) {
LOG.warn("Tomcat server is already running @ port={}; ignoring the start", port);
return;
}
if(isInfo) LOG.info("Starting the Tomcat server @ port={}", port);
server.setAwait(true);
server.start();
isRunning = true;
}
/**
* Stop the tomcat embedded server
*/
public void stop() throws LifecycleException {
if(!isRunning) {
LOG.warn("Tomcat server is not running @ port={}", port);
return;
}
if(isInfo) LOG.info("Stopping the Tomcat server");
server.stop();
isRunning = false;
}
public boolean isRunning() {
return isRunning;
}
}
を救うことができるように私自身の答えを答えるメートル歳いくつかのものを、ですが、私はまた404
エラーに直面し、いくつかの時間を苦労。ログ 'INFO: No default web.xml
'を見ることによって、私はそれが(それが警告であれば、見つけやすいだろう)と疑った。。(rootContext.setDefaultWebXml("web.xml")
)をTomcat (conf/web.xml
)と一緒に使用して使用しています。その理由は、HTML、JSのような静的ファイルを扱うDefaultServletが含まれているからです。 web.xml
を使用するか、コード内で手動でサーブレットを登録してください。
使用:
// start the server at http://localhost:8080/myapp
TomcatServer server = new TomcatServer("myapp", 8080, "/src/main/", true);
server.start();
// .....
server.stop();
は正しい場所にこのプログラムまたはポイントの同じディレクトリにデフォルトweb.xml
を配置することを忘れないでください。
シャットダウンフックは、Antonio's answerからインスピレーションを受けています。
このスレッドを数か月前に読んだ後、私はこのプロジェクトを書いた:spring-embedded-tomcat。 Tomcat6をSpringベースのアプリケーションに埋め込むために使用できます。
Tomcat 7またはJetty 9では埋め込みが簡単だと思います。ここでは素敵なご紹介があります:http://www.hascode.com/2013/07/embedding-jetty-or-tomcat-in-your-java-application/
Embed Jettyしかし、[Tomcat-embed](http://code.google.com/p/tomcat-embed/)があります。 – stepancheg
ポインタありがとう。しかし、これは完全ではなく、積極的に開発され、維持されているようには見えません。すべてのコミットは2008年5月11日付けであり、ログメッセージの1つは「完全ではありません」と呼びます。 –
このブログの記事を見る価値がある:[埋め込みTomcat 7](http://www.copperykeenclaws.com/embedding-tomcat-7/) –