私は自分のPCで簡単なRESTfulアプリケーションを作成して実行したいと思います。 Javaプログラミング言語、Eclipse Helios IDE、Apache Tomcat 7サーバー、Microsoft Windows Xpオペレーティングシステム)を使用しています。
私は このチュートリアル(3から3.4ステップ) の同じ手順をPCで複製しようとしましたが、機能しません。
私がやったことは次のとおりです。
apache Tomcat 7の設定を使用して、Eclipseで動的プロジェクトを作成しました
jerseyとjsr311-api-1.0 jarファイルをプロジェクトに配置します\WEB-INF\lib\
ディレクトリ
webページからプロジェクトにコードパーツをコピーしました
プロジェクトを右クリックし、「実行->サーバーで実行」をクリックしました
http://localhost:8080/de.vogella.jersey.first/rest/hello
しかし、私が見るものがあります:
なぜ機能しないのですか?私は何を間違えましたか?どうして?
どうもありがとう!
編集:
コンソールの内容は次のとおりです。
25-set-2012 9.35.07 org.Apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the Java.library.path: C:\Programmi\Java\jdk1.6.0_21\bin;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Programmi/Java/jre6/bin/client;C:/Programmi/Java/jre6/bin;C:/Programmi/Java/jre6/lib/i386;C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\Apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\Apache-maven-3.0.4\bin";C:\WINDOWS\;C:\WINDOWS\System32;"C:\ApacheMaven\Apache-maven-3.0.4\bin";C:\WINDOWS\System32;C:\WINDOWS\;C:\WINDOWS\System32; C:\Programmi\R-Language\R-2.13.1\bin\;C:\Programmi\OpenVPN\bin\; C:\Programmi\Java\jdk1.6.0_21\bin\; "C:\ApacheMaven\Apache-maven-3.0.4\bin";;C:\Programmi\eclipseEC;
25-set-2012 9.35.08 org.Apache.Tomcat.util.digester.SetPropertiesRule begin
AVVERTENZA: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.Eclipse.jst.jee.server:de.vogella.jersey.first' did not find a matching property.
25-set-2012 9.35.10 org.Apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.10 org.Apache.coyote.AbstractProtocolHandler init
INFO: Initializing ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.10 org.Apache.catalina.startup.Catalina load
INFO: Initialization processed in 3459 ms
25-set-2012 9.35.10 org.Apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
25-set-2012 9.35.10 org.Apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.6
25-set-2012 9.35.11 org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:Sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:Sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.Apache.catalina.startup.TaglibUriRule body
INFO: TLD skipped. URI: urn:com:Sun:jersey:api:view is already defined
25-set-2012 9.35.12 org.Apache.catalina.core.ApplicationContext log
INFO: Marking servlet Jersey REST Service as unavailable
25-set-2012 9.35.12 org.Apache.catalina.core.StandardContext loadOnStartup
Grave: Servlet /de.vogella.jersey.first threw load() exception
Java.lang.ClassNotFoundException: javax.servlet.Filter
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:307)
at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:248)
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClassCond(ClassLoader.Java:632)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:616)
at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:141)
at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:283)
at Java.net.URLClassLoader.access$000(URLClassLoader.Java:58)
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:197)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:307)
at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:248)
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1558)
at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1488)
at org.Apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.Java:415)
at org.Apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.Java:397)
at org.Apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.Java:118)
at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1048)
at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:996)
at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:4741)
at org.Apache.catalina.core.StandardContext$3.call(StandardContext.Java:5062)
at org.Apache.catalina.core.StandardContext$3.call(StandardContext.Java:5057)
at Java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.Java:303)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:138)
at Java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.Java:886)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:908)
at Java.lang.Thread.run(Thread.Java:619)
25-set-2012 9.35.12 org.Apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["http-bio-8080"]
25-set-2012 9.35.12 org.Apache.coyote.AbstractProtocolHandler start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
25-set-2012 9.35.12 org.Apache.catalina.startup.Catalina start
INFO: Server startup in 1790 ms
たぶんいくつかのクラスがありませんか?
Mavenを使用せずに問題を解決するには、プロジェクトにJAX-RSファセットを追加する必要があります。ここで起こっているのは、Eclipseが正しいライブラリをサーバーにデプロイしていないことです。この構成には、プロジェクトの[プロパティ]からアクセスできます。プロジェクトのファセット。
正直に言うと、Mavenを使用して依存関係を管理しているため、Jerseyを機能させるためにどの特定のjarを追加するのかわかりません。そのため、Zipファイルの代わりに Jersey bundle をダウンロードし、JAX-RSファセットを構成しました。この効果は、プロジェクトのプロパティで確認できます|デプロイメントアセンブリ。Jerseyのライブラリは既にデプロイされるように構成されています。ところで、サーバーにデプロイされたライブラリを手動でセットアップできます。
しかし、Mavenを使用して依存関係を管理する理由を思い出しました。バンドルには、Jerseyの実行に必要なものがすべて含まれているわけではありません。 asm jar(Zipファイルに存在)がありません。そのため、プロジェクトのビルドパスに追加し、手動で展開アセンブリを再構成する必要がありました。
ですから、Maven、Jersey、Eclipseの tutorial です。それを試して、あなたの結論を引き出してください:)
同じチュートリアルで最初のRESTFULサービスを開発しました。最初は404エラーも何度か発生したので、いくつかの変更を続けましたが、最終的にはうまくいきました。これは私がやったことです-
1)URL-Patternタブから残りを削除しました。私はそれが間違ってあると思います。 2)パッケージ名ではなく、URLでコンテキストルートを使用しました。
私のURLは、"http://mylocalhost:8080/contextroot/classname
@pathアノテーションで定義されています。
それが役に立てば幸い。
servlet.jarは、結果のwarファイル(またはWEB-INF/lib)にあるべきではありません。アプリケーションサーバー自体が提供する必要があります。 (Tomcatの [〜#〜] faq [〜#〜] を参照)プロジェクトのビルドにMavenを使用している場合、サーブレットAPIのスコープをprovided
( リンク )。
StackOverflow に関する別の同様の質問。
私はあなたの例を繰り返しましたが、私のマシンでは箱から出して動作します。 jersey-archive-1.14.Zip をダウンロードし、Jersey
とjsr311-api-1.0 jar
だけでなく、含まれているlibディレクトリのコンテンツ全体をWEB-INF/libに入れました。 。
Jarファイルは次のとおりです。
それらのいくつかは不必要であるかもしれません、あなたはそれらを減らすことを試みることができました。しかし、それらすべてから始めましょう。
ただし、エラーメッセージは奇妙です。 javax.servlet.Filter
が欠落していると言われ、<your Tomcat dir>/lib/servlet-api.jar
に存在するはずです。 Tomcatを実行すると、このファイルは常にクラスパス上にあります。
WEB-INF/libディレクトリからservlet.jarまたはjavax.servlet.Filterを含むその他のjarを削除する必要があります。
サンプルコードをコンパイルするには、コンパイルクラスパスにクラスjavax.servlet.Filterが必要ですが、このクラスをWebアプリケーションに含めないようにする必要があります。 TomcatクラスローダーHOWTOから:
Tomcatが開始されると、次の親子関係に編成されたクラスローダーのセットが作成されます。親クラスローダーは子クラスローダーの上にあります。
Bootstrap | System | Common / \
Webapp1 Webapp2 ...
基本的に、webappの(おそらく)servlet.jarは、Tomcatコンテナで設定されたセキュリティによって適切に検出されない可能性があります。
冗長なクラスの読み込みをオンにすると、javax.servlet.Filterが奇妙な場所から読み込まれているかどうかを確認できますverbose:class
。クラスがTomcatライブラリからのものでない場合は、クラスを検索してください。それが問題である可能性があります。
Jersey 1.6アーカイブにあるすべてのjarを追加し、 this アーカイブをダウンロードして、すべてのjarをWebContent/WEB-INF/libプロジェクトのフォルダー。
前述の回答のように。いくつかのjarがありません。これらのjarファイルは、Project> WebContent> WEB-INF> lib>フォルダーまたはWebサーバーのlibフォルダー(たとえば、\ Apache-Tomcat\lib)に追加できます。
不足している正確なjarを教えてほしい場合は、両方のlibフォルダーのリストまたはスクリーンショットを貼り付けてみてください。
お役に立てれば
Servlet-api.jarが欠落している可能性があります。/WEB-INF/libまたはクラスパスに最新のjarを追加して、動作するかどうかを確認します。
同じチュートリアルに従って、HTTP Status 404の問題もありました。
最初に、Jerseyライブラリ1.18および2.15を使用してEclipseでJAX-RS Project Facetを設定しようとしましたが、機能しませんでした。
最後に、URLのパッケージ名(de.vogella.jersey.first)をコンテキストルート(つまりEclipseプロジェクト名)に置き換えることで問題を解決しました。
このチュートリアル mkyong.comが解決策を見つけるためのヒントをくれました。とにかく、URLのパッケージ名が間違いであるのか、それとも機能するような構成の詳細があるのかはわかりません。
このエラーは1日以上続きました!問題は、ジャージーのさまざまなバージョンの使用に起因することがわかります。 web.xmlのコンテンツを以下に示すコンテンツに置き換えれば、問題ありません!
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>de.vogella.jersey.first</param-value>
</init-param>
<init-param>
<param-name>unit:WidgetPU</param-name>
<param-value>persistence/widget</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
うまくいけば、私の答えが、同じチュートリアルに従うことを決定した他の誰かのために多くの時間を節約するでしょう!
WEB-INF/libフォルダーからservlet.jarを削除します。 Servlet.jarがそこにあるべきではないので、これで問題が修正されました。
クラスパスにサーブレットジャージjarが見つからないようです。必ず含めてください。この権利をテストする前に、戦争にパッケージ化してデプロイすると仮定します。したがって、コンパイル時にアプリケーションで使用可能なすべてのjarが戦争に含まれているかどうかを確認してください。
私が知る限り、Eclipse内からTomcatを実行しています。コンピューターのインストールディレクトリ(つまり、JARをコピーしたディレクトリ)を使用していない可能性がありますが、実際にはEclipseがローカルで作成する一時コピーを使用しています(申し訳ありませんが、私は自分のdevコンピューターatmではないので詳細を確認できません)?
メモリから2つのオプションがあります。
EclipseがTomcatに使用している(作業)ディレクトリを、実際にTomcatファイルがあるディレクトリに変更する必要があります。
Eclipse内のGUIインターフェースを使用して、EclipseのTomcatにJARを追加する必要があります。
あるいは、ここで完全に間違っている可能性があります;-)
編集:私が話しているビットのスクリーンショットを含みます。
上記の私のオプションの場合: