私は、Webアプリケーションでの戦争と、突堤が埋め込まれた自己完結型jarファイルの両方を生成しようとしています。組み込みの突堤(jarファイルの配布)の場合、次のようにサーブレットを追加します。
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
server.setHandler(context);
context.addServlet(new ServletHolder(new HelloServlet()),"/*");
server.start();
server.join();
}
Warファイルの配布では、web-appセクションに以下を含むweb.xmlファイルを使用します。
<servlet>
<servlet-class>com.example.HelloServlet</servlet-class>
<servlet-name>SimplestServer</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
これは動作します。ただし、2つのアプローチの重複を取り除きたいと思います。つまり、新しいサーブレットを追加するときは、1つの場所のみで構成する必要があります。組み込みの桟橋からweb.xmlファイルを読み込んで使用できますか?
_org.Eclipse.jetty.webapp.WebAppContext
_ を使用します
例:
_package jetty;
import org.Eclipse.jetty.server.Server;
import org.Eclipse.jetty.webapp.WebAppContext;
public class OnWebApp
{
public static void main(String[] args) throws Exception
{
// Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port
// will be assigned that you can either look in the logs for the port,
// or programmatically obtain it for use in test cases.
Server server = new Server(8080);
// The WebAppContext is the entity that controls the environment in
// which a web application lives and breathes. In this example the
// context path is being set to "/" so it is suitable for serving
// root context requests and then we see it setting the location of
// the war. A whole Host of other configurations are available,
// ranging from configuring to support annotation scanning in the
// webapp (through PlusConfiguration) to choosing where the webapp
// will unpack itself.
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setWar("path/to/my/test.war");
// A WebAppContext is a ContextHandler as well so it needs to be set to
// the server so it is aware of where to send the appropriate requests.
server.setHandler(webapp);
// Start things up! By using the server.join() the server thread will
// join with the current thread.
// See http://docs.Oracle.com/javase/1.5.0/docs/api/Java/lang/Thread.html#join()
// for more details.
server.start();
server.join();
}
}
_
通常のWARファイルを作成し、Jettyで使用することに注意してください。
注釈スキャンやJNDIなどの特別な要件がある場合は、構成仕様を取得する必要があります。
_// Enable parsing of jndi-related parts of web.xml and jetty-env.xml
org.Eclipse.jetty.webapp.Configuration.ClassList classlist =
org.Eclipse.jetty.webapp.Configuration.ClassList.setServerDefault(server);
// Enable JNDI
classlist.addAfter("org.Eclipse.jetty.webapp.FragmentConfiguration",
"org.Eclipse.jetty.plus.webapp.EnvConfiguration",
"org.Eclipse.jetty.plus.webapp.PlusConfiguration");
// Enable Annotation Scanning
classlist.addBefore("org.Eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.Eclipse.jetty.annotations.AnnotationConfiguration");
_
WebAppContextでのこれのより長い例については、ServerWithAnnotationsの例を参照してください。
また、この手法を使用して、webappクラスローダールールもすべて適切に設定されることに注意してください。つまり、webapp用のクラスローダーとサーバー用のクラスローダーがあることになります。これは理解することが重要です。
クラスローダーのWebAppContextにできる調整はいくつかありますが、それらを削除することはできず、それらの動作を制御するだけです。
_WebAppContext webapp = new WebAppContext();
// ... various setup of the webapp ...
// Flip the classloader priority from servlet spec where webapp is first to
// Standard Java behavior of parent (aka Server classloader) is first.
webapp.setParentLoaderPriority(true);
_
こちらもご覧ください:
最終的にはJoakimのアプローチを使用しましたが、warファイルではなくwebappディレクトリを指しています。
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
String rootPath = SimplestServer.class.getClassLoader().getResource(".").toString();
WebAppContext webapp = new WebAppContext(rootPath + "../../src/main/webapp", "");
server.setHandler(webapp);
server.start();
server.join();
}