Möglichkeiten, Maven schneller zu bauen?

Lesezeit: 10 Minuten

Benutzer-Avatar
Shubham Chaurasia

Ich habe ein Java-Projekt mit mehreren Modulen. Maven braucht fast 40 Sekunden, um es zu bauen. Ich habe Maven auch mit Multi-Thread-Builds ausprobiert, indem ich -T- und -C-Argumente für die Anzahl der zu verwendenden Threads und Kerne angegeben habe. Aber ich habe keine signifikante Verbesserung der Wandzeit meiner Builds festgestellt.

Ich verwende Maven 3.2.3 und manchmal muss ich mein Projekt sehr häufig erstellen.

Ich weiß, dass saubere Tore viel Zeit in Anspruch nehmen, aber ich kann es nicht auslassen.

Vorschläge bitte….

BEARBEITEN:

Hinweis: In meinem Fall nimmt das Reinigen nicht viel Zeit in Anspruch. Es endet in 1 Sek. Die Installation nimmt die restliche Zeit in Anspruch.

  • Haben Sie versucht, es zu bauen offline Verwendung der -o Option (vorausgesetzt, Ihre Abhängigkeiten ändern sich nicht häufig)

    – TheLostMind

    3. September 2015 um 7:02 Uhr

  • Nein. Ich war mir der Option -o nicht bewusst. Lass mich es versuchen. Vielen Dank.

    – Shubham Chaurasia

    3. September 2015 um 7:06 Uhr

  • @ TheLostMind Entschuldigung. Keine Verbesserungen.

    – Shubham Chaurasia

    3. September 2015 um 7:11 Uhr

  • Wie viele Tests haben Sie? Warum läufst du so oft? Wie viele Module haben Sie?

    – khmarbaise

    3. September 2015 um 7:17 Uhr

  • Zeroturnaround veröffentlichte eine interessante Artikel. Vielleicht finden Sie darin einige Hinweise.

    – FrVaBe

    3. September 2015 um 13:50 Uhr

Benutzer-Avatar
Ram Ghadiyaram

Hinweis: Das erste ist AFAIK, außer den Antworten hier sind keine anderen eingebauten Optionen in Maven verfügbar.


Das Ausführen von Maven Build mit mehreren Threads funktioniert für mich, um die Builds zu beschleunigen. Zum Beispiel :

mvn clean install -T100

wo -T ist, um anzugeben, wie viele Threads Sie basierend auf Ihrer Hardware wünschen.

Unten sind die Varianten aus Wiki

Maven 3.x hat die Fähigkeit, parallele Builds durchzuführen. Der Befehl lautet wie folgt:

  • mvn -T 4 clean install Builds mit 4 Threads
  • mvn -T 1C saubere Installation 1 Thread pro CPU-Kern
  • mvn -T 1.5C saubere Installation 1.5 Threads pro CPU-Kern

Wie die Ausführung bewertet wird (Siehe Parallele Builds in Maven 3)?

Geben Sie hier die Bildbeschreibung ein

Jeder Knoten im Diagramm stellt ein Modul in einem Mehrmodulaufbau dar, die “Ebenen” geben einfach den Abstand zum ersten Modul im internen Reaktorabhängigkeitsdiagramm an. Maven berechnet dieses Diagramm basierend auf deklarierten Abhängigkeiten zwischen Modulen für einen Build mit mehreren Modulen. Beachten Sie, dass das übergeordnete Maven-Projekt auch eine Abhängigkeit ist, was erklärt, warum sich über den meisten Projektdiagrammen ein einzelner Knoten befindet. Abhängigkeiten außerhalb des Reaktors beeinflussen diese Grafik nicht.

Wenn Sie die Testausführung überspringen möchten, können Sie schließlich auch verwenden -DskipTests auch.

Vorsicht : Einige Ihrer Plugins sind möglicherweise nicht mit Multithread-Builder kompatibel, es könnte funktionieren. aber es wird unten eine Warnmeldung angezeigt. Möglicherweise müssen Sie die Plugin-Dokumentation für die Multithreading-Unterstützung lesen.

[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] *****************************************************************    

  • -DskipTests kompiliert weiterhin die Tests. Wenn Sie auch das Kompilieren überspringen möchten, verwenden Sie -Dmaven.test.skip

    – Michael

    24. August 2020 um 23:29 Uhr

Benutzer-Avatar
Murad m

