2

Ant ビルドから Maven 3 ビルドにアプリケーションを移行しています。このアプリはによって構成されています:

  • ビルドするすべてのモジュールを指定する親プロジェクト
  • jaxb を使用してクラスを生成し、それらを使用して jar を構築するプロジェクト
  • EJB プロジェクトをビルドするプロジェクト
  • 戦争モジュールを構築する 3 つのプロジェクト
  • 耳を作る 1 つのプロジェクト

これは私の親 pom からの抜粋です:

<groupId>com.test</groupId>
<artifactId>P</artifactId>
<packaging>pom</packaging>
<version>04.01.00</version>

<modules>
    <module>../PValidationJaxb</module> <-- jar
    <module>../PValidation</module> <-- ejb
    <module>../PImport</module> <-- war
    <module>../PTerminal</module> <-- war
    <module>../PWebService</module> <-- war
    <module>../PEAR</module> <-- ear
</modules>

私は同じ起源を持っていると思われるいくつかの問題を抱えています。おそらく、私が理解できない依存関係管理の問題です:

  • 生成されるモジュールは、親 pom からビルドするか、単一のモジュールからビルドするかによって異なります。通常、PImport のみをビルドすると、生成された war は ant ビルドの場合と同様になり、親 pom からビルドすると、war は 20MB かかり、他のモジュールからの多くの依存関係が追加されました。どちらの戦争も順調に進んでいます。

  • 私のプロジェクト PWebService には、ビルド中に実行される単体テストがあります。依存関係として cglib を持つ mock-ejb を使用しています。これには ClassNotFound の問題があり、それを除外して cglib-nodep への依存関係を追加する必要がありました (最後の pom 抽出を参照)。次に、このモジュールのみをビルドすると、うまく機能します。しかし、親プロジェクトからビルドすると、他のモジュールの他の依存関係にも cglib への暗黙の依存関係があるため、失敗します。すべてのモジュールpomでそれを除外し、依存関係をどこでもcglib-nodepに追加して実行する必要がありました。

私の構成で何か重要なことを見逃していますか?

PValidation pom 抽出物:

xdocletによって生成されたインターフェースを備えたejbとクライアントjarを含むjarを作成しています。

<parent>
    <groupId>com.test</groupId>
    <artifactId>P</artifactId>
    <version>04.01.00</version>
</parent>
<artifactId>P-validation</artifactId>
<packaging>ejb</packaging>

<dependencies>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>P-jaxb</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>3.2.5.ga</version>
        <exclusions>
            <exclusion>
                <groupId>cglib</groupId>
                <artifactId>cglib</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>2.2.2</version>
    </dependency>
    ...
    [other libs]
    ...
</dependencies>

<build>
    ...
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ejb-plugin</artifactId>
            <configuration>
                <ejbVersion>2.0</ejbVersion>
                <generateClient>true</generateClient>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>xdoclet-maven-plugin</artifactId>
            ...

PImport pom 抽出:

これは、Jaxb で生成された jar と ejb クライアント jar の両方に依存します。

<parent>
    <groupId>com.test</groupId>
    <artifactId>P</artifactId>
    <version>04.01.00</version>
</parent>
<artifactId>P-import</artifactId>
<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>P-jaxb</artifactId>
        <version>${project.version}</version>
    </dependency>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>P-validation</artifactId>
        <version>${project.version}</version>
        <type>ejb-client</type>
    </dependency>
    ...
    [other libs]
    ...
</dependencies>

PWebService pom 抽出 :

<parent>
    <groupId>com.test</groupId>
    <artifactId>P</artifactId>
    <version>04.01.00</version>
</parent>

<artifactId>P-webservice</artifactId>
<packaging>war</packaging>

<properties>
    <jersey.version>1.14</jersey.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-servlet</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>com.rte.etso</groupId>
        <artifactId>etso-validation</artifactId>
        <version>${project.version}</version>
        <type>ejb-client</type>
    </dependency>
    ...
    [other libs]
    ...
    <dependency>
        <groupId>org.mockejb</groupId>
        <artifactId>mockejb</artifactId>
        <version>0.6-beta2</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>cglib</groupId>
                <artifactId>cglib-full</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib-nodep</artifactId>
        <version>2.2.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

どうもありがとう

構成の変更後の解決策:

プロジェクトを既にマベナイズしたとき、フォルダーレイアウトの規則を尊重しませんでしたが、ソースを見つける場所でポンポンで宣言されていたので、うまくいくと思いました。とにかく、推奨構造に合わせて変更しました。

単一のモジュールをビルドするために、そのレベルで mvn clean install を直接実行していました。このようにして、私は別の結果を得ました (実際、これは私が望んでいたものです)。

とにかく、私の問題は解決しました。生成されたクライアントを他のモジュールに含めるだけで、実装に必要なものをすべて必要としないため、PVa​​lidation プロジェクトのすべての依存関係を提供されたとおりに置きます。

しかし、同じ構成で異なる結果が得られた理由はまだわかりません。

4

1 に答える 1

3

最初に重要なことは、モジュール構造に適したプロジェクトの構造を作成する必要があることです。つまり、次のフォルダー構造を持つ必要があります。

+-- parent
      +-- PValidationJaxb
      +-- PValidation
      +-- PImport
      +-- PTerminal
      +-- PWebService
      +-- PEAR

これは、親フォルダーにモジュール定義を含む pom.xml があることを意味します。上記の推奨事項に従えば、モジュール リストを次のように簡略化できます。

<modules>
    <module>PValidationJaxb</module> <-- jar
    <module>PValidation</module> <-- ejb
    <module>PImport</module> <-- war
    <module>PTerminal</module> <-- war
    <module>PWebService</module> <-- war
    <module>PEAR</module> <-- ear
</modules>

さらに、Maven でのベスト プラクティスは、PValidationJaxbの代わりにpvalidationjaxbを意味する小文字のアーティファクトを使用することです。

もう 1 つの重要なことは、 Maven の規則に従わないバージョンです。さらに、あなたのバージョンは Maven の観点からはリリースであり、これで開発を行っている場合ではありません。Maven では、 1.0.0-SNAPSHOT のような目的で、いわゆるSNAPSHOTを使用する必要があります。

Maven のフォルダー レイアウトの推奨事項に従っていることを願っています。これは、本番コード (結果の jar にパッケージ化されます) をsrc/main/javaに配置し、テスト コードをsrc/test/javaに配置することを示しています。

依存関係が異なると説明した問題は、おかしく聞こえます。問題は、単一のモジュールをどのように構築しようとしたかです。これは通常、親の場所から次を使用して実現できます。

mvn -pl module clean package

単体テストの問題は、依存関係の欠落などのように聞こえますが、単体テストを実行しようとした方法と maven-surefire-plugin を構成した方法についての質問は次のとおりです。または、統合テストはありますか? これは、poms に Maven プラグインの構成が表示されないため、推測にすぎません。

于 2012-11-29T11:01:50.733 に答える