1

我正在用 Maven 创建一个多模块项目的结构。父母的pom:

<?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 中,这真的正确吗?

最有趣的部分,我不知道 hos 来编译 grafic interfade 项目,(我叫 ui),最好用所有必要的(ui+logica+domini+ejb)创建一个战争或创建和耳朵litlle 对此有点困惑,我曾经与已经创建的项目一起工作。我希望你能理解我的问题,我把剩下的 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) 聚合与父 POM

Maven 中有两个概念经常混淆。聚合(又名多模块)POM 和父 POM 是无关紧要的,尽管使用一个 POM 来满足这两个目的是可以的。

多模块项目旨在描述项目之间的聚合关系,以便我们可以将多个相关项目构建为一个整体,并且所有子项目都构建在同一个reactor中。父项目旨在提供共享项目设置。它甚至可以存在于项目结构之外(例如,我可能有一个公司级的父 POM)

我个人建议使用多模块 POM 来声明项目的聚合(层次结构),并使用单独的父 POM 来声明共享设置。

IE

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

2) POM 与 EAR 的共享依赖关系

同样,这是两个独立的概念。

可以将依赖项放在父 POM 中。当你把它放在那里时,这意味着继承的项目将具有这种依赖关系。这没有对错,只要你知道你在做什么(我个人使用的是不同的方式,稍后会介绍)。

但是,是否将共享 JAR 放在 EAR 中并保留瘦 WAR,或者使用带有“完整”WAR 的普通 EAR 与您的依赖关系无关。更多的是关于EAR的包装策略。因此,仅仅因为你将项目打包为瘦战争就改变了 Maven 依赖的范围,这种做法简直就是搞乱了 Maven 依赖的整个概念。更可怕的是,在创建你的EAR的时候,你需要找出它所包含的WAR的所有依赖,并把它一一添加到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

(更新:瘦小的战争收据似乎已更新,其中一种解决方法似乎消失了。http://docs.codehaus.org/display/MAVENUSER/Solving+the+Skinny+Wars+problem?focusedCommentId=212631587#comment-212631587 是将 WAR 类型的 POM 包含为 POM 类型,这样我们就不需要在 EAR 中再次声明依赖项)


3)在父POM中使用共享依赖

正如我之前提到的,将依赖项放在父项中没有对错。但是您应该知道,这种方式实际上意味着所有继承的项目都将具有这种依赖关系,这几乎是不正确的。

例如,我有一个foo-afoo-b下的项目foo,它们都继承了foo-parent. 假设 foo-a 正在使用spring-core,而 foo-b 的整个逻辑与之无关,如果您将 spring-core 作为依赖项放在 foo-parent 中,当您查看 foo-b 时,它不必要地具有不相关的依赖项 spring-core .

正确的做法是只在父 POM 中包含依赖项(和其他设置),这些依赖项应该在所有继承的项目中共享。例如,单元测试相关的依赖关系可能是一个不错的选择。集成测试的依赖可能是另一个例子。

但是,这并不意味着我们应该在每个项目中单独声明依赖项。最大的问题之一是这种方法很难在整个项目中维护相同版本的依赖项。

为了解决这个问题,我的建议是dependencyManagement在父 POM 中使用,它声明了版本(可能还有其他设置,如范围,排除)。声明dependencyManagement 不会在继承的POM 中引入实际的依赖关系。它只是声明:“如果您声明这种依赖关系,这将是要使用的设置”。在每个继承的 POM 中,只需声明依赖项的组和工件(可能还有一些项目特定的设置),以便您可以遵循父 POM 中声明的版本。

可能有点难以理解,举个例子:

富父

<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 中,这真的正确吗?

不,您的共享依赖项应该放在耳边。在其他 pom 中,您必须使用<scope>provided</scope>.

例如,在你的耳塞中添加一个 dipendency:

<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 包中只添加一次。

最有趣的部分,我不知道 hos 来编译 grafic interfade 项目,(我叫 ui),最好用所有必要的(ui+logica+domini+ejb)创建一个战争或创建和耳朵litlle 对此有点困惑,我曾经与已经创建的项目一起工作。我希望能理解我的问题,我把剩下的 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 回答