2017-02-17 4 views
-3

EclipseでMavenプロジェクトを作成すると、src/main/javaとsrc/main/resourcesという2つのネストされたディレクトリが作成されています。私はMavenが非コードファイルに使用するsrc/main/resources用に設計されていることを理解していますが、質問はJavaはどのようにJavaとリソースのディレクトリを区別しますか?

です。 this.getClass().getResourceAsStream("...")?私はjavaディレクトリにファイルを置くことができ、見つからない。ファイルがどこに置かれるのかを示すのに、-classpath以上のものがありますか?それがなければならないようですが、そうでなければ、任意のファイルをjavaまたはリソースのいずれかに置くことができます。

+1

これはJavaとは関係ありません。 Mavenがプロジェクトをビルドしてパッケージ化する方法についてです。 Mavenのドキュメントを見て、生成された.jarファイルの内容を見てください。 – Andreas

答えて

2

これはどのようにMavenについての質問ですJavaがどのようにファイルを見つけるかについてではなく、少しだけ説明します。

JavaのClassLoaderは、CLASSPATHを使用してクラスとリソースを検出します。このクラスとリソースは、通常、デプロイ済みコードの場合は.jar個のファイルのセットです。クラスローダーはクラス/リソースが見つかるまで、クラスパス上にリストされている順にファイル.jarを検索します。

ソースファイルをsrc/main/javasrc/main/resourcesにデフォルトで設定するのは、純粋にMaven thingであり、Javaのクラス/リソースの読み込みとは関係ありません。

ビルド中に.javaソースファイルがsrc/main/javaにコンパイルされ、コンパイルされた.classファイルがtarget/classesに配置されます。次に.classファイルとsrc/main/resourcesにあるすべてのファイルが.jarファイルにパッケージ化されます。

結果ファイル.jarには、ファイルとリソースファイルがすべて.classであり、これがJavaで検索されます。

src/main/javaの非.javaファイルは、Mavenのビルドプロセスでは無視されることに注意してください。

Mavenビルドを実行してファイルを見ると、すべてこれで表示されます。

0

Javaは「環境」からリソースをロードします。多くの場合、クラスパス内のすべてのjarを使用してリソースを取得します。 Javaでのリソースの読み込みは、コードが実行されている場所に関係なく、リソースを見つけるための正しい環境だけが必要であるため、場所に依存しないと呼ばれます。

クラスパス内のすべてのjarとパスを指定すると、javaは指定したリソースを見つけるために各トーンを相対的に検索します。リソース名を使用してリソースを指定します。

のClassLoaderクラスは異なる

リソースの名前として与えられた文字列を使用する(クラスで 方法参照)いずれかの絶対的/相対的な変換を適用せずにクラスローダのメソッドリソース名を適用します。名前には先頭に "/"を付けるべきではありません。 http://www.thinkplexx.com/learn/howto/java/system/java-resource-loading-explained-absolute-and-relative-names-difference-between-classloader-and-class-resource-loading

から続きを読むそう、私は Javaまたはリソースのいずれかで任意のファイルを置くことができ、存在しなければならないと思われます。

はい、プロジェクト内の任意の場所を置くことができますが、慎重にルール以下のファイルを置くためのMaven標準ディレクトリレイアウトの構造をお読みください:

https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

関連する問題