1

私はmavenでマルチモジュールプロジェクトのestructureを作成しています。親のポン:

<?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-   4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>cat.base.gpt</groupId>
  <artifactId>gpt</artifactId>
  <version>0.0.1</version> <!-- application version -->
  <packaging>pom</packaging>
  <name>gpt</name>

  <parent>
        <groupId>cat.base.baseframe</groupId>
        <artifactId>projecte-pare-baseframe</artifactId>
        <version>0.0.11.a</version>
  </parent>

  <modules>
    <module>gpt.domini</module>
    <module>gpt.ui</module>
    <module>gpt.logica</module>
    <module>gpt.ejb</module>
    <module>gpt.ear</module>
  </modules>
  <dependencies>
  <!-- dependencies pel testeig TDD -->
          <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.7</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-core</artifactId>
            <version>1.9.5-rc1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.kubek2k</groupId>
            <artifactId>springockito</artifactId>
            <version>1.0.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.4</version>
            <scope>provided</scope>
        </dependency>
    <!--  A més, en el cas de provatures UI, s'ha d'afegir la següent dependència:-->
        <dependency>
            <groupId>cat.base.baseframe</groupId>
            <artifactId>baseframe-test-swf</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <scope>test</scope>
        </dependency>
       </dependencies>
  </project>

わかりました、最初の質問です。すべての依存関係を paren の pom に置きましたが、これは本当に正しいですか?

そして最も興味深いのは、グラフィック インターフェード プロジェクトをコンパイルする方法がわかりません (私は ui と呼んでいます)。それについては少し混乱していますが、私はすでに estructure が作成されたプロジェクトを使用しています。私の質問を理解していただければ幸いです。pom の残りの部分を監視します。タイ。

pom's gpt.domini. 

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>gpt</artifactId>
    <groupId>cat.base.gpt</groupId>
    <version>0.0.1</version>
  </parent>

  <groupId>cat.base.gpt.domini</groupId>
  <artifactId>gpt.domini</artifactId>
  <packaging>jar</packaging>

  <name>gpt.domini</name>
  <description>Definició del model de dades i de la façana del servei</description>
  </project>

pom の gpt.ear

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>gpt</artifactId>
    <groupId>cat.base.gpt</groupId>
    <version>0.0.1</version>
  </parent>

  <groupId>cat.base.gtp.ear</groupId>
  <artifactId>gpt.ear</artifactId>
  <name>gpt.ear</name>


  <packaging>ear</packaging>
  <description>Paquet de l'aplicació J2EE</description>

  <dependencies>
        <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.domini</artifactId>
            <version>${project.parent.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.ejb</artifactId>
            <version>${project.parent.version}</version>
            <type>ejb</type>
        </dependency>
        <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.logica</artifactId>
            <version>${project.parent.version}</version>
            <type>jar</type>
        </dependency>

  </dependencies>
</project>

pom の gpt.logica

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>gpt</artifactId>
    <groupId>cat.base.gpt</groupId>
    <version>0.0.1</version>
  </parent>


  <groupId>cat.base.gtp.logica</groupId>
  <artifactId>gpt.logica</artifactId>
  <name>climbing.logica</name>
  <packaging>jar</packaging>
  <description>Implementació del servei</description>


  <dependencies>
  <!-- de moment nomes el domini -->
    <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.domini</artifactId>
            <version>${project.parent.version}</version>
            <scope>provided</scope>
        </dependency>
  </dependencies>
</project>

pom の gpt.ejb

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <artifactId>gpt</artifactId>
    <groupId>cat.base.gpt</groupId>
    <version>0.0.1</version>
  </parent>

  <groupId>cat.base.gtp.ejb</groupId>
  <artifactId>gpt.ejb</artifactId>
  <name>gpt.ejb</name>
  <packaging>ejb</packaging>
  <description>Publicació d'un servei en forma EJB</description>


  <dependencies>
        <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.domini</artifactId>
            <version>${project.parent.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.logica</artifactId>
            <version>${project.parent.version}</version>
        </dependency>
        <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.logica</artifactId>
            <version>${project.parent.version}</version>
            <classifier>tests</classifier>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.ejb</groupId>
            <artifactId>ejb-api</artifactId>
            <version>3.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>jboss</groupId>
            <artifactId>jboss-annotations-ejb3</artifactId>
            <version>4.2.2.GA</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>2.5.6</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.jboss.client</groupId>
            <artifactId>jbossall-client</artifactId>
            <version>4.2.3.GA</version>
            <scope>test</scope>
        </dependency>
  </dependencies>
</project>

pom の gpt.logica

   <?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>gpt</artifactId>
    <groupId>cat.base.gpt</groupId>
    <version>0.0.1</version>
  </parent>


  <groupId>cat.base.gtp.logica</groupId>
  <artifactId>gpt.logica</artifactId>
  <name>climbing.logica</name>
  <packaging>jar</packaging>
  <description>Implementació del servei</description>


  <dependencies>
  <!-- de moment nomes el domini -->
    <dependency>
            <groupId>${project.parent.groupId}</groupId>
            <artifactId>${project.parent.artifactId}.domini</artifactId>
            <version>${project.parent.version}</version>
            <scope>provided</scope>
        </dependency>
  </dependencies>
</project>

pom の gpt.ui

ここで、spring-rich.faces のすべての依存関係..または親の pom でより良いですか? 戦争のようなパッケージ?? またはモジュール耳の内側?? タイ。

4

3 に答える 3

3

すでに受け入れられている回答がありますが、質問者と受け入れられた回答の両方が Maven のさまざまな概念で台無しになっているように思われるため、より多くの情報を提供する価値があると思います。


1) アグリゲーション vs 親 POM

Maven にはよく混同される 2 つの概念があります。集約 (別名マルチモジュール) POM と親 POM は無関係ですが、1 つの POM を使用して両方の目的を果たすことは問題ありません。

マルチモジュールプロジェクトは、プロジェクト間の集約関係を記述することを目的としているため、複数の関連プロジェクトを全体として構築でき、すべてのサブプロジェクトは同じリアクターで構築されます。親プロジェクトは、共有プロジェクト設定を提供することを目的としています。プロジェクト構造の外に存在することさえあります(たとえば、会社ごとの親POMがある場合があります)

個人的には、プロジェクトの集約 (階層) を宣言するためだけにマルチモジュール POM を使用し、共有設定を宣言するために別の親 POM を使用することをお勧めします。

すなわち

my-proj    // aggregation only
    + my-proj-parent    // parent POM
    + my-proj-main
    + my-proj-web
    + my-proj-ear

2) POM と EAR の共有依存関係

