2009-10-07 10 views
10

当社では、別々の戦争として数多くのモジュールを構築しています。 各クライアントは、購入したいモジュールを選択して選択することができます。 すべてのモジュールは同じセッション、セキュリティコンテキストなどを共有しているので、それらを1つの戦争にマージすることは意味があります。戦争を1つに統合するには?

このプロセスを自動化することはできますか?たとえば、web.xmlをマージし、各依存関係を計算し、.jspや.classなどのファイルをコピーする必要があります。ところで、私たちはMavenを使用していますが、この問題の解決策を見つけることはできませんでした。

答えて

7

は、あなたがかもしれdjnaとChssPly76で述べたリスクを付与(まだmerge.xml例を探して) Maven WAR pluginとのオーバーレイを使用してこれを達成できること。これには、サーブレットのマッピングを分離してURLの衝突などがないようにする必要がありますが、そのトリックを行う可能性があります。

基本的に、複数のWAR依存関係を持つモジュールを作成し、プラグインを使用してそれらを新しいものにマージします。

+0

これはほぼすべてのファイル(非clashin g)異なるウェブアプリの戦争から来る異なるweb.xmlファイルをマージする方法を知っていますか? –

1

これは明らかに可能ですが、最初は1つのWARで作業する方がよいと思います。 WARコンテンツの「ピック・アンド・ミックス」の後半は、私にとってサポートの悪夢のようなものです。

+1

クライアントがモジュールを購入しない場合、モジュールをクライアントに配布したくない(それを隠すことに頼る)。また、そのような戦争は巨大になる - それは開発目的などのために非常に実用的ではないだろう。 – Dan

0

一般的に言えば、いいえ、不可能です。 JSP名が重複している場合はどうなりますか?サーブレット名/マッピング?別のパラメータをロードしている同じコンテキストリスナー(Spring/Struts/etc ...を使用している場合は一般的です)?あなたはポイントを得る。

具体的なケースでは、状況によっては可能かもしれません。戦争の解読とJSP /クラス/ライブラリのコピーは簡単です。 web.xmlのマージは、要素の順序を維持する必要があるため、少し複雑です。手動で「マージされた」web.xmlを定義する方が簡単かもしれません。

+0

そのような競合が発見された場合、私はそのツールを諦めるほど十分に幸せだろう。 – Dan

+0

「サブ戦争勝利を含む戦争」がより意味をなさないとはいえ、ポリシーは名前の直接の衝突を処理できると考えています(オーバーレイは「最初の勝利」ポリシーを使用します)。私はこれを行い、サーブレット名やサーブレットマッピングパスの衝突がある場合は、前述のように競合を解決するポリシーがあります。必要なベースプラットフォームがある場合は非常に便利です –

-1

One-Jarで作業することができます。

http://one-jar.sourceforge.net/

それはおそらくあなたが望むすべてを行いません。

+0

ワンジャーは戦争では機能しません –

4

cargo-maven2-pluginは、uberwarモホを有することを思い起こす。私はそれを使用していないが、それは戦争をマージすることを意図していることを理解しているが、紛争を避けるように注意する必要がある。

ソースのクイックスキャンでは、merge descriptorを定義して、どのように戦争をマージするかを決定します。残念ながら、documentation siteがなくなってしまったので、私はあなたに詳細を教えてくれません。

Codehaus Jiraサイトでは、現在の状況を把握することができます。

プラグインを使用するには、このような構成のものを指定したい:

<build> 
    <plugins> 
    <plugin> 
     <groupId>org.codehaus.cargo</groupId> 
     <artifactId>cargo-maven2-plugin</artifactId> 
     <version>1.0</version> 
     <extensions>true</extensions> 
     <configuration> 
     <descriptor>merge.xml</descriptor> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 
<dependencies> 
    <dependency> 
    <groupId>project1.groupId</groupId> 
    <artifactId>project1</artifactId> 
    <type>war</type> 
    <version>1.0.0</version> 
    </dependency> 
    <dependency> 
    <groupId>project2.groupId</groupId> 
    <artifactId>project2</artifactId> 
    <type>war</type> 
    <version>1.2.0</version> 
    </dependency> 
</dependencies> 

+0

@Pascal私は同意しがちですが、リファクタリングのオプションがなければ、これは回避策を提供します –

+0

@リチャーズもちろん、それは本当です。あなたは私の+1です。私はそれが誤解される可能性があるので私の前のコメントを削除しました。 –

+2

http://cargo.codehaus.org/Merging+WAR+filesを参照してください –

1

EARは複数のものを保持するように設計されています。これはあなたの可能性ですか?


編集:まず第一に、(?1は、最終的な瓶の中に行く必要があります)重複するリソースがないことを前提とし、すべてのjarファイルに互換性があること(あなたが唯一の各ライブラリなどの1つのバージョンを持っている)ことができます。

慎重にマージする必要のあるさまざまなXMLファイルを除いて、WEB-INF /の内容を重ねてコピーするだけで済みます。これを行う最も簡単な方法はおそらく、XSLTスタイルシートを使用して、2つのXMLドキュメントを保持し、それらをマージすることができます。 JSFナビゲーションについて考えるだけで、これを正しく行うことができるようにするためには、xmlファイルごとに1つ必要です。

私のsuggetsionは、単純なリソースのコピーと手作りのXSLTスタイルシートのpr xml構成ファイルです。

+0

これは(Webサーバーの数を制限する)オプションですが、その場合でも戦争の間にセッションとセキュリティコンテキストを共有する必要があります。いくつかのアプリケーションサーバーは戦争の間にhttpセッションを共有することを許可していますが、これは標準的な機能ではありません。 – Dan

+0

私はEARが無関係の複数のWebアプリケーションを保持できるが、2つのWebアプリケーションを1つにマージしないことを理解していますか?しかし、私はEARがどのように使われているかについてもっと研究する必要があると思う。参照する任意の参照またはEARプロジェクトを推奨しますか? –

関連する問題