web-dev-qa-db-fra.com

Comment obtenir qu'Eclipse résolve les classes générées avec Maven 2?

J'utilise Google Protocol Buffers pour générer des classes Java pour mon projet. En utilisant Maven 2 et son plugin "antrun", ces classes sont fraîchement générées avant la compilation, sorties vers les sources cible/générées et placées sur le chemin de classe pendant la construction. Construire le projet à partir du POM n’est donc pas un problème.

Cependant, Eclipse ne sait pas comment résoudre la classe générée, car le dossier dans lequel il se trouve ne semble pas se trouver sur le chemin d'accès aux classes de l'EDI pendant le développement. J'utilise m2Eclipse et le gère pour moi, donc je m'attendais à ce que Maven prenne soin de cela.

Comment puis-je obtenir le support IDE (complétion de code, etc.) pour le code généré?

48
Hanno Fietz

Ce que vous devriez voir dans votre projet Explorer est un conteneur nommé "Dépendances Maven" à la place des "bibliothèques référencées" habituelles. Cela signifie que m2Eclipse gère votre chemin de génération.

Dans mon cas, pour cela, j'ai coché "Inclure les modules" et un coché "Ignorer le plug-in du compilateur Maven lors du traitement des ressources" dans la section "Maven" de Projet-> Propriétés.

13
Hanno Fietz

m2Eclipse ne supporte pas cela. Vous devez ajouter manuellement le dossier target/generated-sources en tant que dossier source. Lorsque vous dites à m2Eclipse de "Mettre à jour la configuration du projet", cela sera écrasé et vous devrez le restaurer.

Assurez-vous également qu'Eclipse recherche les modifications dans l'espace de travail.

Il pourrait y avoir quelques problèmes, cependant. Finalement, vous rencontrerez des erreurs pour lesquelles une classe ne peut pas être compilée car une autre classe ne peut pas être résolue. La complétion du code fonctionnera, cependant. La cause principale de ce problème est qu’Eclipse est confus lorsque Maven change de fichier de classe dans target.

Pour résoudre ce problème, vous devez dire à Eclipse de compiler dans un endroit différent de celui de Maven .

24
Aaron Digulla

m2Eclipse le soutient. Premièrement, ajoutez le chemin à votre chemin de construction:

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

Deuxièmement, ajoutez le support pour cela à 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>

La deuxième étape peut ne pas être nécessaire si votre installation Eclipse a installé le plug-in "org.Eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml". Ce plugin est disponible via Fenêtre -> Préférences -> Maven -> Découverte. Actuellement, cela ne fonctionne pas ici sur Eclipse Kepler. Par conséquent, j'ai récupéré le fichier JAR (lié au xml affiché dans URL du catalogue ) et extrait manuellement les fragments de org.Eclipse.m2e.discovery.lifecyclemapping.buildhelper.xml.

21
koppor

Personnellement, j'ai résolu ce problème en configurant les classes générées en tant que projet séparé et en ai fait une dépendance dans mon projet principal (non généré). J'utilisais wsdl2Java pour générer des classes de service Web, de sorte que la "source" de mon sous-projet était wdsl et xsds. A bien fonctionné même lorsque le WSDS changeait régulièrement.

12
Michael Rutherfurd

J'ai eu ce problème avec le code généré en utilisant Maven et wsdl2Java et voici ce que j'ai fait dans Eclipse Juno pour le résoudre. Supposons que mon projet s'appelle project1:

  1. Cliquez avec le bouton droit sur projet1 et sélectionnez Propriétés.
  2. Choisissez le chemin de construction Java à gauche et sélectionnez l'onglet Bibliothèques.
  3. Cliquez sur Ajouter un dossier de classe
  4. Sélectionnez le répertoire bin et cliquez sur OK (projet1/cible/généré-sources/bin)
  5. Cliquez sur OK et actualisez le projet.

En prime, vous pouvez également joindre le code source:

  1. Cliquez sur la flèche en regard du nouveau dossier de classe que vous venez de créer.
  2. Cliquez sur pièce jointe source
  3. Cliquez sur le bouton Modifier
  4. Définissez le chemin d'accès à/projet1/cible/sources-générées/axe2/src
  5. Cliquez sur OK
9
Jono

Avez-vous essayé d'actualiser le projet Eclipse? 

alt text http://oyvindhauge.com/blog/wp-content/Eclipse_refresh.png

Lorsqu'un outil externe génère de nouveaux fichiers ou met à jour des anciens, Eclipse ne pourra pas détecter le changement avant la prochaine demande.

Une autre option serait de définir un nouveau générateur Personnalisé, en spécifiant que ce générateur "actualise les ressources à la fin":

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

2
VonC
  1. Cliquez avec le bouton droit sur le projet et sélectionnez Propriétés.
  2. Choisissez le chemin de génération Java à gauche et sélectionnez l'onglet Source.
  3. Cliquez sur Ajouter un dossier
  4. Sélectionnez le répertoire bin et cliquez sur OK
  5. (projet/cible/sources-générées/xxxx) Cliquez sur OK et actualisez le projet.
1
Ranjith Reddy

Comment puis-je obtenir le support IDE (complétion de code, etc.) pour le code généré?

J'ajoute généralement le plug-in m2e lifecycle-mapping au fichier pom.xml, comme décrit dans la réponse de @ koppor. Cependant, ajouter du code per-Eclipse à mes fichiers pom.xml n’est pas une option au travail, qui est principalement une boutique IntelliJ.

Ma solution ajoute d’abord le build-helper-maven-plugin au fichier pom.xml qui fonctionne correctement à partir de la ligne de commande, mais pas dans 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>

Pour réparer Eclipse, j'ai installé le Apt M2E Connector à partir du marché Eclipse. Je pense que les choses ont commencé à fonctionner juste après le redémarrage, puis la reconstruction de tous mes projets. Je vois maintenant ce qui suit dans mes répertoires sources:

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

Fonctionnalité!

0
Gray

Pour générer des fichiers source Java à partir de fichiers .proto, utilisez Protocol Buffers Plugin , qui fonctionne immédiatement avec Eclipse Oxygen.

Utilisation de base ( voir ici pour une description détaillée ):

  • assurez-vous que le compilateur protoc natif est installé sur votre système

  • mettre à jour votre fichier pom.xml:

    • assurez-vous d'utiliser au moins Java 6 (Java 7+ est recommandé)

    • ajouter l'invocation du plugin

    • ajouter la dépendance correspondante pour com.google.protobuf:protobuf-Java 

  • placez vos fichiers .proto dans le répertoire src/main/proto du projet

  • mettre à jour le projet (via Maven -> Update project...)

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

Quelques notes supplémentaires:

  • si l'exécutable protoc est dans le PATH, l'entrée de configuration protocExecutable peut être omise

  • les définitions de message protobuf testées uniquement peuvent être placées dans le répertoire src/test/proto du projet

  • Je recommande l'installation de Éditeur de descripteur de tampon de protocole ( lien marketplace )

Bonne chance!

0
vlp