繰り返しますが、これらは 2 つの別個の概念です。

依存関係を親 POM に入れても問題ありません。そこに置くと、継承されたプロジェクトがそのような依存関係を持つことになります。あなたが何をしているかを知っている限り、これに善悪はありません (個人的には別の方法を使用しています。後で説明します)。

ただし、共有 JAR を EAR に配置してスキニー WAR を保持するか、「完全な」WAR を持つプレーンな EAR を使用するかは、依存関係とは関係ありません。それは、EAR のパッケージ化戦略に関するものです。したがって、プロジェクトをスキニー戦争としてパッケージ化するという理由だけで Maven 依存関係の範囲を変更すると、そのようなアプローチは単に Maven 依存関係の概念全体を台無しにします。さらに恐ろしいのは、EAR を作成するときに、含まれている WAR のすべての依存関係を見つけて、それを 1 つずつ EAR POM に追加する必要があることです。これは最適なソリューションではないことは間違いありません。

残念なことに、現在の Maven EAR プラグインには、細い戦争パッケージング戦略を宣言する方法がまだありません。ただし、Maven の依存関係のスコープをいじることなく、これを可能にする回避策がいくつかあります。 http://maven.apache.org/plugins/maven-ear-plugin/examples/skinny-wars.html http://maven.apache.org/plugins/maven-war-plugin/examples/skinny-wars.html

(更新: スキニー ウォー レシピが更新されたようで、回避策の 1 つがなくなったよう です 。 WAR タイプの POM を POM タイプとして含めるため、EAR で依存関係を再度宣言する必要がありません)


3) 親 POM での共有依存関係の使用

先に述べたように、依存関係を親に置くことに善悪はありません。ただし、そのような方法は、実際には継承されたすべてのプロジェクトがそのような依存関係を持つことを意味することを知っておく必要がありますが、これはほとんど正しくありません。

たとえば、 の下にfoo-afoo-bプロジェクトがfooあり、どちらも を継承していfoo-parentます。foo-a が使用してspring-coreいるのに対し、foo-b のロジック全体はそれとは何の関係もないと仮定します。foo-parent に依存関係として spring-core を配置すると、foo-b を見ると、無関係な依存関係を不必要に持っています spring-core .

適切な方法は、継承されたすべてのプロジェクトで共有する必要がある親 POM に依存関係 (およびその他の設定) のみを含めることです。たとえば、単体テストに関連する依存関係が適切な選択になる場合があります。統合テストの依存関係は別の例かもしれません。

ただし、各プロジェクトで個別に依存関係を宣言する必要があるという意味ではありません。最大の問題の 1 つは、このようなアプローチでは、プロジェクト全体で同じバージョンの依存関係を維持することが難しくなることです。

