30

私は C#/Visual Studio のバックグラウンドから Java と Eclipse に取り組んでいます。後者では、通常、次のようなソリューションを整理します。

\MyProjects\MyApp\MyAppsUtilities\LowerLevelStuff

ここで、MyApp には .exe をビルドするためのプロジェクトが含まれ、MyAppsUtilities は .exe によって呼び出されるアセンブリ DLL を作成し、LowerLevelStuff はおそらく上位レベルのユーティリティ DLL によって使用されるクラスを含むアセンブリをビルドします。

Eclipse (Ganymede ですが、Galileo に切り替えることを確信できます) には、次のものがあります。

\MyProjects\workspace\MyApp

最初のプロジェクトを作成するとき。ソース ファイルとビルド ファイルを同じフォルダーに配置するオプションがありますが、パッケージ階層を反映するパスに .java ファイルが作成されています。

\MyProjects\workspace\MyApp\src\com\mycompany\myapp\MyApp.java

私の質問は次のとおりです。.NET で上記の MyAppsUtilities および LowerLevelStuff アセンブリ DLL に類似する .jar ファイルのサブプロジェクト (Java/Eclipse の正しい用語ですか?) を作成する場合、フォルダーを同等に編成できますか (すべきですか)。例えば:

\MyProjects\workspace\MyApp\src\com\mycompany\myapp\myapputilities\MyAppsUtilities.java

このようなものを整理するための標準/正しい方法は何ですか?また、IDE で具体的にどのように行われますか?

4

4 に答える 4

60

