Domanda

Sto utilizzando Google Protocol Buffers per generare alcune classi Java per il mio progetto.Utilizzando Maven 2 e il suo plugin "antrun", queste classi vengono appena generate prima della compilazione, inviate a target/generated-sources e inserite nel classpath durante la compilazione.Quindi costruire il progetto dal POM non è un problema.

Tuttavia, Eclipse non sa come risolvere la classe generata, perché la cartella in cui si trova non sembra trovarsi nel percorso di classe dell'IDE durante lo sviluppo.Sto usando m2eclipse e faccio in modo che gestisca le dipendenze per me, quindi mi aspettavo che Maven se ne occupasse.

Come posso ottenere il supporto IDE (completamento del codice ecc.) per il codice generato?

È stato utile?

Soluzione 3

Che cosa si dovrebbe vedere nel progetto explorer è un contenitore denominato "Maven Dipendenze" al posto dei soliti "librerie di riferimento". Questo significa m2eclipse sta gestendo il tuo percorso di generazione.

Nel mio caso, per raggiungere questo obiettivo, ho controllato "Includi Moduli" e un controllato "Skip Maven plug-in compilatore durante l'elaborazione delle risorse" nella sezione "Maven" del Progetto-> Proprietà.

Altri suggerimenti

m2eclipse non supporta questa. È necessario aggiungere manualmente il target/generated-sources cartella come una cartella di origine. Quando dite m2eclipse a "Aggiornamento della configurazione del progetto", questo verrà sovrascritto e si deve ripristinarlo.

Inoltre, assicurarsi che Eclipse cerca cambiamenti nello spazio di lavoro.

Ci potrebbero essere alcuni problemi, però. Alla fine, si incorrerà in errori che una classe non può essere compilato perché qualche altra classe non può essere risolto. Completamento del codice funziona, però. La causa principale di questo problema è che Eclipse si confonde quando Maven cambia file di classe in target.

Per risolvere questo problema, si deve dire Eclipse per compilazione in un luogo diverso da quello Maven .

m2eclipse supporta questa. In primo luogo, aggiungere il percorso al percorso di generazione:

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

In secondo luogo, aggiungere il supporto per che a M2E:

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

Il secondo passo potrebbe non essere necessario, se l'installazione di Eclipse ha installato il plugin "org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml". Questo plugin è disponibile tramite Finestra -> Preferenze -> Maven -> Discovery. Attualmente, questo non funziona qui a Eclipse Keplero, di conseguenza, Presi il JAR (collegata dal xml mostrato nel Catalogo URL ) ed estratto i frammenti di org.eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml a mano.

Personalmente ho risolto questo problema attraverso la creazione di classi generate come un progetto separato e ne ha fatto una dipendenza nel mio progetto principale (non generato). Stavo usando WSDL2Java per generare classi webservice così la "fonte" nel mio sub-progetto è stata la wDSL e XSD. Ha funzionato bene anche quando il WSDL stava cambiando regolarmente.

Ho riscontrato questo problema con il codice generato utilizzando Maven e wsdl2java ed ecco cosa ho fatto in Eclipse Juno per risolverlo.Supponiamo che il mio progetto si chiami progetto1:

  1. Fare clic con il pulsante destro del mouse su progetto1 e selezionare Proprietà
  2. Scegli Java Build Path da sinistra e seleziona la scheda Librerie
  3. Fare clic su Aggiungi cartella della classe
  4. Seleziona la directory bin e fai clic su OK (progetto1/target/generated-sources/bin)
  5. Fare clic su OK e aggiornare il progetto

Come bonus aggiuntivo puoi anche allegare il codice sorgente:

  1. Fai clic sulla freccia accanto alla nuova cartella della classe appena creata
  2. Fare clic su Allegato sorgente
  3. Fare clic sul pulsante Modifica
  4. Imposta il percorso su /project1/target/generated-sources/axis2/src
  5. Fare clic su OK
  1. progetto pulsante destro del mouse e selezionare Proprietà
  2. Scegli Java Costruire Pathfrom sinistra e selezionare la scheda Origine
  3. Fare clic su Aggiungi Cartella
  4. Selezionare la directory bin e fare clic su OK
  5. (progetto / target /-sources generati / xxxx) Fare clic su OK e aggiornare il progetto

Lo si tenta di aggiornare il progetto Eclipse?

alt text
(fonte: oyvindhauge.com )

Quando uno strumento esterno generare nuovi file o aggiorna quelli vecchi, Eclipse non sarà in grado di rilevare la modifica fino alla successiva richiesta.

Un'altra opzione sarebbe quella di definire un nuovo costruttore personalizzato, specificando per che costruttore di "risorse di aggiornamento al termine":

alt text http://www.cs.lth.se /EDA180/2005/Verktyg/eclipse_refresh.gif

  

Come posso ottenere supporto IDE (codice di completamento, ecc) per il codice generato?

In genere vorrei aggiungere il plug-M2E ciclo di vita-mapping al file pom.xml come descritto nel @ di koppor risposta. Tuttavia l'aggiunta di codice per-eclipse ai miei file pom.xml non è un'opzione al lavoro che è principalmente un negozio di IntelliJ.

La mia prima soluzione aggiunge la build-helper-maven-plugin al pom.xml che funziona bene dalla linea di comando, ma non 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>

Per risolvere Eclipse ho installato il Apt M2E connettore dal Marketplace di Eclipse . Credo che le cose hanno cominciato a lavorare subito dopo ho riavviato e poi ricostruito tutti i miei progetti. Ora vedo il seguente nei miei dirs di origine:

src/main/java
target/generated-sources
...

Feature!

Per generare file sorgente Java da file .proto utilizzare buffer protocollo Plugin che funziona out-of-the-box in ossigeno eclisse.

Utilizzo base ( vedi qui per la descrizione dettagliata ):

  • fare in modo che il compilatore nativo è protoc installato sul vostro sistema

  • aggiornare il file pom.xml:

    • assicurarsi di utilizzare almeno Java 6 (si consiglia Java 7+)

    • aggiungere invocazione plug-in

    • aggiungere la dipendenza corrispondente com.google.protobuf:protobuf-java

  • mettere i file all'interno della directory Proto src/main/proto del progetto

  • aggiornare il progetto (tramite Maven -> Update project...)

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

Alcune note aggiuntive:

  • se protoc eseguibile sia nel percorso della voce di configurazione protocExecutable può essere omesso

  • -unico test protobuf definizioni messaggi possono essere messi in directory src/test/proto del progetto

  • Mi consiglia di installare Protocollo Buffer Descriptor Editor ( marketplace link )

In bocca al lupo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top