web-dev-qa-db-ja.com

CLASSPATH、Java Build Path(Eclipse)、およびWEB-INF \ LIB:使用するもの、いつ、なぜか?

最近、.NETからJ2EEに切り替えましたが、JARファイルの配置場所について混乱しています。 CLASSPATH、WEB-INF、EclipseのJava Web PathはすべてJARを格納できる場所であることは知っていますが、使用するフォルダー、時期、理由について混乱しています。

まず、CLASSPATHがあります。通常、これを設定するには、「マイコンピュータ」内の「環境変数」に入ります。これは、JavaコンパイラがJARファイルを探すデフォルトの場所であることを知っています。 CLASSPATH環境変数にフォルダーまたはJARを追加した場合、Eclipse、Javaコンパイラー、およびWebサーバーで無視されるのはなぜですか?

また、WEB-INF\LIBは、Webアプリが使用するJARファイルを配置できる場所であることを知っています。ただし、JARをWEB-INF\LIBに置いたのは、それらを無視するためだけです。どのような状況でJARをWEB-INF\LIBフォルダーに配置する必要がありますか? EclipseまたはWebサーバーでそれらに気付くにはどうすればよいですか?

これまでのところ、私にとって有効なのは、EclipseプロジェクトのJava Build Pathを実際に変更することだけです。必要なJARを選択し、「外部JARの追加」をクリックします。ほとんどの場合、Eclipseは私のJARを認識し、その中のクラスを読み取ります。ただし、これを実行しているときに、奇妙なランダムエラーが多数発生しました(主に依存関係に関係していると思います)。何らかの理由で、これは物事を行う正しい方法ではなく、重要な情報が不足しているという感じがします。 Eclipse内で外部JARを手動で追加する必要があるのはいつですか? EclipseのJava Build PathがCLASSPATH環境変数のフォルダーを認識しないのはなぜですか?

本当に、CLASSPATH、EclipseのJavaビルドパス、およびWEB-INF/LIBフォルダーについての理解を深めたいと思っています。さまざまな状況でJARを配置する。あなたが私に与えることができるどんなアドバイス、またはあなたが推薦することができるどんな記事でも感謝します。

ありがとうございました。

35
sangfroid

環境で設定したCLASSPATHは、スタンドアロンJavaアプリケーション、つまりコマンドプロンプトまたはアイコンから実行するアプリケーションのみに影響します。ご存知のように、Eclipseはこれを無視します。独自のプロジェクトごとのクラスパスを設定します。

javacJavaは、コマンドプロンプトから呼び出された場合、このパスを尊重する必要がある場合がありますが、これを行うことは推奨されません。すべてのアプリには独自のセットが必要であることが判明したため、グローバルCLASSPATHは実際にはそれらのいずれも役に立たない。現代のプラクティスでは、コマンドラインでjavacまたはJava-cpオプションでクラスパスを指定するだけです。

スタンドアロンWebアプリケーションサーバーも独自のクラスパスを設定します。コマンドラインまたはGUIから、WebAppServerは通常、.BATを使用してクラスパスを設定するスクリプト(.shまたは-cp)によって起動されます。 Tomcatにはcommonまたはcommon/libと呼ばれるディレクトリがあり、サーバーとその下で実行されているすべてのプログラムで利用できるはずのライブラリが表示されます。ただし、アプリケーションがWEB-INF/libで独自のライブラリコレクションを提供するのが慣例であるため、通常、これを台無しにする必要はありません。

したがって、Webアプリの場合、Eclipseがそのようなディレクトリ構造を事前に構築すると仮定して、さまざまなjarをlibディレクトリのWEB-INFの下に配置します。

必要なすべてのライブラリをEclipseに知らせる必要もあります。プロジェクトエクスプローラーで、一度にすべてを選択し、右クリックして[Build Path | add to build path]を選択します。これは、Eclipseのプロジェクトビルドパスを手動で操作するよりも簡単です。

31
Carl Smotricz

Javaには長い歴史があり、経験から、いくつかのアイデアは良いものもあれば悪いものもあることが示されています。

CLASSPATH環境変数は、プログラムにクラスを配置する場所をJavaマシンに指示する最初の方法であり、コマンドラインプログラムでは適切に機能します。これはグローバルではないことがすぐにわかりました。もの(長い目で見れば混乱する傾向があります)が、プログラムごとのものです。これは、変数を設定してJavaを実行するラッパースクリプト/ BATファイルを作成することで実行できます。 =マシン。

