Reputation: 2622
I have a multi module java project. Maven takes almost around 40 secs to build it. I have tried maven with multi threaded builds too by specifying -T and -C args for no of threads and cores to be used. But I haven't seen any significant improvement in wall time of my builds.
I am using maven 3.2.3 and sometimes I need to build my project very frequently.
I know that clean goal take a lot of time but I can not omit it.
Suggestions please....
EDIT:
Note: In my case clean is not taking much time. It finishes in 1 sec. install is taking rest of the time.
Upvotes: 87
Views: 91505
Reputation: 51
You can try turbo-maven-plugin to help speed up your multi module Maven builds locally (I am one of the plugin authors)?
https://github.com/sparebank1utvikling/turbo-maven-plugin
It works by analyzing what modules actually have code changes, and build only those and the modules dependent on them. More info about how it works here:
Upvotes: 5
Reputation: 987
On my actual project :
mvn clean install
[INFO] Total time: 01:05 hmvn clean install -DskipTests
[INFO] Total time: 18:35 minmvn clean install -Dmaven.test.skip -DskipTests
[INFO] Total time: 10:58 minmvn -T 1C clean install -Dmaven.test.skip -DskipTests
[INFO] Total time: 04:00 minmvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true
mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests
. This new task quickclean is only renaming the build folder from TARGET to TARGET-yyyy-MM-dd-HH-mm(what is VERY FAST). So now, every time you make a new mvn quickclean install...
, you have a folder with the time of the build. The inconvenient, it's that this may take a lot of space on the hard disk, so you have to clean all these directories sometimes. So for that I have created another task called: trashclean, to put all this folder to trash. I am running this tasks maybe on time per week. or month, depending on my work mvn trashclean
.Here is what you need to add to your pom.xml if you want to use this concept
<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>
Upvotes: 76
Reputation: 1976
My additional trick is using a ramdisk
.m2/repository
to that Ramdisk (D:/m2/
).D:/maven/conf/settings.xml
to use that Ramdisked repo (<localRepository>D:/m2</localRepository>
)On my machine I turned
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.954 s (Wall Clock)
[INFO] Finished at: 2021-02-17T13:07:51+01:00
[INFO] Final Memory: 55M/642M
[INFO] ------------------------------------------------------------------------
Into
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.805 s (Wall Clock)
[INFO] Finished at: 2021-11-11T10:48:14Z
[INFO] ------------------------------------------------------------------------
Both results are high-end (-DskipTests -T 12
)
Warning: Do not forget to persist the ramdisk before shutdown or your work is lost.
Upvotes: 1
Reputation: 111
You can do a hacky way if you have some extra RAM as I do, and you don't need SSD, because it's sensitive for SSD to do a lot of read-writes. Even if you disable +a bit (MacOS - I don't remember if Win have similar issue). But
create RAM drive (number of ways depends on your OS) and mount it to /Users/Username/volatile folder
locate maven-module-builder-X.X.X.jar in MVN_HOME/lib
in JAR modify file org/apache/maven/model/pom-4.0.0.xml by modifying
<build><directory>/Users/Username/volatile/${project.groupId}/${project.artifactId}/${project.version}/target
Yes, its hack and some maven plugins can stop working BTW.
Upvotes: 6
Reputation: 297
Apart from parallel run which many of the folks have already mentioned, try these maven options which would speed up build -XX:+TieredCompilation -XX:TieredStopAtLevel=1
Upvotes: 5
Reputation: 1467
If using commandline you can check how many cores your machine has and use all of them, if you also want to skip your tests, you can add -DskipTests
For example, I have 8 core processor:
mvn -T 8C clean install -DskipTests
Upvotes: 5
Reputation: 29165
Running maven build with Multiple threads works for me to speed up the builds. For example :
mvn clean install -T100
where -T is for specifying how many threads you want based on your hardware.
Maven 3.x has the capability to perform parallel builds. The command is as follows:
- mvn -T 4 clean install Builds with 4 threads
- mvn -T 1C clean install 1 thread per cpu core
- mvn -T 1.5C clean install 1.5 thread per cpu core
Each node in the graph represents a module in a multi-module build, the "levels" simply indicate the distance to the first module in the internal reactor dependency graph. Maven calculates this graph based on declared inter-module dependencies for a multi-module build. Note that the parent maven project is also a dependency, which explains why there is a single node on top of most project graphs. Dependencies outside the reactor do not influence this graph.
Finally if you want to skip test execution you can also use -DskipTests
as well.
Caution : Some of your plugins may not be compatible for multithreaded builder, it may work. but it will give below warning message. you may need to see plugin documentation for multithreading support.
[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] *****************************************************************
Upvotes: 82
Reputation: 13492
You can optimize the build by using of some small-2 trick like
-DskipTests=true
mvn.bat
set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m
For more information you can check How to Speed Your Maven build
Upvotes: 6