多模块Maven项目

时间:2015-02-12 11:16:01

标签: maven maven-assembly-plugin

我正在努力让Maven设置正常运行。我的项目布局很简单:

+
+--- libA
+--- libB
+--- projX
+--- projY

libAlibB(实际上,其中大约5个)是项目中的共享代码。 projXprojY(实际上,大约10个)是独立的应用程序,每个应用程序Main

我的要求很简单:

1)能够在Eclipse中运行projX和projY 2)使用单个命令编译projX和projY 的独立JAR(具有依赖性)每个 3)干

我目前的工作设置来自我的前任。它每个库有一个pom.xml文件,这很好,但每个项目有两个pom.xml个文件,但不是。其中一个甚至不compile,但另一个需要compile assembly:single。这两个文件几乎是彼此重复的,并且向项目添加新库需要在3-4个不同的地方进行更改。

我尝试过各种各样的事情。令人惊讶的是,在根中添加超级父pom.xml是最简单的。这照顾了项目范围的设置,如UTF-8源文件编码等等。什么都行不通的是其他一切。除非进行某些修改,否则在POM之间无法引用彼此之间,拒绝编译源文件夹时,坚持使用永远空的本地存储库或者需要绝对路径,否则我无法满足我列出的要求。尽管阅读了官方文档并在网上搜索了例子,但这仍然存在。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您需要3个pom.xml文件,一个用于父项目,一个用于每个子项目。您将有3个单独的项目。在父项目中,您将只拥有对子项目相同的jar的依赖项。例如。

父pom.xml

<?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>com.multimodule</groupId>
    <artifactId>multimodule</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>model</module>
        <module>presentation</module>
    </modules>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

child pom.xml

<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>
    <parent>
        <groupId>com.multimodule</groupId>
        <artifactId>multimodule</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>presentation</artifactId>
    <packaging>war</packaging>
    <dependencies>

    <dependency>
        <groupId>com.multimodule</groupId>
        <artifactId>model</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

另一个孩子pom.xml

<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>
  <parent>
    <groupId>com.multimodule</groupId>
    <artifactId>multimodule</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>model</artifactId>
</project>...

此示例用于Web应用程序,其中您具有单独的模型和表示层。可以通过Eclipse或Intellij Idea轻松创建多模块项目。

答案 1 :(得分:1)

通常情况下,Maven不应该太复杂。主要思想是将大部分冗余信息放在父级中(为简单起见,我们只使用一个父级),然后让子级模块引用父级。

这带来了将大部分“可配置”设置放在一个地方并限制冗余量的优势。

See this link for information regarding the different forms of inheritance in Maven

项目的结构应该是这样的:

+
     pom.xml (root)
+--- libA
     +--- src
         +---main
             +---java
             +---resources
     pom.xml
+--- libB
     +--- src
         +---main
             +---java
             +---resources
     pom.xml
+--- projX
     +--- src
         +---main
             +---java
             +---resources
     pom.xml
+--- projY
     +--- src
         +---main
             +---java
             +---resources
     pom.xml

See this link regarding standard Maven layout

您将拥有3种类型的pom.xml(每个项目/库1个)

  1. 父根项目(列出所有'模块'并提供所有可继承的设置,如依赖版本,插件版本和配置,属性等......)

  2. <?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>com.foo.bar</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>pom</packaging>
        <properties>
            <compiler.source>1.6</compiler.source>
            <compiler.target>1.6</compiler.target>
            <source.encoding>UTF-8</source.encoding>
            <resource.encoding>UTF-8</resource.encoding>
        </properties>
    
        <modules>
            <module>libA</module>
            <module>projX</module>
        </modules>
        <dependencyManagement>
            <dependencies>
                <!-- Here put all the dependencies of all your project with groupId/artifactId/version-->
            </dependencies>
        </dependencyManagement>
        <build>
            <pluginManagement>
                <!-- Here put all your plugins with groupId/artifactId/version and configuration -->
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <configuration>
                            <source>${compiler.source}</source>
                            <target>${compiler.target}</target>
                            <encoding>${source.encoding}</encoding>
                        </configuration>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-resources-plugin</artifactId>
                        <version>2.5</version>
                        <configuration>
                            <encoding>${resource.encoding}</encoding>
                        </configuration>
                    </plugin>
    
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>2.5.3</version>
                        <configuration>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                        </configuration>
                        <executions>
                            <execution>
                                <id>build-resources</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>single</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </project>
    
    1. 每个库一个pom.xml(libA,libB等等)

    2. <?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>
          <parent>
              <groupId>com.foo.bar</groupId>
              <artifactId>parent</artifactId>
              <version>0.0.1-SNAPSHOT</version>
          </parent>
          <artifactId>libA</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <packaging>jar</packaging>
          <dependencies>
              <!-- Here list all the actual dependencies but only groupId and artifactId 
                  (versions are all put in the parent) -->
              <dependency>
                  <groupId>...</groupId>
                  <artifactId>...</artifactId>
              </dependency>
          </dependencies>
      </project>
      
      1. 每个项目一个pom.xml(projX,projY等等),在这里我们还将maven-assembly添加到构建

      2. <?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>
            <parent>
                <groupId>com.foo.bar</groupId>
                <artifactId>parent</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </parent>
            <artifactId>projX</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <packaging>jar</packaging>
            <dependencies>
                <!-- Here list all the actual dependencies but only groupId and artifactId (versions are all put in the parent) -->
                <dependency>
                    <groupId>com.foo.bar</groupId>
                    <artifactId>libA</artifactId>
                </dependency>
            </dependencies>
            <build>
                <plugins>
                    <plugin> 
                        <groupId>org.apache.maven.plugins</groupId> 
                        <artifactId>maven-assembly-plugin</artifactId> 
                    </plugin> 
                </plugins>
            </build>
        </project>
        

        在这个配置中,maven-assembly被附加到阶段“package”,这意味着通过在根项目中调用mvn package,您将一次性构建所有jar和jar-with-dependencies。 / p>