web-dev-qa-db-ja.com

MavenはJAXB Javaコードを生成する必要がありますか、それともJavaソース管理からのコードを使用しますか?

光沢のある新しいJava=バックエンド用のビルドサーバーを一緒にマッシュアップする方法を計画しています。多くのJAXB XSDコード生成を使用しており、私はそれを世話した誰とでも白熱した議論に陥っていましたビルドサーバーは次の条件を満たしている必要があります。

  1. チェックインされたJAXB作成の構造を削除します。
  2. XSDからコードを生成します。
  3. それらのXSDから生成されたコードを使用します。

他の誰もが、チェックインしたコードを使用する方が理にかなっていると考えました(XSDから生成されたコードをチェックインします。

私の唯一の陳腐な引数は Joel test を読んでいることですが、1つのステップでビルドを行うことは、ソースコードから生成することを意味し、ソースコードはJavaソースですが、XSDは、生成されたコードをいじくり回していると、最終的にはピンチになるためです。

したがって、全員が同意する場合(同意しない場合もあります)、おそらく生成Javaファイル、それらを使用してコードを生成するか、XSDを使用して生成する必要がありますか?

7
Peter Turner

ここでも同様の状況がありますが、スキーマはそれほど頻繁には変更されないため、Javaを頻繁に再生成する必要はありません。

これに対処する方法は、ソースとしてスキーマファイルのみを使用して新しいMavenプロジェクトを作成し、Javaからコードを生成します。次に、生成されたJavaをデプロイします=ローカルのNexusリポジトリへのjarとして、ただしonlyソース管理に入るのはPOMファイル、スキーマファイル、およびその他の必要なファイル(バインディングファイルなど)です。必要なプロジェクト生成されたJava依存関係として、Nexusから取得します。

スキーマdoesが変更されると、変更がソース管理にチェックインされ、新しいjarが生成されてNexusにデプロイされます。新しいバージョンを必要とするプロジェクトは、新しいバージョン番号を使用するように依存関係を更新するだけです。

ビルドサーバーは何も生成する必要はありません。ライブラリは、すべてのチームが独自のプロジェクトの依存関係として使用できます。

この方法でこれを行う動機は、多くの場合、他の多くのチームが独立したアプリケーションに対して生成されたJavaが必要であり、スキーマが安定したら、通常stay安定していてすべてのビルド/リリースで再生成する必要はありません。

生成されたファイルをソースコード管理にチェックインしないでください(関連:P​​.SE: 生成されたコードをソース管理にチェックインするかどうか SO 生成されたコードをソース管理に保存する必要があります )jaxbによって生成されたコードは確かにこのカテゴリに分類されます。

このロジックは、オブジェクトファイルをソースコード管理または最終ビルド自体にチェックインしないのと同じ理由で当てはまります。これらは、他のいくつかのプロセスのプログラムによる出力です。

ソースコード管理の内容は、任意の時点からビルドを実行するのに十分である必要があります。このmayは、APIに与えられたコントラクトの一部として.xsdを含みます(ライブラリの.hファイルをチェックインするのと同じようにCワールド)。

ソースコード管理でソースを生成すると、それを微調整する誘惑につながり、それを再び生成することはできなくなります。他の誰かがjaxbを取得して同じものを生成することはできません。

生成されたソースもDRYの原則に反して実行されます。それをビルドするために必要な情報は.xsdとビルドステップにあります。生成されたクラスファイルの追加はanother付加価値のないこの情報のコピー。

上記の2つの点から、生成されたソースを変更すると(必要な場合もあります)は、ソースコードが定義と一致しなくなることを意味します-.xsdと一​​致しません(または、文法を処理する場合、ソースは一致しません)言語の定義に一致します)。アプリケーションが1つの言語から別の言語に移植され、.xsdからソースを生成し、生成されたコードの機能が、生成された(および微調整された)コードの機能と一致しない場合の悪夢を考慮してください。

時々、生成されたソースはvery大きくなり、ソースコード管理に投入するのに法外な費用がかかることがあります。逸話:Apache Axisはかつて私のために4メガバイトの.Javaファイルを生成しました(はい、4メガバイトのテキスト)-私は本当にそれをソースツリーに置いておきたくありませんでした(ほとんどのIDEは大規模なものに夢中になりました)。

したがって、生成されたソースをチェックインしないでください。ビルドを実行するために必要なものと、そのビルドを実行するための手順のみが必要です。

4
user40980