Ich verwende Google Protocol Buffers, um einige Java-Klassen für mein Projekt zu generieren. Mit Maven 2 und seinem "antrun" -Plugin werden diese Klassen vor dem Kompilieren neu generiert, an Ziel-/Generierte-Quellen ausgegeben und während des Builds in den Klassenpfad gesetzt. Daher ist das Erstellen des Projekts aus dem POM kein Problem.
Eclipse weiß jedoch nicht, wie die generierte Klasse aufgelöst werden soll, da sich der Ordner, in dem sich die Datei befindet, während der Entwicklung nicht im Klassenpfad der IDE befindet. Ich benutze m2Eclipse und habe es für mich, Abhängigkeiten zu verwalten, also hatte ich erwartet, dass Maven sich darum kümmert.
Wie kann ich IDE Unterstützung für den generierten Code erhalten (Code-Vervollständigung usw.)?
Was Sie in Ihrem Projekt-Explorer sehen sollten, ist ein Container mit dem Namen "Maven-Abhängigkeiten" anstelle der üblichen "Referenzierten Bibliotheken". Das bedeutet, dass m2Eclipse Ihren Erstellungspfad verwaltet.
Um dies zu erreichen, habe ich in meinem Fall im Abschnitt "Maven" unter "Projekt-> Eigenschaften" die Option "Include Modules" und un "Skip Maven Compiler Plugin beim Verarbeiten von Ressourcen" aktiviert.
m2Eclipse unterstützt das nicht. Sie müssen den Ordner target/generated-sources
manuell als Quellordner hinzufügen. Wenn Sie "Update Project Configuration" an m2Eclipse senden, wird dies überschrieben und Sie müssen es wiederherstellen.
Stellen Sie außerdem sicher, dass Eclipse im Arbeitsbereich nach Änderungen sucht.
Es kann jedoch einige Probleme geben. Irgendwann werden Sie auf Fehler stoßen, dass eine Klasse nicht kompiliert werden kann, da eine andere Klasse nicht aufgelöst werden kann. Die Code-Vervollständigung wird jedoch funktionieren. Die Hauptursache für dieses Problem ist, dass Eclipse verwirrt wird, wenn Maven Klassendateien in target
ändert.
Um dies zu lösen, müssen Sie Eclipse anweisen, an einem anderen Ort als Maven zu kompilieren.
m2Eclipse unterstützt dies. Fügen Sie zunächst den Pfad zu Ihrem Build-Pfad hinzu:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${project.build.directory}/generated-sources/Java/</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
Zweitens fügen Sie Unterstützung für m2e hinzu:
<pluginManagement>
<plugins>
<plugin>
<groupId>org.Eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<versionRange>[1.0,)</versionRange>
<goals>
<goal>parse-version</goal>
<goal>add-source</goal>
<goal>maven-version</goal>
<goal>add-resource</goal>
<goal>add-test-resource</goal>
<goal>add-test-source</goal>
</goals>
</pluginExecutionFilter>
<action>
<execute>
<runOnConfiguration>true</runOnConfiguration>
<runOnIncremental>true</runOnIncremental>
</execute>
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
Der zweite Schritt ist möglicherweise nicht erforderlich, wenn in Ihrer Eclipse-Installation das Plugin "org.Eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml" installiert wurde. Dieses Plugin ist über Window -> Preferences -> Maven -> Discovery verfügbar. Derzeit funktioniert das hier bei Eclipse Kepler nicht. Daher habe ich die JAR-Datei (verlinkt aus der in der Catalog-URL gezeigten XML-Datei) abgerufen und die Fragmente aus org.Eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml
von Hand extrahiert.
Ich persönlich löste dieses Problem, indem ich die generierten Klassen als separates Projekt aufbaute und es in meinem Hauptprojekt (nicht generiert) zur Abhängigkeit machte. Ich habe wsdl2Java verwendet, um Webservice-Klassen zu generieren, sodass die "Quelle" in meinem Unterprojekt "wdsl" und "xsds" war. Funktionierte gut, auch wenn sich der WSDL regelmäßig wechselte.
Ich hatte dieses Problem mit Code, der mit Maven und wsdl2Java generiert wurde, und hier ist, was ich in Eclipse Juno getan habe, um es zu beheben. Angenommen, mein Projekt heißt Projekt1:
- Klicken Sie mit der rechten Maustaste auf Projekt1, und wählen Sie Eigenschaften aus
- Wählen Sie auf der linken Seite Java Build Path aus, und wählen Sie die Registerkarte Libraries aus
- Klicken Sie auf Klassenordner hinzufügen
- Wählen Sie das bin-Verzeichnis aus und klicken Sie auf OK (Projekt1/Ziel/Generierte-Quellen/Bin).
- Klicken Sie auf OK und Aktualisieren Sie das Projekt
Als zusätzlichen Bonus können Sie auch den Quellcode beifügen:
- Klicken Sie auf den Pfeil neben dem neuen Klassenordner, den Sie gerade erstellt haben
- Klicken Sie auf Quellanhang
- Klicken Sie auf die Schaltfläche Bearbeiten
- Legen Sie den Pfad auf/project1/target/generated-sources/axis2/src fest
- OK klicken
Haben Sie versucht, das Eclipse-Projekt zu aktualisieren?
alt text http://oyvindhauge.com/blog/wp-content/Eclipse_refresh.png
Wenn ein externes Tool neue Dateien generiert oder alte aktualisiert, kann Eclipse die Änderung erst bei der nächsten Anforderung erkennen.
Eine weitere Option wäre, einen neuen benutzerdefinierten Builder zu definieren, der angibt, dass dieser Builder "Ressourcen nach Abschluss aktualisieren" soll:
alt text http://www.cs.lth.se/EDA180/2005/Verktyg/Eclipse_refresh.gif
Wie kann ich IDE Unterstützung für den generierten Code erhalten (Code-Vervollständigung usw.)?
Normalerweise würde ich das m2e Lifecycle-Mapping-Plugin zur Datei pom.xml hinzufügen, wie in @ koppors Antwort beschrieben. Das Hinzufügen von Eclipse-Code zu meinen pom.xml-Dateien ist jedoch keine Option bei der Arbeit, meistens ein IntelliJ-Shop.
Meine Lösung fügt zunächst build-helper-maven-plugin
zur Datei pom.xml hinzu, die von der Befehlszeile aus funktioniert, jedoch nicht in Eclipse.
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>${project.build.directory}/generated-sources/</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
Um Eclipse zu reparieren, habe ich den Apt M2E Connector vom Eclipse Marketplace installiert. Ich glaube, die Dinge funktionierten sofort nachdem ich einen Neustart durchgeführt und alle meine Projekte neu aufgebaut hatte. Ich sehe jetzt in meinem Quellverzeichnis Folgendes:
src/main/Java
target/generated-sources
...
Merkmal!
Um Java-Quelldateien aus .proto
-Dateien zu generieren, verwenden Sie Protocol Buffers Plugin , das in Eclipse Oxygen sofort einsatzbereit ist.
Grundlegende Verwendung ( siehe detaillierte Beschreibung ):
stellen Sie sicher, dass der native protoc
-Compiler auf Ihrem System installiert ist
aktualisieren Sie Ihre pom.xml
-Datei:
stellen Sie sicher, dass Sie mindestens Java 6 verwenden (Java 7+ wird empfohlen).
plugin-Aufruf hinzufügen
füge die entsprechende Abhängigkeit für com.google.protobuf:protobuf-Java
hinzu
legen Sie Ihre .proto-Dateien im src/main/proto
-Verzeichnis des Projekts ab
aktualisieren Sie das Projekt (über Maven -> Update project...
)
Beispiel pom.xml
:
<project>
...
<build>
<plugins>
<!-- Require at least Java 6 -->
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<!-- Generate .Java files from .proto definitions -->
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.1</version>
<configuration>
<protocExecutable>/usr/local/bin/protoc</protocExecutable>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-Java</artifactId>
<version>3.5.1</version>
</dependency>
...
</dependencies>
...
</project>
Einige zusätzliche Hinweise:
wenn sich protoc
ausführbar im PATH befindet, kann der protocExecutable
-Konfigurationseintrag weggelassen werden
protobuf-Meldungsdefinitionen für Test-Only können im src/test/proto
-Verzeichnis des Projekts abgelegt werden
Ich empfehle die Installation von Protocol Buffer Descriptor Editor ( marketplace link )
Viel Glück!