20

私はこのように起動している組み込みのjettyサーバーを備えたアプリケーションを持っています(main()に配置され、Eclipseで起動されます):

Server server = new Server(port);

WebAppContext context = new WebAppContext();
context.setResourceBase("web/");
context.setDescriptor("web/WEB-INF/web.xml");
context.setConfigurations(new Configuration[]{
            new AnnotationConfiguration(), new WebXmlConfiguration(),
            new WebInfConfiguration(), new TagLibConfiguration(),
            new PlusConfiguration(), new MetaInfConfiguration(),
            new FragmentConfiguration(), new EnvConfiguration()});

context.setContextPath("/");
context.setParentLoaderPriority(true);
server.setHandler(context);
server.start();
server.join();

私の web.xml は次のようになります (今のところ空です。完全に削除できるかどうかわかりません)。

<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    metadata-complete="false"
    version="3.0">
</web-app>

そして、私は次のように設定された単純なクラスを持っています:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(urlPatterns={"/test"})
public class TestServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException  {
        request.getRequestDispatcher("/WEB-INF/html/index.html").forward(request,response);
    }
}

web.xml で従来のサーブレット マッピングを使用すると、アプリケーションが正常に動作します。しかし、web.xml マッピングを削除して注釈を使用すると、404 しか表示されません。注釈をスキャンしているようには見えません。コンソールは次のようになります。

2012-08-01 17:40:37.021:INFO:oejs.Server:jetty-8.1.5.v20120716
2012-08-01 17:40:37.227:INFO:oejpw.PlusConfiguration:No Transaction manager found - if your webapp requires one, please configure one.
2012-08-01 17:40:37.294:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/}
2012-08-01 17:40:37.547:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/}
2012-08-01 17:40:37.547:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/}
2012-08-01 17:40:37.547:INFO:oejsh.ContextHandler:started o.e.j.w.WebAppContext{/,file:/Users/me/project/web/}
2012-08-01 17:40:37.641:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080

私の研究からすでにチェックしたいくつかのこと:

  • servlet-3.0 jar はクラスパスにあります
  • web.xml で metadata-complete を false に設定
  • AnnotationConfiguration を Web アプリのコンテキストに含めるようにしました

私はアイデアを使い果たし、古い web.xml に戻ろうとしていますが、これを機能させることができない理由が私を殺しています。

4

7 に答える 7

8

更新:2021年6月

サンプルプロジェクトは、Jettyバージョンニュートラルに更新されました。

https://github.com/jetty-project/embedded-servlet-server

現在、Jettyの特定のバージョン用のブランチがあります。

古いサンプルプロジェクトはアーカイブされています。

更新:2015年6月

サンプルプロジェクトは、Jetty9およびサーブレット3.1用に更新されました。

参照:https ://github.com/jetty-project/embedded-servlet-3.1

元の回答:

あなたの説明と私があなたのコードを使って作り上げたサンプルプロジェクトから、あなたはすべてを正しくやっています。

サンプルプロジェクト:https ://github.com/jetty-project/embedded-servlet-3.0

これが機能するためには、次のものが必要になります(質問にはこの詳細が含まれていなかったため、これについてのみ言及してください)

  • JDK 1.6+
  • jetty 8.1.x(またはそれ以降)のjetty-webapps jar(+依存関係)
  • jetty 8.1.x(またはそれ以降)のjetty-annotations jar(+依存関係)

これらの制限された要件から、次の依存関係のリストが表示されます。