Zu meinem aktuellen Projekt:

  1. mvn clean install [INFO] Gesamtzeit: 01:05 Uhr
  2. mvn clean install -DskipTests [INFO] Gesamtzeit: 18:35 min
  3. mvn clean install -Dmaven.test.skip -DskipTests [INFO] Gesamtzeit: 10:58 min
  4. mvn -T 1C clean install -Dmaven.test.skip -DskipTests [INFO] Gesamtzeit: 04:00 min
  5. Wir können auch das zu generierende Javadoc überspringen kommentierte Archmed beim Hinzufügen -Dmaven.javadoc.skip=true mvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true
  6. Nicht verwenden * Importewählen Sie in IntelliJ > Analysieren > Inspektion nach Namen ausführen > * imports , um alle * Importe zu finden und zu korrigieren.
  7. Alles entfernen unbenutzte Importe in Ihrem Projekt > auf Intellij > Analysieren > Inspektion nach Namen ausführen > nicht verwendete Importe
  8. Alles entfernen unbenutzter Code (Klassen, Variable, Feld, Parameter usw.), auf Intellij: Analysieren > Inspektion nach Namen ausführen > unbenutzte Deklaration.
  9. Upgraden auf letzte JAVA-VERSION
  10. Das habe ich als Aufgabe gefunden mvn sauber, dauert 2 Minuten, um den TARGET-Ordner vor dem Erstellen zu bereinigen. Ich habe eine neue Aufgabe namens erstellt schnell reinigenund ich verwende es auf diese Weise anstelle von clean mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests . Diese neue Aufgabe ist nur quickclean Umbenennen des Build-Ordners von ZIEL zu ZIEL-JJJJ-MM-TT-HH-MM(was ist SEHR SCHNELL). So, jetzt machst du jedes Mal ein neues mvn quickclean install...haben Sie einen Ordner mit der Zeit des Builds. Das Unbequemees ist, dass dies dauern kann viel Platz auf der Festplatte, also müssen Sie alle diese Verzeichnisse manchmal bereinigen. Dafür habe ich eine weitere Aufgabe mit dem Namen erstellt: müllrein, um diesen gesamten Ordner in den Papierkorb zu verschieben. Ich führe diese Aufgaben vielleicht pünktlich pro Woche aus. oder Monat, abhängig von meiner Arbeit mvn trashclean.

Folgendes müssen Sie Ihrer pom.xml hinzufügen, wenn Sie dieses Konzept verwenden möchten

<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>
    

  • Warum der Unterschied zwischen 2 und 3?

    – Koray Tugay

    26. Dezember 2019 um 14:40 Uhr

  • 2 kompiliert die Tests immer noch, führt sie aber nicht aus, 3 kompiliert die Tests nicht einmal. -DskipTests in 3 redundant ist und weggelassen werden kann, wird es identische Ergebnisse liefern.

    – Amedée Van Gasse

    27. Dezember 2019 um 12:56 Uhr

  • Ich würde auch empfehlen, hinzuzufügen -Dmaven.javadoc.skip=true wenn Sie für den lokalen Build kompilieren. Dadurch wird das Erstellen von Javadocs übersprungen, was auf meinem Computer eine große Hilfe ist

    – Archmed

    21. Juli 2020 um 21:24 Uhr

  • verwenden mvn -T 1C clean install -Dmaven.test.skip -DskipTests verkürzte meine Bauzeit von 25 Minuten auf 3:53 Minuten. Vielen Dank!

    – Janet

    12. Februar 2021 um 18:21 Uhr


  • Bei meinem Projekt (~3000 Codezeilen, 42 Sekunden Maven-Build-Zeit auf dem lokalen Computer) wurde beim Entfernen von „import *“ und der Verwendung kein Unterschied in der Kompilierzeit festgestellt -Dmaven.javadoc.skip=true. Vielleicht ist mein Projekt zu klein … Das Überspringen der Tests reduziert die Maven-Build-Zeit um etwa 10 Sekunden (aber ich möchte, dass mein Projekt getestet wird, also werde ich die Tests nicht deaktivieren).

    – Julien Kronegg

    gestern

Sie können den Build optimieren, indem Sie einen Small-2-Trick wie verwenden

  1. Wenn Sie Junit Test geschrieben haben und den Testfall nicht jedes Mal ausführen möchten, können Sie ihn verwenden -DskipTests=true
  2. Nexus oder Repositories lokal installieren
  3. Sie können Speicherkonfigurationen optimal anpassen, z. B.: add this line to mvn.bat einstellen MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m

Weitere Informationen finden Sie unter So beschleunigen Sie Ihren Maven-Build

  • Außerdem beschleunigt SSD die Build-Geschwindigkeit erheblich.

    – Wartlok

    3. September 2015 um 7:20 Uhr

  • Ich habe dies gefunden stackoverflow.com/questions/17091425/…

    – Subodh Joshi

    3. September 2015 um 7:26 Uhr

  • Danke @Vartlok, @Subodh. SSD ist in meinem Fall nicht pragmatisch. Es ist ein Büro-PC

    – Shubham Chaurasia

    3. September 2015 um 7:37 Uhr

  • @ShubhamChaurasia Sie sind willkommen

    – Subodh Joshi

    3. September 2015 um 7:42 Uhr

  • @Vartlok: Irgendwelche Benchmarks, die einen Vergleich der Build-Geschwindigkeit auf HDD vs. SSD zeigen?

    – Gaurav

    24. Dezember 2018 um 9:25 Uhr

Benutzer-Avatar
creedon1

