2013-05-03 17 views
12

Tomcatをアプリケーションサーバーとして使用してJava Webアプリケーションを設定すると、ライブラリが利用可能になると混乱することがよくあります。 Stack Overflowに関するいくつかの議論を通して、私はいくつかのライブラリ(.jar)ファイルが実行時に利用可能であり、他のものはコンパイル時に利用可能であることを学びました。多くの場合、エラーが発生し、試行錯誤によって解決され、アプリケーションが実行またはコンパイルされるまでjarファイルを別のディレクトリに配置します。最近、WEB-INF/libフォルダから.jarライブラリを実行時に利用できるようにすることができたことが私に指摘されました。私はこれについて考え始めて、いくつか質問がありました。私は過去にこのトピックを読んだことがあり、情報を容易に理解して保持する文脈に情報を入れるソースを見つけていません。Javaライブラリーランタイムとコンパイル時間

  1. プロジェクトに設定できるコンパイル時クラスパスと実行時クラスパスはありますか?

    a。クラスパスは、実行時に利用可能なライブラリを議論するための適用可能な用語でもありますか?

  2. 実行時にライブラリを利用できる唯一の方法はWEB-INF/libですか? Tomcatのlibフォルダは実行時に利用できますか?

  3. これはクラスローダーとどのように関連していますか?私はクラスローダーの階層が作成されていることを知っています。これらは厳密にランタイム操作のためのものですか? Eclipseで

+0

"プロジェクトに設定できるコンパイル時クラスパスと実行時クラスパスはありますか?"私は "プロジェクト"はTomcatのコンセプトだとは思わない。 WebアプリケーションやEclipse(または他のIDE)プロジェクトを考えていますか? – leonbloy

+0

私はこれをより良くスコープしたはずです。EclipseとTomcatを考慮しています。 –

答えて

15

によってのみTomcatのライブラリが利用可能

  • コンパイルクラスパスクラスパスは(javac -cp ...、またはあなたのIDEを使用して)Javaソースファイルをコンパイルするために使用されます。ソースファイルで参照されるすべてのクラスがコンパイルクラスパスに存在していなければなりません。そうでなければ、コンパイラはクラスを見つけることができないと不満を持ちます。

    クラスをコンパイルしたら、それらを使用して(java -cp ...を使用して)プログラムを実行できます。明らかに、あなたのソースコードが直接依存するライブラリは、ランタイムクラスパスになければなりません。しかしそれだけではありません。 CoolLibrary.jarに直接依存していて、内部的にはこのライブラリがGuava.jarに依存している場合、Guava.jarも実行時クラスパスになければなりませんが、コンパイル時には不要です。

    ウェブアプリケーションは少し特殊です。サーブレット仕様では、Webアプリケーションの実行に使用されるクラスパスが、デプロイされたWebアプリケーションのWEB-INF/classesディレクトリと、WEB-INF/libに含まれるすべてのjarファイルで構成されるように指定しています。すべてのWebアプリケーションは、Tomcatが直接提供するネイティブサーブレットとJSP jarにもアクセスできます。実際には、サーブレットとAPIのインターフェイスの実装クラスのようなTomcatの内部クラスもwebappでも利用できますが、これらのクラスに依存することはWebアプリをTomcatと結びつけるため、良い考えではありません。

    Webappの場合、ランタイムクラスパスの話は少し単純です。実際には、すべてのWebアプリケーションのクラスは、Tomcatによって特定のクラスローダーによって動的にロードされます。このwebappクラスローダは、tomcatのクラスローダの子です。理論的には、webapp jarをTomcatのクラスパスに直接配置することができますが、これはすべてのWebアプリケーションがこれらのライブラリを共有し、Webアプリケーションの展開と再デプロイに問題があることを意味します。Webアプリケーションごとに特定のクラスローダーを使用するという目標は、同じJVM内で、Guava 11.0に依存するアプリケーションと、Guava 12.0に依存するアプリケーションを持つことができるようにすることです。

    tomcatクラスローダーの詳細については、the documentationを参照してください。

  • +0

    EclipseでTomcatサーバーを開き、そのクラスパスをランタイムクラスパスに設定すると、とにかくアプリケーションごとにそれらを設定する必要はありますか?私が避けたいのは、アプリケーション固有の実行時クラスパスにこれらのjarファイルを指定することによって、100mbのwarファイルを避けることです。 –

    +2

    デベロッパーwebappが重要です。デフォルトでは、Eclipse WTPプロジェクト内のWebContent/WEB-INF/libの下にあるすべてのJARファイルは、Eclipseのコンパイル・クラスパス(Eclipseがビルド・パスと呼ぶもの)に自動的に追加され、WEB-INF/lib、Eclipseデプロイヤーしたがって、典型的なEclipse Webプロジェクトでは、Webアプリケーションで必要なすべてのライブラリをWEB-INF/libに配置し、実行時に不要なすべてのライブラリ(たとえば単体テストライブラリ)を別のディレクトリに配置し、パスを構築する。通常、Tomcatの内部クラスパスを混乱させる理由はありません。 –

    1
    1. 、あなたはコンパイル時にライブラリが含まjava build pathを持っている、あなたは、実行時のためであるorder and exportを、持っています。デフォルト

    +1

    Eclipseの 'Order and Export'タブで、'エクスポートされたエントリが従属プロジェクトに寄付されているということは、従属プロジェクトがコンパイルのためにそれらのライブラリを取得することを意味しないでしょうか?あなたはそれがサーバーのランタイムに関係していると確信していますか? –

    関連する問題