$ mvn dependency:tree
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building sample-webapp 1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-dependency-plugin:2.1:tree (default-cli) @ sample-webapp ---
[INFO] com.company.sample:sample-webapp:war:1-SNAPSHOT
[INFO] +- org.eclipse.jetty.orbit:javax.servlet:jar:3.0.0.v201112011016:provided
[INFO] +- org.eclipse.jetty:jetty-webapp:jar:8.1.5-SNAPSHOT:test
[INFO] |  +- org.eclipse.jetty:jetty-xml:jar:8.1.5-SNAPSHOT:test
[INFO] |  |  \- org.eclipse.jetty:jetty-util:jar:8.1.5-SNAPSHOT:test
[INFO] |  \- org.eclipse.jetty:jetty-servlet:jar:8.1.5-SNAPSHOT:test
[INFO] |     \- org.eclipse.jetty:jetty-security:jar:8.1.5-SNAPSHOT:test
[INFO] |        \- org.eclipse.jetty:jetty-server:jar:8.1.5-SNAPSHOT:test
[INFO] |           +- org.eclipse.jetty:jetty-continuation:jar:8.1.5-SNAPSHOT:test
[INFO] |           \- org.eclipse.jetty:jetty-http:jar:8.1.5-SNAPSHOT:test
[INFO] |              \- org.eclipse.jetty:jetty-io:jar:8.1.5-SNAPSHOT:test
[INFO] \- org.eclipse.jetty:jetty-annotations:jar:8.1.5-SNAPSHOT:test
[INFO]    +- org.eclipse.jetty:jetty-plus:jar:8.1.5-SNAPSHOT:test
[INFO]    |  +- org.eclipse.jetty.orbit:javax.transaction:jar:1.1.1.v201105210645:test
[INFO]    |  \- org.eclipse.jetty:jetty-jndi:jar:8.1.5-SNAPSHOT:test
[INFO]    |     \- org.eclipse.jetty.orbit:javax.mail.glassfish:jar:1.4.1.v201005082020:test
[INFO]    |        \- org.eclipse.jetty.orbit:javax.activation:jar:1.1.0.v201105071233:test
[INFO]    +- org.eclipse.jetty.orbit:javax.annotation:jar:1.1.0.v201108011116:test
[INFO]    \- org.eclipse.jetty.orbit:org.objectweb.asm:jar:3.1.0.v200803061910:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.771s
[INFO] Finished at: Fri Aug 10 18:17:46 MST 2012
[INFO] Final Memory: 6M/180M
[INFO] ------------------------------------------------------------------------

依存関係またはJDK要件が欠落している可能性があります。

于 2012-08-11T01:18:12.670 に答える
7

AnntationConfigurationscanForAnnotations(WebAppContext)クラスは、そのメソッドを介して注釈をスキャンします。メソッドAnnotationConfigurationクラスでは、次のパスをスキャンします。

  • コンテナジャー
  • WEB-INF/クラス
  • WEB-INF/ライブラリ

したがって、プロダクション コード (ディレクトリ内のソース) 内のサーブレット クラスをスキャンする場合は、プロダクション コードをのメタデータに としてsrc/main/java追加します。WebAppContextWEB-INF/classes

WebAppContextコードをのメタデータに追加するには、次のコードを試してください。

URL classes = getClass()
        .getProtectionDomain()
        .getCodeSource()
        .getLocation();

WebAppContext context = new WebAppContext();
context.getMetaData()
    .setWebInfClassesDirs(
        Arrays.asList(Resource.newResource(classes)));
于 2014-10-06T16:31:31.150 に答える
5

私はこれと同じ問題を抱えていましたが、何度も読んだ後、解決策を得ました! 重要: ビルド パスに次の jar があることを忘れないでください。

jetty-all-9.0.6.v20130930.jar

jetty-annotations-9.0.6.v20130930.jar

org.objectweb.asm-3.1.0.v200803061910.jar

javax.servlet-api-3.0.1.jar

jetty-plus-9.0.6.v20130930.jar

public class Main {

   public static void main(String[] args) throws Exception {

       //Create the server
       Server server = new Server(8080);

       ClassList clist = ClassList.setServerDefault(server);

       //clist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration",    "org.eclipse.jetty.plus.webapp.PlusConfiguration");
       clist.addBefore(JettyWebXmlConfiguration.class.getName(), AnnotationConfiguration.class.getName());

       //Here is the trick to scan current classpath!
       webapp.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", 
            ".*/build/classes/");

       webapp.setContextPath("/");
       webapp.setResourceBase("./WebContent");


       server.setHandler(webapp);

       server.start();
       server.join();

   }

}
于 2013-11-03T00:41:03.620 に答える
0

私たちの場合、これらの行は Jetty の起動コードで役に立ちました。

    ClassList cl = Configuration.ClassList.setServerDefault(server);
    cl.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.annotations.AnnotationConfiguration");
于 2014-10-17T09:41:54.427 に答える
0

You can

  1. provide EmptyResource.INSTANCE if you do not need static resources

  2. add AnnotationConfiguration and override scanForAnnotations method, adding classpath resource to WebAppContext Metadata, possibly with path to root package for a scan

    WebAppContext webapp = new WebAppContext();
        webapp.setContextPath("/");
        webapp.setBaseResource(EmptyResource.INSTANCE);
        webapp.setConfigurations(new Configuration[]{
                new AnnotationConfiguration(){
                    @Override
                    protected void scanForAnnotations(WebAppContext context) throws Exception {
                        Resource classPathResource =    Resource.newResource(EmbeddedServerApp.class.getResource("/my/learn/jetty/servlet").toURI());
                        context.getMetaData().addContainerResource(classPathResource);
                        super.scanForAnnotations(context);
                    }
                },
        });
        server.setHandler(webapp);
        server.start();
    
于 2020-02-01T19:13:49.543 に答える