このような問題を解決するためにdependencyManagement、バージョンを宣言する親 POM を使用することをお勧めします (スコープや除外などの他の設定も可能です)。dependencyManagement を宣言しても、継承された POM に実際の依存関係が導入されるわけではありません。「そのような依存関係を宣言すると、これが使用する設定になります」と宣言するだけです。継承された各 POM で、依存関係のグループとアーティファクト (および場合によってはプロジェクト固有の設定) を宣言するだけで、親 POM で宣言されたバージョンに従うことができます。

少しわかりにくいかもしれませんが、例を次に示します。

foo-親

<project>
  <dependencyManagement>  // dependency management doesn't bring actual dependency
    <dependencies>
      <dependency>
         <groupId>org.springframework<groupId>
         <artifactId>spring-core<artifactId>
         <version>3.1.0.RELEASE</version>
      </dependency>
      <dependency>
         <groupId>org.hibernate<groupId>
         <artifactId>hibernate-core<artifactId>
         <version>3.6</version>
      </dependency>
    </dependencies>
  <dependencyManagement>

  <dependencies>    // actual shared dependency
    <dependency>
       <groupId>junit<groupId>
       <artifactId>junit<artifactId>
       <version>4.11</version>
       <scope>test</scope>
    </dependency>
  </dependencies>
  .....
<project>

フーア

<project>
  <dependencies>
    <dependency> // note: no version declared
      <groupId>org.springframework<groupId>
      <artifactId>spring-core<artifactId>
    </dependency>

    // junit dependency is inherited
  <dependencies>
<project>
于 2013-07-17T02:06:55.653 に答える
2

わかりました、最初の質問です。すべての依存関係を paren の pom に置きましたが、これは本当に正しいですか?

いいえ、共有依存関係は ear pom に配置する必要があります。他の pom では、 を使用して共有依存関係を参照する必要があります<scope>provided</scope>

たとえば、イヤーポンにディペンデンシーを追加します。

<dependency>
    <groupId>somegroup</groupId>
    <artifactId>someartifact</artifactId>
    <version>1.0</version>
</dependency>

たとえば、logica および ui モジュール pom では、次の行を追加します。

<dependency>
    <groupId>somegroup</groupId>
    <artifactId>someartifact</artifactId>
    <version>1.0</version>
    <scope>provided</scope>
</dependency>

このようにして、依存アーティファクトは ear パッケージに 1 回だけ追加されます。

そして最も興味深いのは、グラフィック インターフェード プロジェクトをコンパイルする方法がわかりません (私は ui と呼んでいます)。それについて少し混乱していますが、私はすでに作成された構造体のプロジェクトを使用しています。私は私の質問を理解してくれることを願っています.pomの残りの部分を監視します. タイ。

正しく理解しているかどうかはわかりません。EAR は、複数の war および/または ejb モジュールを持つことができるプロジェクトに適しています。あなたの場合、モジュール化を完全に取り除き、単一の war パッケージを使用できます。

于 2013-07-15T08:38:47.450 に答える
0

最後に、これは私の耳のポンです。

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>gpt</artifactId>
    <groupId>cat.base.gpt</groupId>
    <version>0.0.1</version>
  </parent>

  <groupId>cat.base.gpt.ear</groupId>
  <artifactId>gpt.ear</artifactId>
  <name>gpt.ear</name>


  <packaging>ear</packaging>
  <description>Paquet de l'aplicació J2EE</description>

  <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>gpt.domini</artifactId>
            <version>${project.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>gpt.ejb</artifactId>
            <version>${project.version}</version>
            <type>ejb</type>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>gpt.logica</artifactId>
            <version>${project.version}</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>gpt.ui</artifactId>
            <version>${project.version}</version>
            <type>war</type>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <configuration>
                    <description>GPT</description>
                    <displayName>Gestió posicions tributarias</displayName>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <version>1.4</version>
                    <generateApplicationXml>true</generateApplicationXml>
                    <modules>
                        <ejbModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>${project.parent.artifactId}.ejb</artifactId>
                            <bundleFileName>${project.parent.artifactId}-ejb.jar</bundleFileName>
                        </ejbModule>
                        <jarModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>gpt.logica</artifactId>
                            <includeInApplicationXml>true</includeInApplicationXml>
                        </jarModule>                        

                        <webModule>
                            <groupId>${project.groupId}</groupId>
                            <artifactId>gpt.ui</artifactId>
                            <contextRoot>/gpt</contextRoot>
                        </webModule>
                    </modules>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <configuration>
                    <excludeScope>runtime</excludeScope>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
于 2013-07-16T09:00:55.640 に答える