让maven构建更快的方法?

新手上路,请多包涵

我有一个多模块 java 项目。 Maven 大约需要 40 秒来构建它。我也尝试过使用多线程构建的 Maven,方法是指定 -T 和 -C args 来表示没有要使用的线程和内核。但是我没有看到我的构建的挂墙时间有任何显着改善。

我正在使用 maven 3.2.3,有时我需要非常频繁地构建我的项目。

我知道干净的目标需要很多时间,但我不能忽略它。

请提出建议….

编辑:

注意:在我的例子中,clean 不会花费太多时间。它在 1 秒内完成。安装正在占用剩余时间。

原文由 Shubham Chaurasia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

注意:首先是 AFAIK,除了此处的所有答案外,maven 中没有其他可用的内置选项。


使用多线程运行 maven build 对我来说可以加快构建速度。例如 :

 mvn clean install -T100

其中 -T 用于根据您的硬件指定您想要的线程数。

以下是来自 wiki 的变体

Maven 3.x 具有执行并行构建的能力。命令如下:

  • mvn -T 4 clean install 使用 4 个线程构建
  • mvn -T 1C clean install 每个 cpu 核心 1 个线程
  • mvn -T 1.5C clean install 每个 cpu 内核 1.5 个线程

如何评估执行( 请参阅 Maven 3 中的并行构建)?

在此处输入图像描述

图中的每个节点代表多模块构建中的一个模块,“级别”仅表示到内部反应器依赖关系图中第一个模块的距离。 Maven 根据声明的多模块构建的模块间依赖关系计算此图。请注意,父 maven 项目也是一个依赖项,这解释了为什么在大多数项目图的顶部都有一个节点。反应器外部的依赖关系不会影响此图。

最后,如果您想跳过测试执行,您也可以使用 -DskipTests

注意: 您的某些插件可能与多线程构建器不兼容,但它可能会工作。但它会给出以下警告信息。您可能需要查看多线程支持的插件文档。

 [WARNING] *****************************************************************
[WARNING] * Your build is requesting parallel execution, but project      *
[WARNING] * contains the following plugin(s) that have goals not marked   *
[WARNING] * as @threadSafe to support parallel building.                  *
[WARNING] * While this /may/ work fine, please look for plugin updates    *
[WARNING] * and/or request plugins be made thread-safe.                   *
[WARNING] * If reporting an issue, report it against the plugin in        *
[WARNING] * question, not against maven-core                              *
[WARNING] *****************************************************************
[WARNING] The following plugins are not marked @threadSafe in test-project:
[WARNING] de.dentrassi.maven:rpm:0.9.2
[WARNING] Enable debug to see more precisely which goals are not marked @threadSafe.
[WARNING] *****************************************************************

原文由 Ram Ghadiyaram 发布,翻译遵循 CC BY-SA 4.0 许可协议

在我的实际项目中:

  1. mvn clean install [INFO] 总时间:01: 05 h
  2. mvn clean install -DskipTests [信息] 总时间:18: 35 分钟
  3. mvn clean install -Dmaven.test.skip -DskipTests [信息] 总时间:10:58 分钟
  4. mvn -T 1C clean install -Dmaven.test.skip -DskipTests [信息] 总时间: 04:00 分钟
  5. 我们还可以通过添加 -Dmaven.javadoc.skip=true mvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true 跳过要生成的 javadoc,正如 Archmed 评论 的那样
  6. 不要使用 \* imports ,在 IntelliJ 上,选择 > Analyze > Run inspection by name > * imports ,找到所有 * imports 并更正它。
  7. 删除项目中所有 未使用的导入 > 在 Intellij > 分析 > 按名称运行检查 > 未使用的导入
  8. 在 Intellij 上删除所有 未使用的代码(类、变量、字段、参数等):分析 > 按名称运行检查 > 未使用的声明。
  9. 升级到 最新的 JAVA 版本
  10. 我发现任务 mvn clean 在构建之前需要 2 分钟来清理 TARGET 文件夹。我确实创建了一个名为 quickclean 的新任务,我正在使用它而不是 clean,这种方式 mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests 。这个新任务 quickclean 只是 将构建文件夹 从 TARGET 重命名为 TARGET-yyyy-MM-dd-HH-mm( _什么是非常快_)。所以现在,每次你创建一个新的 mvn quickclean install... 时,你都会有一个包含构建时间的文件夹。 不方便 的是,这可能会占用 大量硬盘空间,因此有时您必须清理所有这些目录。为此,我创建了另一个名为: trashclean 的任务,将所有文件夹放入垃圾桶。我可能每周都准时执行此任务。或月份,取决于我的工作 mvn trashclean

如果你想使用这个概念,这里是你需要添加到你的 pom.xml 中的内容

<properties>
    <timestamp>${maven.build.timestamp}</timestamp>
    <maven.build.timestamp.format>yyyy-MM-dd-HH-mm</maven.build.timestamp.format>
    <trashdir>trash/target-${maven.build.timestamp}</trashdir>
</properties>

    <profile>
        <id>quickclean</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>rename_target</id>
                            <phase>pre-clean</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <move todir="${trashdir}" failonerror="false">
                                        <fileset dir="target/"/>
                                    </move>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>trashclean</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>clean_trash</id>
                            <phase>clean</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <delete dir="trash/" failonerror="false"/>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>


原文由 mourad m 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题