すべてが順調だったため、人々はWebサーバーをJavaで書きたいと思っていました。サーブレットAPIは、Webアプリケーションがスタンドアロンユニットである場合に作成されました。これにより、each WebアプリケーションisのCLASSPATHがWEB-INF/classesの下に解凍されたファイルになりました。さらに、WEB-INF/libの下のjarファイル。そしてそれだけ。これは、グローバルCLASSPATH変数が無視されることを意味します。これは[〜#〜] very [〜#〜]良いことであることがわかったため、この概念は他の場所に移行しました。

たとえば、「Java -jar foobar.jar」で呼び出される「実行可能jar」(Eclipseは「実行可能jar」と呼びます)には、特別なマニフェストファイル内のJar内の完全なクラスパスが含まれます。 Java開始に使用されるWeb Start Java Webサーバーからのプログラムは、サーバー上の構成ファイルに完全なクラスパスを明示的にリストします。

しかし、あなたが始めるために。 Java Webアプリケーションを作成する場合:

  1. Eclipse Java EEバージョンを取得します。
  2. 新しい動的Webプロジェクトを作成します。 foob​​arという名前。
  3. Foob​​ar/WebContent/WEB-INF/libに必要なjarファイルをドラッグアンドドロップ(またはコピー/貼り付け)します
  4. Foob​​ar/WebContent/index.jspという名前の新しいファイルを作成します。空のファイルに<h1>Hello World <%= new Java.util.Date() %></h1>と入力します
  5. Index.jspのエディターを右クリックし、[実行]-> [サーバーで実行]を選択し、[ローカル]サーバーで[基本]-> [J2EEプレビュー]を選択し、[完了]をクリックします。

ブラウザまたはEclipse内でブラウザウィンドウが開き、JSPページが表示されます。 JSPページを変更し、Ctrl-Sで保存し、ブラウザウィンドウをリロードして変更を確認できます。

また、WEB-INF\LIBは、Webアプリが使用するJARファイルを配置できる場所であることを知っています。ただし、JARをWEB-INF\LIBに置いたのは、それらを無視するためだけです。どのような状況でJARをWEB-INF\LIBフォルダーに配置する必要がありますか? EclipseまたはWebサーバーでそれらに気付くにはどうすればよいですか?

ここにあるreal問題は、 Eclipse for Java [〜 #〜] ee [〜#〜] developer および/またはあなたが作成したばかりのジェネリックJava ProjectDynamic Web Projectおよび必要なフォルダ構造を自分で構築します。

Dynamic Web ProjectEclipse for Java EE developersに作成すると、Eclipseは自動的にWEB-INF/libのライブラリをbuild pathに追加します。build pathは、大まかに言って、コンパイル時とランタイムの両方で使用されるクラスパスです。言い換えると、サードパーティのJARをそこにドロップするだけで、それ以上何もする必要はありません。

Javaは大文字と小文字が区別されるため、WEB-INF/libではなく、WEB-INF/LIBと実際に呼び出す必要があります。とにかく、Dynamic Web Projectを作成すると、Eclipseは自動的に正しいフォルダー/ファイル構造を自動的に生成します。

他の人が言ったように、%CLASSPATH%環境変数は無視してください。onlyjavac.exe/Java.exeで使用され、さらにonlyを使用した場合not-cp-classpath、または-jar引数のいずれかを指定します。現実の世界では、この環境変数はめったに使用されません。これは初心者にとっては便利なことです(そして、残念なことに、最も混乱するものであり、発明するべきではありません)。

4
BalusC

Webアプリケーションを扱う場合、/ WEB-INF/libはJARを置くための移植可能な場所です。これはどこ ウェブサーバー サーブレットコンテナは、アプリケーションのjarファイルを見つけることを期待しています。

3
Powerlord

私はEclipseの専門家ではありませんが、あなたの問題は次のように答えられると思います。

1)CLASSPATHは、Javaプログラムを起動するときに読み込まれる環境変数であり、クラスローダーがクラスの配置場所を特定するために使用されます。

CLASSPATH変数を変更するのは、スクリプトからJavaプログラムを起動する場合のみです。これにより、プログラムを簡単に起動し、クラスが検出されることを確認できます。これにより、 Webアプリケーションを開発しているので、そうではありません。

2)WEB-INF/libは、Webアプリケーションがクラスを解決する必要がある場合に、Webアプリケーションコンテナのクラスローダー(Tomcatやglassfishな​​ど)が調べるディレクトリです。そこで、Webアプリケーションで使用されるクラスをそこに配置します。

一部のIDEには、プロジェクトで自動的に使用しているライブラリ/.jarファイルがパッケージに含まれています。

3)開発時のEclipseライブラリ/クラスパスの解決。私は仮定しますが、実際にはこれを行うべきではない;基本的に、そのアクティビティでIDEに対してこれらのクラスを表示します。また、IDEによってこれらのライブラリがWebプロジェクトなどに自動的に追加されるようにマークできると仮定します。

一般に、実行中にクラスがどのように検出されるかについての良い読み物は、 here (Sunの公式ドキュメントです)です。また、これについて読むのに適した場所は、ClassLoaderクラスのドキュメントです。

2
Laazik

コメントをまとめると、私も助けになりました。すべてのjena .jarをEclipseからのビルドパスに追加しましたが、それでは十分ではありませんでした。 「WEB-INF/libに追加する」という提案に続いて、ライブラリフォルダーから(Eclipse内から)WEB-INFにドラッグするのは直感的に思えましたが、うまくいきませんでした。 .jarsをWEB-INFにコピーしませんでした。最終的に、WindowsデスクトップからEclipseのWEB-INF libフォルダーにドラッグアンドドロップし、問題を修正しました。ビルドパスに追加された.jarがEclipseによってWEB-INF libに自動的にコピーされると便利です。重要な場合、これはWindows 7上のEclipse EE IDE、Indigoリリースでした。

2
Michael

Eclipseでは、ライブラリ、jarファイルへのパスを指定する必要があります(プロパティ-> Java Build Path-> Librariesタブ)。これは.classpathプロジェクトファイルにあります。

通常、パスにJREライブラリがあり(クラスパスにもあります)、クラスパスにライブラリを追加し、Eclipseビルドパスを更新すると機能します。

WEB-INFディレクトリは、Webアプリケーションに必要な情報を含む場所でなければなりません。

2
Diego Dias