2016-08-11 6 views
0

Jersey 2とGradleを使用して最初のREST APIをセットアップし、swaggerを使用してドキュメントを追加しようとしています。しかし、闊歩の依存関係を追加し、this闊歩ドキュメント、「Using a custom Application subclass」アプローチを以下のときのEclipseからmainメソッドを実行するとき、それは、この例外私をスロー:Jersey 2でスガッガーをスローするjava.lang.NoClassDefFoundError:javax/servlet/ServletConfig

Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/ServletConfig 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) 
    at java.lang.Class.getDeclaredMethods(Class.java:1975) 
    at org.glassfish.jersey.server.model.IntrospectionModeller$2.run(IntrospectionModeller.java:253) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at org.glassfish.jersey.server.model.IntrospectionModeller.getAllDeclaredMethods(IntrospectionModeller.java:247) 
    at org.glassfish.jersey.server.model.IntrospectionModeller.checkForNonPublicMethodIssues(IntrospectionModeller.java:172) 
    at org.glassfish.jersey.server.model.IntrospectionModeller.doCreateResourceBuilder(IntrospectionModeller.java:119) 
    at org.glassfish.jersey.server.model.IntrospectionModeller.access$000(IntrospectionModeller.java:80) 
    at org.glassfish.jersey.server.model.IntrospectionModeller$1.call(IntrospectionModeller.java:112) 
    at org.glassfish.jersey.server.model.IntrospectionModeller$1.call(IntrospectionModeller.java:109) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) 
    at org.glassfish.jersey.server.model.IntrospectionModeller.createResourceBuilder(IntrospectionModeller.java:109) 
    at org.glassfish.jersey.server.model.Resource.from(Resource.java:797) 
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:465) 
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:184) 
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:350) 
    at org.glassfish.jersey.server.ApplicationHandler$3.call(ApplicationHandler.java:347) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:255) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:347) 
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:299) 
    at org.glassfish.jersey.jdkhttp.JdkHttpHandlerContainer.<init>(JdkHttpHandlerContainer.java:98) 
    at org.glassfish.jersey.jdkhttp.JdkHttpServerFactory.createHttpServer(JdkHttpServerFactory.java:111) 
    at org.glassfish.jersey.jdkhttp.JdkHttpServerFactory.createHttpServer(JdkHttpServerFactory.java:93) 
    at example.MyApp.main(MyApp.java:21) 
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletConfig 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 29 more 

私のコードは次のようになります。

package example; 
import static org.glassfish.jersey.jdkhttp.JdkHttpServerFactory.createHttpServer; 
import java.net.URI; 
import javax.ws.rs.core.UriBuilder; 
import org.glassfish.jersey.jackson.JacksonFeature; 
import org.glassfish.jersey.server.ResourceConfig; 
import com.sun.net.httpserver.HttpServer; 
import io.swagger.jaxrs.listing.ApiListingResource; 
import io.swagger.jaxrs.listing.SwaggerSerializers; 

public class MyApp extends ResourceConfig { 

    public static void main(String[] args) throws Throwable { 
     URI baseUri = UriBuilder.fromUri("http://localhost/").port(9999).build(); 
     HttpServer server = createHttpServer(baseUri, new MyApp()); 
     System.out.println("SERVICE started at: " + baseUri); 
     Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
      server.stop(0); 
     })); 
    } 

    public MyApp() { 
     packages("example"); 
     register(SwaggerSerializers.class); // <-- swagger specific 
     register(ApiListingResource.class); // <-- swagger specific 
     register(JacksonFeature.class); 
    } 
} 

Windows 7jdk1.8.0_77を使用して私のGradleの依存関係

dependencies { 
    compile 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:+' 
    compile 'org.glassfish.jersey.containers:jersey-container-jdk-http:+' 
    compile 'org.glassfish.jersey.media:jersey-media-moxy:+' 
    compile 'org.glassfish.jersey.media:jersey-media-json-jackson:+' 
    compile 'io.swagger:swagger-jersey2-jaxrs:1.5.9' 
} 

ただし、コード内のスワッガーの依存関係と曖昧さの詳細をコメントアウトすると、実際のRESTサービスは期待通りに機能します。サーブレット・コンテナを使用せずにスワッガー・ワークを行うにはどうすればいいですか? RESTサービスは、

dependencies { 
    compile 'com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:+' 
    compile 'org.glassfish.jersey.containers:jersey-container-jdk-http:+' 
    compile 'org.glassfish.jersey.media:jersey-media-moxy:+' 
    compile 'org.glassfish.jersey.media:jersey-media-json-jackson:+' 
// compile 'io.swagger:swagger-jersey2-jaxrs:1.5.9' 
} 

コードなしで動作することができます。問題は、あなたが非サーブレット環境で実行してから派生しているよう

package example; 
import static org.glassfish.jersey.jdkhttp.JdkHttpServerFactory.createHttpServer; 
import java.net.URI; 
import javax.ws.rs.core.UriBuilder; 
import org.glassfish.jersey.jackson.JacksonFeature; 
import org.glassfish.jersey.server.ResourceConfig; 
import com.sun.net.httpserver.HttpServer; 
import io.swagger.jaxrs.listing.ApiListingResource; 
import io.swagger.jaxrs.listing.SwaggerSerializers; 

public class MyApp extends ResourceConfig { 

    public static void main(String[] args) throws Throwable { 
     URI baseUri = UriBuilder.fromUri("http://localhost/").port(9999).build(); 
     HttpServer server = createHttpServer(baseUri, new MyApp()); 
     System.out.println("SERVICE started at: " + baseUri); 
     Runtime.getRuntime().addShutdownHook(new Thread(() -> { 
      server.stop(0); 
     })); 
    } 

    public MyApp() { 
     packages("example"); 
     // register(SwaggerSerializers.class); // <-- swagger specific 
     // register(ApiListingResource.class); // <-- swagger specific 
     register(JacksonFeature.class); 
    } 
} 
+0

質問に詳細を書いただけでは、十分ではありません。明らかに、サーブレットコンテナを使用していないので、エラーは理解できます。しかし、あなたが「泥棒が取り除かれたとき」と言うとき、あなたが何を意味するのかは不明です。コードなしであなたのコードはどのように見えますか? – Ron

+0

質問が編集されました。これはもっとわかりますか? – etxalpo

+0

うん、ありがとう。 – Ron

答えて

2

だから、それが見えます。ジャージーはそれをサポートしていますが、スワッガーコアはそうではありません。これはあまり一般的ではありませんが、特定の展開ではいくつかの問題があります。

最も簡単な解決策は、明らかにサーブレット・コンテナ・エンジンを使用することです。 Jettyのような軽量なものが動作します。

+0

ok、私は桟橋を見ています。 – etxalpo

関連する問題