Maven 多模块项目的结构化。如何包装模块?

Maven 多模块项目的结构化。如何包装模块?,maven,jakarta-ee,Maven,Jakarta Ee,我正在用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 ht

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

最有趣的是,我不知道如何编译grafic interfade项目,我称之为ui,最好创建一个war或使用所有必要的ui+logica+domini+ejb创建和ear,我对此有点困惑,我习惯于使用已经创建的结构化项目。我希望你能理解我的问题,我把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>
波姆耳

<?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中更好? 像战争一样包装??还是在de模块耳内??泰

好的,第一个问题,我把所有依赖项都放在paren的pom中,是这样的吗 真的对吗

不,您的共享依赖项应该放在ear pom中。在其他POM中,您必须使用提供的引用共享依赖项

例如,在您的耳朵pom中添加双亲:

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

最有趣的是,我不知道如何编译grafic 交互项目,我称之为ui,最好创建一场战争或创建 ear具备所有必要的ui+logica+domini+ejb,我有点 对此感到困惑的是,我过去常常处理已经结构化的项目 创建。我希望不理解我的问题,我把pom的其余部分放到 留心。泰

我不知道我是否理解正确。EAR更适合具有多个war和/或ejb模块的项目。在您的情况下,您可以完全摆脱模块化,使用单个war包

好的,第一个问题,我把所有依赖项都放在paren的pom中,是这样的吗 真的对吗

不,您的共享依赖项应该放在ear pom中。在其他POM中,您必须使用提供的引用共享依赖项

例如,在您的耳朵pom中添加双亲:

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

最有趣的是,我不知道如何编译grafic 交互项目,我称之为ui,最好创建一场战争或创建 ear具备所有必要的ui+logica+domini+ejb,我有点 对此感到困惑的是,我过去常常处理已经结构化的项目 创建。我希望不理解我的问题,我把pom的其余部分放到 留心。泰


我不知道我是否理解正确。EAR更适合具有多个war和/或ejb模块的项目。在您的情况下,您可以完全摆脱模块化,使用单个war包。

最后,这是my ear的pom

<?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>

最后,这是我耳朵的pom

<?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>

虽然已经有了一个公认的答案,但我认为值得向你们提供更多信息,因为在我看来,提问者和公认的答案在Maven中都被不同的概念搞乱了

1聚合与父POM Maven中有两个概念经常混淆。聚合(也称为多模块POM)和父POM是不相关的,尽管可以使用一个POM同时用于这两个目的

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

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

i、 e

2 POM与EAR的共享依赖关系 同样,这是两个独立的概念

在父POM中放置依赖项是可以的。当您把它放在那里时,这意味着继承的项目将具有这种依赖性。这是没有对错的,只要你们知道你们个人在做什么,我用的是不同的方式,后面会描述

然而,无论是把共享的罐子放在耳朵里,保持瘦的战争,还是用一个普通的耳朵来进行一场全面的战争,都与你的依赖性无关。更多的是关于EAR的包装策略。因此,仅仅因为要将项目打包为skinny war,就改变Maven依赖性的范围,这样的方法只会搞乱Maven依赖性的整个概念。更可怕的是,在创建EAR时,您需要找出其包含的WAR的所有依赖项,并将其逐个添加到EAR POM中,这无疑不是最佳解决方案

遗憾的是,目前的Maven EAR插件仍然没有办法 宣布一个瘦的战争包装策略。但是,有一些变通方法允许您这样做,而不会影响Maven依赖范围

更新:skinny war receipe似乎已更新,其中一个解决方案似乎已消失。这是将WAR类型POM包含为POM类型,这样我们就不需要在EAR中再次声明依赖项

3在父POM中使用共享依赖项 正如我前面提到的,将依赖项放在父项中是没有对错的。然而,您应该知道,这种方式实际上意味着所有继承的项目都将具有这种依赖性,这在很大程度上是不正确的

例如,我在foo下有一个foo-a和foo-b项目,这两个项目都继承了foo父项目。假设foo-a使用的是spring-core,而foo-b的整个逻辑与之无关,如果您将spring-core作为foo父级中的依赖项,那么当您查看foo-b时,它不必具有与spring-core无关的依赖项

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

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

为了解决这个问题,我的建议是在父POM中使用dependencyManagement,它声明版本,可能还有其他设置,比如scope、excludes。声明DependencyManager不会在继承的POM中引入实际的依赖项。它只是声明:如果您声明这样的依赖关系,这将是要使用的设置。在每个继承的POM中,只需声明依赖项的组和工件以及一些特定于项目的设置,这样您就可以遵循父POM中声明的版本

可能有点难以理解,下面是一个例子:

富父母

福阿


虽然已经有了一个公认的答案,但我认为值得向你们提供更多信息,因为在我看来,提问者和公认的答案在Maven中都被不同的概念搞乱了