Wenn Sie die Befehlszeile verwenden, können Sie überprüfen, wie viele Kerne Ihr Computer hat, und alle verwenden. Wenn Sie auch Ihre Tests überspringen möchten, können Sie hinzufügen -DskipTests
Zum Beispiel habe ich einen 8-Kern-Prozessor:

mvn -T 8C clean install -DskipTests

Benutzer-Avatar
Wladimir I

Sie können einen hackigen Weg gehen, wenn Sie wie ich etwas zusätzlichen RAM haben und keine SSD benötigen, da SSD empfindlich auf viele Lese- und Schreibvorgänge reagiert. Auch wenn Sie + ein bisschen deaktivieren (MacOS – ich erinnere mich nicht, ob Win ein ähnliches Problem hat). Aber

  1. Erstellen Sie ein RAM-Laufwerk (die Anzahl der Möglichkeiten hängt von Ihrem Betriebssystem ab) und mounten Sie es im Ordner /Benutzer/Benutzername/flüchtig

  2. Suchen Sie maven-module-builder-XXXjar in MVN_HOME/lib

  3. in JAR ändere die Datei org/apache/maven/model/pom-4.0.0.xml durch Modifizieren

&lt;build>&lt;directory>/Users/Username/volatile/${project.groupId}/${project.artifactId}/${project.version}/target

  1. Von nun an werden alle Projektzusammenstellungen im Speicher durchgeführt. Und es ist ein Unterschied, sogar im Vergleich zu SSD.

Ja, sein Hack und einige Maven-Plugins können übrigens aufhören zu funktionieren.

Benutzer-Avatar
Benutzer1416932

Abgesehen von der parallelen Ausführung, die viele der Leute bereits erwähnt haben, versuchen Sie diese Maven-Optionen, die den Build beschleunigen würden -XX:+TieredCompilation -XX:TieredStopAtLevel=1

Low-Level-Geschwindigkeit mit Ramdisk (Windows)

Mein zusätzlicher Trick ist die Verwendung einer Ramdisk

  1. Erstellen Sie eine Ramdisk mit 2 GB (z D:)
  2. Installieren Sie IDE, Maven, JDK und die .m2/repository zu dieser Ramdisk (D:/m2/).
  3. Bearbeiten Sie die Mavens D:/maven/conf/settings.xml um dieses Ramdisk-Repo zu verwenden (<localRepository>D:/m2</localRepository>)
  4. Legen Sie das Projekt in die Ramdisk.
  5. Führen Sie das Projekt mit seinem temporären Ordner auf der Ramdisk aus.

An meiner Maschine drehte ich mich um

[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] ------------------------------------------------------------------------

Hinein

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.805 s (Wall Clock)
[INFO] Finished at: 2021-11-11T10:48:14Z
[INFO] ------------------------------------------------------------------------

Beide Ergebnisse sind High-End (-DskipTests -T 12)

Warnung: Vergessen Sie nicht, die Ramdisk vor dem Herunterfahren zu persistieren, sonst geht Ihre Arbeit verloren.

Schau dir dieses Biest an:
Geben Sie hier die Bildbeschreibung ein

  • Ich glaube nicht, dass Sie Ihre IDE, JDK oder Maven in der Ramdisk benötigen. Sinnvoller wäre es, Maven Repo und das Projekt selbst in die Ramdisk zu legen.

    – Koray Tugay

    3. November 2021 um 15:35 Uhr

  • @KorayTugay Natürlich muss sich das Projekt auch auf dieser Ramdisk befinden. Ich dachte, das ist klar, aber ich habe die Antwort bearbeitet, um darauf hinzuweisen. Auch die -Djava.io.tmpdir=D:/temp ist wichtig.

    – Grimm

    3. November 2021 um 16:55 Uhr

  • Wie viel Unterschied macht es, die IDE in die Ramdisk zu stecken? Ich würde sehr wenig denken, liege ich falsch? Haben Sie eine große Verbesserung erfahren, indem Sie die IDE auch in der Ramdisk haben?

    – Koray Tugay

    3. November 2021 um 17:40 Uhr

  • @KorayTugay Ich habe zwei kleinere Gründe. Der erste Grund ist, dass ich pro Projekt ein Ramdisk-Image habe. Es ist wie eine All-in-One-Container-Ramdisk, bei der das JDK des Projekts genau das gleiche JDK wie die IDE ausführt, was eine bessere Debugging-Kompatibilität bietet. Als Beispiel: Ein Projekt ist ein SWT-Projekt, in dem ich lieber Netbeans verwende. In dem anderen Projekt verwende ich Eclipse. Dann gibt es ein IntelliJ-Projekt. Der zweite Grund ist, dass ich, wenn ich die IDE aktualisiere, aber nicht sicher bin, ob alle meine Plugins kompatibel sind, anstatt das IDE-Update manuell rückgängig zu machen, eine Ramdisk-Sicherung habe, um eine stabile Version wiederherzustellen.

    – Grimm

    3. November 2021 um 18:29 Uhr


1146190cookie-checkMöglichkeiten, Maven schneller zu bauen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy