2

現在、Spring を使用して複数の Web アプリケーションを開発しています。ビルドには Maven を使用し、バージョン管理には Git を使用しています。現時点では、すべての webapps で使用されるいくつかのものの開発を分割する方法を見つけようとしています。たとえば、すべてのプロジェクトで同じヘルパー クラスがいくつかあります。問題は、クラスだけでなく、リソース ファイルやある種の親 POM も使用したい一方で、リポジトリから独立して Git の恩恵を受けることができることです。

私はビルド システムを変更することに熱心ではありませんが、Maven の真のファンではありません。特に、継承と集約の概念は、今私を制約しているものです。ひょっとして、アイビーはオプションですか?

私のセットアップの概要を簡単に説明したいと思います。

いくつかのクラス、Spring 構成ファイル、およびテンプレート、画像、スタイル シートなどのその他のリソースを含む、ある種の親プロジェクトがあります。と呼びましょうbase。これは完全な Spring Web アプリケーションではなく、デプロイされません。WARから継承baseし、WAR にパックする必要がある他のプロジェクトがいくつかあります。webapp1それらを と と呼びましょうwebapp2

basewebapp1およびwebapp2独自の Git リポジトリを持っています。

\
 |
 |- base.git       (base's repository)
 |
 |- webapp1.git    (webapp1's repository)
 | \
 |   base          (base used as a Git submodule)
 |
 |- webapp2.git    (webapp2's repository)
   \
     base          (base used as a Git submodule)

baseGit サブモジュールを使用して webapps 内から s コードを変更できるようにし、webappmvn packageのディレクトリ内を使用して各 webapp の完全に機能する WAR を構築できるようにしたいと考えています。

Maven のparentまたはmoduleこのような動的なアプローチを許可しません。moduleそのような使用方法がまったく見つかりませんでしたparent。私のニーズに合わせて使用​​するのは複雑で静的です。変更するたびにbase、新しいバージョンをリポジトリにプッシュして、Web アプリケーションが継承できるようにする必要があります。

Maven の継承を完全には理解していなかったのかもしれませんが、今はかなり迷っています。

誰かが成功して似たようなことを達成しましたか? どのビルドシステムをどのように使用しましたか?

4

2 に答える 2

0

私は自分で実用的な解決策を見つけました。

<parent>私の問題の基本的な解決策は、と呼ばれる要素の小さなサブ要素<relativePath>です。指定したディレクトリで親 POM を検索できます。そうしないと、アプリケーション内でテストする前に、常に新しいバージョンをデプロイする必要があります。

<parent>
    <groupId>com.example</groupId>
    <artifactId>base</groupId>
    <version>1.0.0</groupId>
    <relativePath>base</relativePath>
</parent>

しかし、それは出発点にすぎず、Git サブモジュールを操作できるようになりました。実際に機能させるには、次のことを行う必要がありました。

  • basewebapp と の両方、つまり内部のすべてのファイルからのクラスとリソースを使用して WAR を作成します。

    base/src/main/java
    base/src/main/resources
    base/src/main/webapp
    src/main/java
    src/main/resources
    src/main/webapp
    

    org.apache.maven.plugin:maven-war-pluginリソースは非常に簡単にカバーできますが、webapp リソースを WAR に入れるには少し設定が必要です。2 つの異なるソース フォルダーのコンパイルにはプラグインが必要なため、プラグインを使用org.codehaus.mojo:build-helper-maven-pluginして のクラスをbaseWAR に取り込む必要があります。

  • さらに、リソースに対して多くのフィルタリングを使用したため、Web アプリケーションを起動して実行するために基本ファイルをカスタマイズする必要はほとんどありません。たとえば${project.artifactId}、メインのテンプレート ファイル内で使用するので、HTML<head>は次のようになりますwebapp1

    <link href="stylesheets/base.css" rel="stylesheet" media="screen" type="text/css" />
    <link href="stylesheets/webapp1.css" rel="stylesheet" media="screen" type="text/css" />
    

本当に多くの試行錯誤が必要でしたが、ついに機能するようになりました。Maven を使用して目標を達成するには、これが最善の方法だと思います。これはBuildrのような動的ツールを使えばずっと簡単だったでしょうが、悲しいことに Buildr は Windows では (Ruby のおかげで) 遅く、ほとんどの IDE にうまく統合できません。

于 2010-03-04T12:34:23.903 に答える