16

PC で簡単な RESTful アプリケーションを作成して実行したいと考えています。私は、Eclipse Helios IDEでJavaプログラミング言語を使用しており、Microsoft Windows XpオペレーティングシステムでApache Tomcat 7サーバーを使用しています。

このチュートリアルと同じ手順 (3 から 3.4 ステップ)を自分の PC で再現しようとしましたが、うまくいきません。

これが私がしたことです:

  • Apache Tomcat 7 設定を使用して、Eclipse で動的プロジェクトを作成しました

  • Jersey および jsr311-api-1.0 jar ファイルをプロジェクト\WEB-INF\lib\ディレクトリに配置する

  • コード部分をウェブページからプロジェクトにコピーしました

  • プロジェクトを右クリックし、[Run as -> Run on server] をクリックします。

  • に到達しようとした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

たぶん、いくつかのクラスがありませんか?

4

13 に答える 13

22

Maven を使用せずに問題を解決するには、プロジェクトに JAX-RS ファセットを追加する必要があります。ここで起こっていることは、Eclipse が正しいライブラリをサーバーにデプロイしていないということです。この構成には、プロジェクトの [プロパティ] | [プロパティ] からアクセスできます。プロジェクトのファセット。

正直なところ、依存関係の管理に Maven を使用しているため、Jersey を機能させるためにどの特定の jar を追加すればよいかわかりません。そのため、zip ファイルの代わりに、Jersey bundleをダウンロードし、それを使用して JAX-RS ファセットを構成しました。この効果は、プロジェクトの [プロパティ] | [プロパティ] で確認できます。デプロイ アセンブリ。Jersey のライブラリがデプロイされるように既に構成されています。ちなみに、デプロイされたライブラリをサーバーに手動でセットアップできます。

しかし、依存関係の管理に Maven を使用する理由を思い出しました。このバンドルには、Jersey を実行するために必要なすべてが含まれているわけではありません。asm jar がありません (zip ファイルに存在します)。そのため、それをプロジェクトのビルド パスに追加し、展開アセンブリを手動で再構成する必要がありました....

そこで、Maven、Jersey、および Eclipse を使用したチュートリアルを次に示します。試してみて、結論を出してください:)

于 2012-10-04T02:35:39.507 に答える
3

同じチュートリアルを実行して、最初のRESTFULサービスを開発しました。最初は404エラーも数回発生したので、いくつか変更を加え続けましたが、最終的にはうまくいきました。これは私がしたことです-

1)残りを[URL-パターン]タブから削除しました。それは間違っていると思います。2)パッケージ名ではなく、URLでコンテキストルートを使用しました。

私のURLは、"http://mylocalhost:8080/contextroot/classname@pathアノテーションで定義されています。

それが役に立てば幸い。

于 2012-11-24T05:50:07.907 に答える
2

あなたの例を繰り返しましたが、私のマシンではそのまま使用できます。jersey-archive-1.14.zipをダウンロードし、含まれている lib ディレクトリの内容全体を、あなたが行ったようにだけでなく、WEB-INF/lib にJersey入れjsr311-api-1.0 jarました。

jar は次のとおりです。

  • asm-3.1.jar
  • jackson-core-asl-1.9.2.jar
  • ジャクソン-jaxrs-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • jackson-xc-1.9.2.jar
  • jersey-client-1.14.jar
  • jersey-core-1.14.jar
  • jersey-json-1.14.jar
  • jersey-server-1.14.jar
  • jersey-servlet-1.14.jar
  • jettison-1.1.jar
  • jsr311-api-1.1.1.jar

それらのいくつかは不必要かもしれませんが、それらを減らすことを試みることができます. しかし、それらすべてから始めてください。

ただし、エラーメッセージは奇妙です。javax.servlet.Filterに住んでいるはずの が行方不明になっ ていると書かれてい<your tomcat dir>/lib/servlet-api.jarます。このファイルは、Tomcat の実行時に常にクラスパスにあります。

于 2012-10-04T08:36:20.623 に答える
2

servlet.jar は、結果のwar ファイル (または WEB-INF/lib) にあってはなりません。これは、アプリケーション サーバー自体によって提供される必要があります。(Tomcat のFAQを参照してください) プロジェクトのビルドに Maven を使用している場合は、サーブレット API のスコープをprovided(リンク) として設定できます。

StackOverflowに関する別の同様の質問。

于 2012-09-29T18:22:18.020 に答える
1

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 コンテナーで構成されたセキュリティで適切に検出されていない可能性があります。

verbose class loading をオンにすると、 javax.servlet.Filter が奇妙な場所からロードされているかどうかを確認できますverbose:class。Tomcat ライブラリから来ていない場合は、クラスを検索します。これが問題である可能性があります。

于 2012-09-29T17:39:01.053 に答える
0

前述の前の答えのように。あなたはいくつかの瓶を逃しています。これらのjarファイルは、Project> WebContent> WEB-INF> lib>フォルダーまたはWebサーバーのlibフォルダー(たとえば、\ apache-tomcat \ lib)に追加できます。

不足している正確なjarを教えてほしい場合は、両方のlibフォルダーのリストまたはスクリーンショットを貼り付けてみてください。

お役に立てれば

于 2012-09-29T00:03:53.533 に答える
0

私が知る限り、あなたは Eclipse 内から Tomcat を実行しています。コンピューターのインストール ディレクトリ (つまり、JAR をコピーしたディレクトリ) を使用していない可能性がありますが、実際には Eclipse がローカルに作成する一時コピーを使用しています (申し訳ありませんが、私は自分の開発コンピューター atm にいないので、詳細は確認できません)?

メモリから、2 つのオプションがあります。

  1. Eclipse が Tomcat に使用している (作業) ディレクトリを、実際に Tomcat ファイルがあるディレクトリに変更する必要があります。

  2. Eclipse 内の GUI インターフェースを使用して、Eclipse の Tomcat に JAR を追加する必要があります。

あるいは、ここで完全に間違っている可能性があります;-)

編集:私が話しているビットのスクリーンショットを含めます。

上記の私のオプションについて:

  1. 中央の「サーバーの場所」は、「Tomcat のインストールを制御する」場所にある必要があります。
  2. 下の画像の「一般情報」ボックスの「起動構成を開く」リンクをクリックすると、クラスパスタブにそれらを追加します

ここに画像の説明を入力

于 2012-10-04T01:12:26.890 に答える
0

クラスパスにサーブレット ジャージ jar が見つからないようです。それらを必ず含めてください。この権利をテストする前に、戦争にパッケージ化して展開することを想定しています。そのため、コンパイル時にアプリケーションで使用可能だったすべての jar が戦争に含まれているかどうかを確認してください。

于 2012-09-28T20:01:55.363 に答える
0

jersey 1.6 アーカイブにあるすべての jar を追加し、このアーカイブをダウンロードして、すべての jar をプロジェクトのWebContent/WEB-INF/libフォルダーに追加する必要があります。

于 2012-12-17T06:49:11.283 に答える
0

このエラーが 1 日以上発生しました。この問題は、Jersey の異なるバージョンの使用に起因することが判明しました。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>

うまくいけば、私の答えが、同じチュートリアルに従うことを決定した他の誰かのために多くの時間を節約するでしょう!

于 2014-02-12T17:03:33.753 に答える
0

servlet-api.jar がない可能性があります。/WEB-INF/lib またはクラスパスに最新の jar を追加し、動作するかどうかを確認します。

于 2012-09-28T16:31:15.187 に答える