1

私はJavaライブラリを本当に理解したことはなく、誰かが私の理解を明確にしてくれるといいのですが。

  1. デフォルトでJavaに付属していないパッケージが必要な場合は、それをグーグルで検索してバイナリをダウンロードします。つまり、「HttpClient」の場合httpcomponents-client-4.2.2-bin.zip、apache.orgからダウンロードします。
  2. 最初に.zipファイルをnetbeansにインポートしてから、importコマンドを使用する必要があります(通常は自動的に提案されます)。

私はまだいくつかの質問/問題があります。

HttpClientクラスはapacheクライアントライブラリの一部のようですが、そのimport sun.net.www.http.HttpClient理由を教えてください。(私がやっても、残りの問題は解決しません)

次に、使用しようとするHttpClient httpclient = new DefaultHttpClient();と、DefaultHttpClientシンボルが見つからないが、ライブラリはすでにNetbeansに追加されていると表示されます。

この同様の例http://www.vogella.com/articles/ApacheHttpClient/article.htmlを見ると、一部のインポートには、ダウンロードしたパッケージが付属していません。

これは私にはかなり頻繁に起こります、そして時々私は本当に理解せずにそれを修正することができます。Atm私はこの答えを実装しようとしていますhttps://stackoverflow.com/a/3325065/960086

4

1 に答える 1

4

OK、JVMがクラスのインスタンスを作成する方法に関して理解する必要のあることがいくつかあります。最初から始めます。

JVMが起動すると、アプリケーションの実行に使用されるクラスをロードする必要があります。これを行うには、ブートストラップクラスローダー、拡張機能クラスローダー、システムクラスローダーの3つのクラスローダーが使用されます。それぞれ$JAVA_HOME/libおよび$JAVA_HOME/ lib/extのjarファイルからの最初の2つのロードクラス。これらは基本的にJVMを実行するために必要なものです-今のところそれらについて心配する必要はありません。3番目のクラスローダーであるシステムクラスローダーは、関心のあるものです。このシステムクラスローダーは、クラスパスを使用して、アプリケーションを形成するためにJVMに追加するクラスを検索します。

クラスローダーにはまだまだたくさんのことがありますが、今のところはそれで十分です。

したがって、システムクラスローダーはクラスパスを使用してクラスをロードします。最も単純な形式では、クラスパスは、Javaコンパイラが作成したクラスを出力するディレクトリへの参照にすぎません。そのディレクトリ内には、クラスを作成したときに使用したパッケージ構造(アプリケーションのコンテキスト内でクラスを編成するために使用される.javaファイルの先頭にあるパッケージ宣言)と.classファイルを表すディレクトリの階層があります。コンパイルされたクラスが含まれています。JVMでクラスが必要になると、システムクラスローダーはパッケージを表すディレクトリ構造を解析し、クラスをロードします(または、クラスが見つからない場合はClassNotFoundExceptionをスローします)。

現在、Javaの強みの1つは、利用可能なサードパーティライブラリの数が非常に多いことです。明らかに、ディレクトリをコピーしてコードを共有することは機能しないため、JavaアーカイブまたはJARファイルが使用されます。JARは、いくつかの標準ディレクトリに加えて、パッケージ構造を表す同じディレクトリと前述の.classファイルを含むzipファイルにすぎません。もちろん、拡張子.jarを取得しますが、zipファイルを開くことができるツールはJARを開きます。JARを使用するには、ディレクトリと同じようにクラスパスに追加するだけで、ディレクトリと同じように、システムクラスローダーは必要に応じてクラスをロードするために含まれる構造を解析します。

とはいえ、HttpClientの場合のように、サードパーティのライブラリを使用する場合は、 JARだけをダウンロードすることはめったにありません。明らかに、サードパーティのライブラリにはクラスだけでなく、ほとんどのクラスにドキュメント、例、さらにはソースコードが含まれています。ただし、サードパーティライブラリを使用するプロセスは同じです。使用するクラスを含むJARを抽出し、そのJARクラスパスに追加する必要があります。

これはほぼ完全な話です。一般的なアプリケーションで使用されるサードパーティライブラリの数が増えるにつれて、これらのライブラリの管理の問題も増え、Ant with Ivy、最近ではMavenが普及しました。ビルド機能に加えて、アプリケーションが依存するサードパーティライブラリを宣言し、それらのライブラリをダウンロードしてクラスパスに追加するプロセスを合理化する方法を提供します。しかし、彼らがしていることは、ライブラリをダウンロードして手動でクラスパスに追加する場合とまったく同じです。

于 2013-01-04T17:20:13.350 に答える