webentwicklung-frage-antwort-db.com.de

Wie bekomme ich Eclipse, um mit Maven 2 generierte Klassen aufzulösen?

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.)?

48
Hanno Fietz

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.

13
Hanno Fietz

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.

24
Aaron Digulla

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.

21
koppor

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.

12

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:

  1. Klicken Sie mit der rechten Maustaste auf Projekt1, und wählen Sie Eigenschaften aus
  2. Wählen Sie auf der linken Seite Java Build Path aus, und wählen Sie die Registerkarte Libraries aus
  3. Klicken Sie auf Klassenordner hinzufügen
  4. Wählen Sie das bin-Verzeichnis aus und klicken Sie auf OK (Projekt1/Ziel/Generierte-Quellen/Bin).
  5. Klicken Sie auf OK und Aktualisieren Sie das Projekt

Als zusätzlichen Bonus können Sie auch den Quellcode beifügen:

  1. Klicken Sie auf den Pfeil neben dem neuen Klassenordner, den Sie gerade erstellt haben
  2. Klicken Sie auf Quellanhang
  3. Klicken Sie auf die Schaltfläche Bearbeiten
  4. Legen Sie den Pfad auf/project1/target/generated-sources/axis2/src fest
  5. OK klicken
9
Jono

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

2
VonC
  1. Klicken Sie mit der rechten Maustaste auf das Projekt, und wählen Sie Eigenschaften aus
  2. Wählen Sie Java Build Path von links und wählen Sie die Registerkarte Source
  3. Klicken Sie auf Ordner hinzufügen
  4. Wählen Sie das bin-Verzeichnis aus und klicken Sie auf OK
  5. (Projekt/Ziel/Generierte-Quellen/xxxx) Klicken Sie auf OK und Aktualisieren Sie das Projekt
1
Ranjith Reddy

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!

0
Gray

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!

0
vlp