在不能使用约定时使用 Maven

有一个常见的误解,即 Maven 无法构建不符合某些目录结构或构建实践的项目。通常情况并非如此。但是,某些 Maven 功能或插件(尤其是第三方提供的)确实可能无法运行或无法完全运行。

本指南将帮助您在项目中设置 Maven,当高层的指令是不更改现有布局时,并详细说明您在这样做时可能会错过的一些功能。

将此作为最后的手段。默认设置的方式有充分的理由,我们强烈建议您尽可能使用它们。它鼓励一致性,并意味着您在开始一个新项目时需要担心的事情更少。除了改变布局之外,还有更多有趣的事情要做。希望在使用了这些技术中的任何一种后,您发现 Maven 证明了自己的能力,您将重新考虑重组以解决这些问题。>

使用多个源目录

当您生成单个 JAR(或其他工件)并且有多个包含您想要包含的类的源目录时,就会发生这种情况。

为什么不推荐这个?

...

我该怎么做呢?

...

有什么限制?

这种方法不应该有任何限制。Maven 原生支持多个源目录用于生成源。

从单个源目录生成多个唯一 JAR

由于许多抱怨无法将其源代码分散到多个源目录中的人似乎在抱怨不想分散任何东西,因此使用包含和排除从单个目录生成多个独特的工件。

为什么不推荐这个?

这种做法可能会令人困惑且有风险。

  • 您最终可能会构建两个包含相同类的 JAR - 这表明应该将通用功能抽象为单独的依赖项。
  • 您最终可能会在两个 JAR 之间引入您没有意识到的依赖关系,并且通常是循环依赖关系。这表明这些类在错误的 JAR 中,或者可能所有内容都应该只是一个 JAR。

我该怎么做呢?

您仍然应该坚持每个 POM 生成一个工件,但这需要有多个 POM,因此需要多个子目录。这样做的好处是,这些引入的目录不会改变现有代码的布局,并且会在您决定分开时建立未来的布局。

下面是一个在项目生成了两个 JAR 时设置它的示例:coremodule.

您可能想查看入门指南

这演示了这通常是如何在 Maven 中完成的,因为它非常相似。

您的目录将如下所示:

/
+- pom.xml
+- src/
   +- main/
      +- java/
          +- core/
             +- Core.java
          +- module/
             +- Module.java

首先,您将您pom.xml的顶层设置为不生成任何东西,而是包含我们计划创建的其他模块:

<project>
  <artifactId>my-parent</artifactId>
  <packaging>pom</packaging>
  ...
  <modules>
    <module>core</module>
    <module>module</module>
  </modules>
</project>

接下来,创建模块本身。这是core/pom.xml您应该创建的文件。子目录中的那个module将是相似的。

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>my-groupId</groupId>
    <artifactId>my-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>

  <artifactId>my-core</artifactId>

  <build>
    <sourceDirectory>../src/main/java</sourceDirectory>

    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.0.2</version>
        <configuration>
          <includes><include>**/core/**</include></includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

在此示例中,源位于父目录中,并且仅包含包中的../src/main/javaJava 文件。core

构建时的最终结果将如下所示:

/
+- pom.xml
+- src/
   +- main/
      +- java/
          +- core/
             +- Core.java
          +- module/
             +- Module.java
+- 核心/
   +- pom.xml
   +- 目标/
      +- my-core-1.0-SNAPSHOT.jar
+- 模块/
   +- pom.xml
   +- 目标/
      +- my-module-1.0-SNAPSHOT.jar

有什么限制?

没有通用的包含/排除规范,因此每个插件都需要单独配置,有些可能没有这种能力。特别是,例如,期望站点报告可能包括所有来源。

从单个 POM 生成多个 JAR

除了源目录,有时人们希望从单个 POM 生成多个 JAR。根据您的用例,Maven 可以支持这一点。

  • 如果您希望生成不同的 JAR(即,它们有自己的依赖项和元数据),Maven 不支持这一点。这通常仅在为本质上不同的事物共享源目录时才需要,因此上面的用例适用。
  • 如果您正在生成一个 JAR 是原始 JAR 的派生类(例如,只是类的一个子集,或者启用了调试的同一个 JAR),Maven 使用配置文件支持这一点。有关详细信息,请参阅配置文件简介