Javaソースコードパッケージを1つの大きな階層型名前空間と考えてください。商用アプリケーションは通常、「com.mycompany.myapp」の下にあります(このアプリケーションのWebサイトは「http://myapp.mycompany.com」である可能性がありますが、常にそうであるとは限りません)。

myappパッケージの下でどのように整理するかは、主にあなた次第です。実行可能ファイル(.exe)、DLL、および低レベルクラスをC#で区別することは、Javaでは同じ形式では存在しません。すべてのJavaソースコードは.classファイル(その内容は「バイトコード」と呼ばれます)にコンパイルされ、多くのプラットフォームでJava仮想マシン(JVM)によって実行できます。したがって、パッケージを介してそのようなレベルを特定しない限り、高レベル/低レベルのクラスに固有の区別はありません。パッケージ化の一般的な方法は次のとおりです。

  • com.mycompany.myapp:メインクラス; MyApp(メインメソッド付き)
  • com.mycompany.myapp.model:ドメインモデルクラス; 顧客、注文など
  • com.mycompany.myapp.ui:ユーザーインターフェイス(プレゼンテーションまたはビュー)コード
  • com.mycompany.myapp.service:アプリケーション内のサービス、つまり「ビジネスロジック」
  • com.mycompany.myapp.util:いくつかの場所で使用されるヘルパークラス

これはスタンドアロンのJavaアプリを示唆していますが、多くのフレームワークの1つを使用するWebアプリの場合は異なる可能性があります。

これらのパッケージは、プロジェクトのディレクトリ階層に対応しています。Eclipseを使用する場合、そのような階層のルートは「ソースディレクトリ」と呼ばれます。プロジェクトは、複数のソースディレクトリ、通常は「メイン」および「テスト」ソースディレクトリを定義できます。

プロジェクト内のファイルの例:

src/test/java/com/acme/foo/BarTest.java
src/main/java/com/acme/foo/Bar.java
lib/utilities_1_0.jar

そして、utilities_1_0.jar内:

com/acme/foo/BarUtils.class

BarUtils.classこれはコンパイルされたJavaクラスであるため、プラットフォームに依存しないバイトコード形式で、任意のJVMで実行できます。通常、jarファイルにはコンパイルされたクラスのみが含まれますが、ソース(.java)ファイルも含むバージョンのjarをダウンロードできる場合もあります。これは、使用しているjarファイルの元のソースコードを読み取れるようにする場合に役立ちます。

上記の例では、Bar、BarTest、およびBarUtilsはすべて同じパッケージcom.acme.fooにありますが、物理的にはハードディスク上の異なる場所にあります。

ソースディレクトリに直接存在するクラスは「デフォルトパッケージ」にあります。クラスがどの会社とアプリケーションに属しているかが明確でなく、jarファイルがあると名前の競合が発生する可能性があるため、通常はクラスをそこに保持することはお勧めできません。クラスパスに追加すると、デフォルトのパッケージに同じ名前のクラスが含まれます。

このアプリケーションをデプロイすると、通常は.classファイルにコンパイルされ、.jarにバンドルされます(これは基本的に.zipファイルといくつかのマニフェスト情報の名前です)。.jarを作成することは、アプリケーションを実行するために必要ではありませんが、アプリケーションをデプロイ/配布するときに便利です。マニフェスト情報を使用すると、.jarファイルを「実行可能」にして、ユーザーが簡単に実行できるようにすることができます。[a]を参照してください。

通常、複数のライブラリ、つまりインターネットから取得した既存の.jarファイルも使用します。非常に一般的な例は、log4j(ロギングフレームワーク)またはデータベースにアクセスするためのJDBCライブラリなどです。また、個別のjarファイル(上記の「utilities_1_0.jar」など)にデプロイされた独自のサブモジュールがある場合もあります。jarファイルにどのように分割されるかはデプロイメント/ディストリビューションの問題ですが、それらはすべてJavaソースコードのユニバーサル名前空間を共有しています。したがって、実際には、必要に応じて、すべてのjarファイルを解凍し、内容を1つの大きなディレクトリ構造に配置することができます(ただし、通常はそうしません)。

複数のライブラリを使用/構成するJavaアプリケーションを実行すると、一般に「クラスパス地獄」と呼ばれるものに遭遇します。私たちが知っているように、Javaの最大の欠点の1つ。(注:ヘルプはおそらく途中です)。コマンドラインで(つまり、Eclipseからではなく)Javaアプリケーションを実行するには、クラスパス上のすべての.jarファイルの場所を指定する必要があります。Javaの多くのフレームワーク(Maven、Spring、OSGi、Gradle)のいずれかを使用している場合、通常、この問題を軽減するための何らかの形式のサポートがあります。Webアプリケーションを構築している場合は、通常、選択したWebコンテナー(Tomcat、Jetty、Glassfish)にオブジェクトを簡単にデプロイできるように、その階層化/デプロイメントの規則に従う必要があります。

これにより、Javaでの動作に関する一般的な洞察が得られることを願っています。

[a] MyAppアプリケーションの実行可能jarを作成するには、パスにJDKが必要です。次に、コンパイル(binまたはtarget)ディレクトリで次のコマンドラインを使用します。

jar cvfe myapp.jar com.mycompany.myapp.MyApp com\mycompany\myapp

次に、コマンドラインから次のコマンドを使用して実行できます。

java -jar myapp.jar

または、jarファイルをダブルクリックします。この場合、Javaコンソールは表示されないため、これは、独自のGUIを備えたアプリケーション(Swingアプリなど)またはバックグラウンドで実行される可能性のあるアプリケーション(ソケットサーバーなど)でのみ役立ちます。

于 2009-10-02T16:53:56.253 に答える
11

Maven にはよく考え抜かれた標準のディレクトリ レイアウトがあります。Maven を直接使用していない場合でも、これはデファクト スタンダードと考えることができます。Maven の「マルチ モジュール」プロジェクトは、説明した .net の複数のアセンブリ レイアウトによく似ています。

于 2009-10-02T16:10:08.247 に答える
2

通常、関連/サブ プロジェクトを Eclipse の別のプロジェクトとして作成します。

于 2009-10-02T15:36:23.307 に答える
2

この質問に答える前に、明確にする必要があることが 2 つあります。

  1. どのソースコード リポジトリを使用しますか?
  2. Eclipse の外部で成果物を自動的にビルドするには、どのビルド システムを使用しますか?

答えはあなたの選択肢に大きく影響します。

ライブラリまたは完成した実行可能/実行可能 jar のいずれかである「1 つの Eclipse プロジェクト pr コンポーネント」を選択しました。これにより、Hudson での自動化が容易になりました。単一のプロジェクトに複数の責任がないため、CVS の使用も簡単です。

各プロジェクトには、Java ソースからの構成からテスト コードなどを分離する複数のソース フォルダーが含まれる場合があることに注意してください。これは、構造を単純化することほど重要ではありません。

于 2009-10-02T17:41:07.613 に答える