1聚合与父POM Maven中有两个概念经常混淆。聚合(也称为多模块POM)和父POM是不相关的,尽管可以使用一个POM同时用于这两个目的

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

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

i、 e

2 POM与EAR的共享依赖关系 同样,这是两个独立的概念

在父POM中放置依赖项是可以的。当您把它放在那里时,这意味着继承的项目将具有这种依赖性。这是没有对错的,只要你们知道你们个人在做什么,我用的是不同的方式,后面会描述

然而,无论是把共享的罐子放在耳朵里,保持瘦的战争,还是用一个普通的耳朵来进行一场全面的战争,都与你的依赖性无关。更多的是关于EAR的包装策略。因此,仅仅因为要将项目打包为skinny war,就改变Maven依赖性的范围,这样的方法只会搞乱Maven依赖性的整个概念。更可怕的是,在创建EAR时,您需要找出其包含的WAR的所有依赖项,并将其逐个添加到EAR POM中,这无疑不是最佳解决方案

遗憾的是,目前的Maven-EAR插件仍然没有办法宣布一个精简的战争包装策略。但是,有一些变通方法允许您这样做,而不会影响Maven依赖范围

更新:skinny war receipe似乎已更新,其中一个解决方案似乎已消失。这是将WAR类型POM包含为POM类型,这样我们就不需要在EAR中再次声明依赖项

3在父POM中使用共享依赖项 正如我前面提到的,将依赖项放在父项中是没有对错的。然而,您应该知道,这种方式实际上意味着所有继承的项目都将具有这种依赖性,这在很大程度上是不正确的

例如,我在foo下有一个foo-a和foo-b项目,这两个项目都继承了foo父项目。假设foo-a正在使用springcore,而foo-b的整个逻辑与之无关,如果您将springcore作为依赖项放在foo父级中,当您查看foo-b时,它不必要地具有unrela ted依赖于spring核心

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

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

为了解决这个问题,我的建议是在父POM中使用dependencyManagement,它声明版本,可能还有其他设置,比如scope、excludes。声明DependencyManager不会在继承的POM中引入实际的依赖项。它只是声明:如果您声明这样的依赖关系,这将是要使用的设置。在每个继承的POM中,只需声明依赖项的组和工件以及一些特定于项目的设置,这样您就可以遵循父POM中声明的版本

可能有点难以理解,下面是一个例子:

富父母

福阿


谢谢你回答阿尔夫。这很难理解,但我试着告诉你们一些事情。我相信ear中的共享依赖项,虽然对大多数容器都有效,但不是JEE标准。标准的方法是简单地声明依赖项,反过来它将创建与依赖项的战争。仅当容器应提供JAR时,才应使用提供的范围,例如那些JEE API JAR。而且,parent中的共享依赖项和EAR中的共享JAR只是两个不相关的概念,似乎你把它们混在了一起。@AdrianShum,所以最好将所有依赖项放在parent的pom中,并在模块中放置提供范围的依赖项。前提是它对我有好处,因为jboss容器提供了应用程序。@AdrianShum:我不这么认为。根据JavaEE规范,.ear文件可能包含一个目录,其中包含打包在JAR文件中的库。.ear文件的部署描述符的library directory元素包含此目录的名称。如果未指定库目录元素,或者.ear文件不包含部署描述符,则使用名为lib的目录。此目录中扩展名为.jar的所有文件都必须可用于EAR文件中打包的所有组件,包括应用程序客户端。@AdrianShum:此外,为了避免重复,您只能使用提供的作用域,否则您在war和EAR中都有相同的jar。此外,如果您将依赖项放在父pom中,它们将不会添加到ear package.ty中以回答Alf。这很难理解,但我试着告诉你们一些事情。我相信ear中的共享依赖项,虽然对大多数容器都有效,但不是JEE标准。标准的方法是简单地声明依赖项,反过来它将创建与依赖项的战争。仅当容器应提供JAR时,才应使用提供的范围,例如那些JEE API JAR。而且,parent中的共享依赖项和EAR中的共享JAR只是两个不相关的概念,似乎你把它们混在了一起。@AdrianShum,所以最好将所有依赖项放在parent的pom中,并在模块中放置提供范围的依赖项。前提是它对我有好处,因为jboss容器提供了应用程序。@AdrianShum:我不这么认为。根据JavaEE规范,.ear文件可能包含一个目录,其中包含打包在JAR文件中的库。.ear文件的部署描述符的library directory元素包含此目录的名称。如果未指定库目录元素,或者.ear文件不包含部署描述符,则使用名为lib的目录。此目录中扩展名为.jar的所有文件都必须可用于EAR文件中打包的所有组件,包括应用程序客户端。@AdrianShum:此外,为了避免重复,您只能使用提供的作用域,否则您在war和EAR中都有相同的jar。此外,如果将依赖项放在父pom中,它们将不会添加到ear包中。