Maven - POM设计用于具有独特libs模块的更多模块

时间:2017-11-11 16:30:37

标签: maven pom.xml

我想为Java标准项目配置Maven POM,我想设计以下模块架构:

  • Parent项目:此项目构建所有子模块。
  • JAR项目:此项目会创建最终的JAR文件。
  • Core项目:这是一个主要项目,但会有类似的项目。
  • Libs项目:这是一个项目,其中包含将由各种主要模块(例如Core)使用的所有库依赖项。

当我引用我在Project-Libs的依赖项中定义的库时,我有一个编译Core模块的问题。 (在以下特定示例中,当我在Core类测试中导入JUnit库时出现编译错误。)

我配置的Maven POM如下:

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>

<groupId>com.stackoverflow</groupId>
<artifactId>Project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>

<modules>
    <module>../Project-Libs</module>
    <module>../Project-Core</module>
    <module>../Project-JAR</module>
</modules>

Project-Libs 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
    <groupId>com.stackoverflow</groupId>
    <artifactId>Project</artifactId>
    <version>1.0.0</version>
    <relativePath>../Project</relativePath>
</parent>

<artifactId>Project-Libs</artifactId>
<packaging>pom</packaging>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Project-Core 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.stackoverflow</groupId>
    <artifactId>Project</artifactId>
    <version>1.0.0</version>
    <relativePath>../Project</relativePath>
</parent>

<artifactId>Project-Core</artifactId>
<packaging>jar</packaging>
<name>Project-Core</name>

<dependencies>
    <dependency>
        <groupId>com.stackoverflow</groupId>
        <artifactId>Project-Libs</artifactId>
        <version>1.0.0</version>
        <type>pom</type>
    </dependency>
</dependencies>

Project-JAR 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.stackoverflow</groupId>
    <artifactId>Project</artifactId>
    <version>1.0.0</version>
    <relativePath>../Project</relativePath>
</parent>

<artifactId>Project-JAR</artifactId>
<packaging>jar</packaging>
<name>Project-JAR</name>

<dependencies>

    <dependency>
        <groupId>com.stackoverflow</groupId>
        <artifactId>Project-Core</artifactId>
        <version>1.0.0</version>
        <type>jar</type>
    </dependency>

    <dependency>
        <groupId>com.stackoverflow</groupId>
        <artifactId>Project-Libs</artifactId>
        <version>1.0.0</version>
        <type>pom</type>
    </dependency>
</dependencies>


<build>
    <plugins>

        <!-- download source code in Eclipse, best practice -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-eclipse-plugin</artifactId>
            <version>2.9</version>
            <configuration>
                <downloadSources>true</downloadSources>
                <downloadJavadocs>false</downloadJavadocs>
            </configuration>
        </plugin>

        <!-- Set a JDK compiler level -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <compilerArgument>-Xlint:all</compilerArgument>
                <showWarnings>true</showWarnings>
                <showDeprecation>true</showDeprecation>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <defaultLibBundleDir>lib</defaultLibBundleDir>

                <modules>
                    <module>
                        <groupId>com.stackoverflow</groupId>
                        <artifactId>Project-Libs</artifactId>
                    </module>
                    <module>
                        <groupId>com.stackoverflow</groupId>
                        <artifactId>Project-Core</artifactId>
                    </module>
                </modules>

                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                    </manifest>
                </archive>

            </configuration>
        </plugin>
    </plugins>
</build>

拜托,你能帮我解决和犯错吗?非常感谢。

2 个答案:

答案 0 :(得分:0)

我放弃了这个Project-Libs项目,因为显然只是为了保存其他项目的<dependency>设置。这也可以在父Project POM中完成。通过将这些依赖关系外包给一个单独的POM,您会错过父POM为您设计的内容:传递POM设置,例如: <dependencies>,儿童项目。这样额外的Project-Libs项目会不必要地使用<dependencies>设置污染所有其他POM。

我设计了父Project POM,如:

  ...

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
      </dependency>
    </dependencies>

    ...
  <dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>

    ...
  </dependencies>

  ...

从某个角度来看,从逻辑上讲,您Project-Libs中声明的依赖关系并非由您的其他项目找到。 Project-Libs不是父母,而是对他们的依赖。 Maven很好地处理了传递依赖,但我知道它也试图尽可能高效。现在,由于类型<packaging>pom的项目不包含任何要编译,测试,打包,安装和部署的代码,因此可能会忽略此类项目中的依赖关系,无论是否存在任何过渡性由兄弟项目介绍。

您还可以为Project父母提供BOM (bill of material) POM作为父母。

答案 1 :(得分:0)

您应该在父pom.xml文件中使用DependecyManagement