12 Stimmen

Verwendung des Eclipse-Compilers in einer Maven-Komponente

Ich arbeite an einem ziemlich großen Maven-Projekt und entwickle in Java mit Eclipse.

Um Kompilierungszeit zu sparen, möchte ich, dass Maven und Eclipse gemeinsam dasselbe Ziel teilen, was mir auch gelungen ist. Wenn ich jedoch mit Maven kompiliere Maven kompiliere, fehlen Eclipse einige Dinge, die es in den Bytecode einfügt, so dass es alles neu kompiliert (soweit ich das verstehe). Ich spreche hier von der Funktion "Automatisch kompilieren", es ist also nicht Eclipse, das den Build an Maven delegiert.

Um dieses Problem zu lösen, dachte ich, ich würde Maven bitten, denselben Compiler wie Eclipse zu verwenden. Nach einigen Recherchen im Internet fand ich heraus, dass ich dies im oberen Bereich hinzufügen kann pom :

<build>
...
<plugins>
...
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <configuration>
           <compilerId>eclipse</compilerId>
           <source>1.5</source>
           <target>1.5</target>
           <optimize>true</optimize>
   </configuration>
   <dependencies>
           <dependency>
                   <groupId>org.codehaus.plexus</groupId>
                   <artifactId>plexus-compiler-eclipse</artifactId>
                   <version>1.8.1</version>
           </dependency>
   </dependencies>
</plugin>
</plugins>
</build>

Das scheint zu funktionieren, aber der Build scheitert ziemlich schnell mit vielen Fehlern, während er mit javac erfolgreich ist. Ich bin mir nicht sicher, warum, aber es scheint, dass es einige Konflikte gibt, die damit zusammenhängen die Tatsache, dass die fehlgeschlagenen Java-Dateien generierte Dateien sind.

Also dachte ich, ich könnte versuchen, den Eclipse-Compiler nur für die Komponente zu verwenden, an der ich gerade arbeite (die nicht diese Art von Dateien hat). Ich fügte das obige Snippet in die pom meiner Komponente, aber wenn der Build meine Komponente erreicht, wird der folgende Fehler ausgelöst:

Kein solcher Compiler 'eclipse'

Ich habe auch versucht, die plexus-compiler-eclipse Abhängigkeit in der Abhängigkeiten im oberen pom aufgelistet, aber der gleiche Fehler.

Wissen Sie, ob das, was ich vorhabe, möglich ist? Haben Sie einen Tipp, wie ich es machen kann?

2voto

pedrogonzalezj Punkte 111

Dies ist ein altes offenes Problem im Zusammenhang mit Maven Multimodul-Projekten: http://jira.codehaus.org/browse/MCOMPILER-165

1voto

Robin Punkte 23622

Ich würde vermuten, dass Ihre Probleme von der Eclipse-Projekt und Maven Pom nicht synchronisiert werden entstehen. Ich würde vorschlagen, dass Sie die m2eclipse-Plugin um Maven und Eclipse synchron zu halten. Dadurch wird Ihr Eclipse-Projekt konfiguriert, indem das POM als "Master"-Konfiguration verwendet wird.

Ich glaube nicht, dass Sie speziell konfigurieren müssen, welchen Compiler Sie verwenden wollen, aber Sie sollten das maven-compiler-plugin so konfigurieren, wie Sie es bereits tun.

0voto

Aaron Digulla Punkte 308693

Stellen Sie sicher, dass Sie die neueste Version des maven-compiler-plugin (2.3.2 im Moment, siehe diese Seite - "Vollständiger Name" oder die kleine Versionsinfo in der oberen rechten Ecke).

Abgesehen davon sollte die Konfiguration funktionieren. Sie können es mit der neuesten Version 1.8.4 des plexus-compiler-eclipse auch.

Abgesehen davon müssen Sie verstehen, dass Maven mehrere Arten von Abhängigkeiten hat. In Ihrem Fall sind zwei davon interessant: Build-Time und Plugin-Abhängigkeiten.

Die ersteren werden in der dependencies Element während letztere in einer pluginManagement Element . Das Hinzufügen eines Plugins zum Klassenpfad der Erstellungszeit hat nicht die gewünschte Wirkung.

-2voto

drekka Punkte 19636

Ich bin mir nicht zu 100 % sicher, was Sie hier zu erreichen versuchen, aber es klingt nach einer schlechten Idee. Erstens sollte Eclipse so konfiguriert sein, dass es ein SDK auf Ihrem System verwendet und Maven sollte dasselbe verwenden. Ich verstehe also nicht, warum Sie denken, dass Eclipse etwas zum Bytecode hinzufügt, was Maven nicht tun würde, da beide sowieso den gleichen Compiler verwenden.

Zweitens würde ich nicht versuchen, irgendwelche Eclipse-Komponenten in einem Maven-Build zu verwenden. Sie sind so konzipiert, dass sie innerhalb der Eclipse-IDE funktionieren, so dass es in der Regel mit Problemen verbunden ist, sie außerhalb der IDE zum Laufen zu bringen. Ich habe gesehen, wie es gemacht wurde, aber es war ein Hack und hat keine sehr guten Ergebnisse gebracht.

Wenn Sie Performance-Probleme mit einem Maven-Build haben (was nicht ungewöhnlich ist), gibt es einige Dinge, die Sie tun können. Erstens: Zerlegen Sie den Build und finden Sie heraus, wo die Zeit hingeht. Meiner Erfahrung nach liegt das Problem normalerweise nicht in der Kompilierung. Hier ist eine Liste von Dingen, die meiner Erfahrung nach Builds verlangsamen:

  • Schlechte Qualität der Tests. Gewöhnlich langsamer Start von Integrationstests, verbunden mit Tests, die eigentlich Unit-Tests sind, die als Integrationstests laufen.

  • Cobertura. Ein großartiges Werkzeug, aber aufgrund der Arbeitsweise von Maven muss das Cobertura-Plugin alle Phasen von den Ressourcen bis zur Kompilierung erneut durchlaufen. Ich habe einmal 40% der Zeit eines langen Maven-Builds gespart, indem ich ein Plugin geschrieben habe, das die Ausführung von Tests stoppt, bis sie von der Cobertura-Phase ausgeführt werden.

  • Übermäßiges Erstellen, d.h. einschließlich Untermodulen, die sich im Grunde nie ändern. Die bessere Wahl ist es, ein Profil zu erstellen, das diese Untermodule nur bei Bedarf enthält, oder sie in ein komplett separates Build auszulagern.

  • Lange Integrationstests. Wenn die Integrationstests viel Zeit in Anspruch nehmen, sollten Sie sie in ein anderes Profil und einen anderen Build auf dem CI-Server legen. Dann kann Ihr Haupt-Build schneller laufen, so dass die Entwickler schneller wieder an die Arbeit gehen können, während die Integrationstests seltener ausgeführt werden können.

  • Schließlich - geben Sie zu, dass Maven ein Leistungsfresser ist und wechseln Sie zu etwas Schnellerem. Ant ist wahrscheinlich immer noch am schnellsten, aber mühsam einzurichten, weil man alles manuell konfigurieren muss. Ich würde vorschlagen, Folgendes auszuprobieren Grandle da es viele der Probleme behebt, die sowohl Ant als auch Maven haben. Um ehrlich zu sein, habe ich persönlich noch keine Leistungstests damit durchgeführt. Aber es gibt Ihnen ein Maß an Kontrolle, das Maven nicht hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X