M2E et avoir généré des dossiers source par maven en tant que dossiers source d'éclipse


91

J'ai un projet maven dans eclipse et j'ai des objectifs maven qui exécutent des processeurs d'annotation pour générer du code. Le dossier de sortie de ce code est target / generated-sources / apt.

Pour qu'eclipse puisse voir ce code généré, je dois ajouter target / generated-sources / apt en tant que dossier source au projet eclipse.

Cependant, cela provoque une erreur de type "Problème de configuration Maven" disant

La configuration du projet n'est pas à jour avec pom.xml. Exécuter la mise à jour de la configuration du projet

Je pense que je comprends pourquoi c'est le cas car eclipse a un ensemble de dossiers source différent de celui de maven. Mais j'ai besoin de cet ensemble différent, car j'ai besoin d'éclipse pour pouvoir voir les dossiers source générés ...

Lorsque vous faites une compilation pure maven, ces dossiers sources seront inclus dans la construction, par maven.

btw, j'ai mis à niveau vers la version officielle eclipse du plugin maven eclipse, m2e 1.0 - ce qui était auparavant m2eclipse. J'aimerais voir si je peux trouver une solution / contournement à cela avec le plugin m2e avant de devoir revenir à l'ancienne version m2eclipse.

Réponses:


105

Vous devez attacher le répertoire source avec le plugin build-helper .

Ainsi:

 <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <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>

Vous devrez également:


4
cette solution fonctionne très bien lorsque le m2e connector for build-helper-maven-pluginest installé dans Eclipse
Brad Cupit

Ça ne marche pas pour moi. Pouvez-vous élaborer sur la configuration de build-helper-plugin?
Kevin Wong

<plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> build-helper-maven-plugin </artifactId> <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> <source> $ {project.build.directory} / jaxws / wsimport / java </source> </sources> </configuration> </execution> </executions> </plugin>
Kevin Wong

2
Avec Kepler, j'ai dû également installer le connecteur m2e pour le plugin build helper maven. (Ouvrez simplement votre pom dans l'éditeur maven pom d'Eclipse et cliquez sur le lien rouge en haut).
Snicolas

1
Pour autant que je sache, à partir de build-helper-maven-pluginavec <version>spécifié comme 3.2.0(le dernier en date de la rédaction), il n'est pas nécessaire d'utiliser Apt M2E Connector. Je travaille actuellement sur Eclipse IDE 2020-06, en utilisant Maven 3.6.3 intégré dans Eclipse, et nos problèmes avec le dossier source ayant des exclusions (**) ont disparu après avoir tenté d'ajouter les chemins de répertoire des dossiers source. Maintenant, les inclusions ont toutes (** / *. java) en eux.
tom_mai78101

80

Cliquez avec le bouton droit sur le message d'erreur:

La configuration du projet n'est pas à jour avec pom.xml Exécuter la mise à jour de la configuration du projet

dans la vue Problèmes et sélectionnez Correction rapide et cliquez sur Terminer pour sélectionner la configuration de projet de mise à jour par défaut . Cela le corrige.


1
Cela fonctionne aussi pour moi. Pourquoi n'est-ce pas la réponse acceptée? Il semble que la réponse acceptée en fasse trop.
Niels Basjes

14
@NielsBasjes ce n'est pas la réponse acceptée car elle n'est tout simplement pas utile. Lorsque vous ajoutez quelque chose au chemin de construction dans Eclipse, cela signifie que vous n'êtes plus synchronisé avec le POM, d'où l'avertissement. La mise à jour de la configuration du projet supprime simplement l'entrée de chemin de construction supplémentaire, qui était le problème initial au départ.
Phil

4

Après avoir basculé vers de nouvelles versions de m2e / maven / apt, ... j'avais des builderrors à cause des fichiers dupliqués, causés par le chemin de construction ajouté par le buildhelper, donc j'ai dû supprimer les dossiers "apt-generated" de buildhelper.

Pour résoudre le problème dans Eclipse, sans ajouter le dossier "généré par apt" via la mise à jour de la configuration Maven dans M2E, j'ai écrit un plugin M2E pour résoudre ce problème. Il ajoute les outputDirectories configurés dans le maven-apt-plugin au chemin de construction du projet.

https://apt-m2e.googlecode.com


1
malheureusement @Stefan Wo votre page / dépôt de plugins est maintenant 404 sur googlecode.com; cela vous dérangerait-il de le mettre à jour, ainsi que l'entrée Eclipse Marketplace? voir marketplace.eclipse.org/content/apt-m2e-connector
maxxyme

3

Dans m2e 1.0, la gestion des plugins Maven a changé. Il vous manque peut-être une extension m2e spécifique pour votre plugin de génération de code. Voici toute la documentation que j'ai réussi à trouver.

Ce rapport de bogue peut également être pertinent.


Je suppose que m2e est nouveau et a beaucoup de développement exceptionnel
Michael Wiles

2
Je pense que le problème est que le simple fait d'appliquer des plugins Maven à des projets m2eclipse, comme le faisait m2eclipse, fonctionnait la plupart du temps, mais n'était pas garanti de toujours faire la bonne chose. La nouvelle approche est potentiellement plus solide, mais nécessite que de nombreux plugins Maven aient un équivalent m2e.
Nicola Musatti

2

https://bugs.eclipse.org/bugs/show_bug.cgi?id=350081

demande sur CXF JIRA (voir 1 ) pour ajouter des mappages de cycle de vie dans le cxf-codegen-plugin lui-même. Cela nécessiterait m2e 1.1, mais je pense que c'est une meilleure approche que d'avoir des connecteurs construits en dehors du projet cxf, en supposant que l'API de cartographie du cycle de vie changerait moins fréquemment que cxf-codegen-plugin et cxf.


0

Vous pouvez également utiliser le connecteur buildhelper m2e disponible dans le catalogue de découverte. J'utilise Eclipse 3.7


0

Eclipse Java EE IDE pour les développeurs Web. Version: Juno Service Release 1

mvn archetype:generate \
   -DarchetypeGroupId=org.codehaus.mojo \
   -DarchetypeArtifactId=gwt-maven-plugin \
   -DarchetypeVersion=2.5.0

mvn clean install

fonctionne parfaitement.

Mais dans eclipse, j'ai la même erreur sur la classe Asinc.

Appuyez simplement sur F5 sur le projet. Résolvez ce problème.


0

C'est ce que j'ai trouvé qui fonctionnait bien en utilisant le printemps 3.1.1 qui contient également la version 3.0.6. Une fois que j'ai configuré les plugins et mis dans la bonne zone du pom et inclus l'argline et les endossedirs pour que les sources java soient placées dans le dossier target / generated-sources / cxf, maven a généré les sources ok.

....

 <properties>...

   <dependencyManagement>
      <dependencies>.....
   </dependencyManagement>

<dependencies>
   <dependency>....

</dependencies>



<!-- *************************** Build process ************************************* -->
<build>
    <finalName>eSurety</finalName>
    <plugins>
        <!-- Force Java 6 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <!-- Deployent on AS from console
        <plugin>
            <groupId>org.jboss.as.plugins</groupId>
            <artifactId>jboss-as-maven-plugin</artifactId>
            <version>${version.jboss.as.maven.plugin}</version>
        </plugin>
        -->

        <!-- wildbill added tomcat plugin -->
        <plugin>
            <groupId>org.apache.tomcat.maven</groupId>
            <artifactId>tomcat7-maven-plugin</artifactId>
            <version>2.0</version>              
        </plugin>

        <!-- Surefire plugin before 2.9 version is buggy. No need to declare here,
              it's being referenced below w/ the version
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
        </plugin>
        -->

        <!-- developer added these -->   
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <compilerArguments>
                    <endorseddirs>target/generated-sources/cxf</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12</version>
            <configuration>
                <forkMode>once</forkMode>
                <argLine>-Djava.endorsed.dirs=target/generated-sources/cxf</argLine>
            </configuration>
        </plugin>           
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <compilerArguments>
                    <endorseddirs>target/generated-sources/cxf</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <forkMode>once</forkMode>
                <argLine>-Djava.endorsed.dirs=target/generated-sources/cxf</argLine>
            </configuration>
        </plugin>                       
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>                       
            <configuration>
                <artifactItems>
                    <artifactItem>
                        <groupId>javax.xml.bind</groupId>
                        <artifactId>jaxb-api</artifactId>
                        <version>2.2</version>
                    </artifactItem>
                    <artifactItem>
                        <groupId>javax.xml.ws</groupId>
                        <artifactId>jaxws-api</artifactId>
                        <version>2.2</version>
                    </artifactItem>
                </artifactItems>
                <outputDirectory>target/generated-sources/cxf</outputDirectory>
            </configuration>                      
        </plugin>                                                 
    </plugins>
</build>



<!-- *********************** Profiles ************************************ -->
<profiles>
    <profile>
        <!-- When built in OpenShift the 'openshift' profile will be 
            used when invoking mvn. -->
        <!-- Use this profile for any OpenShift specific customization 
            your app will need. -->
        <!-- By default that is to put the resulting archive into the 
            'deployments' folder. -->
        <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html -->
        <id>projName</id>
        <build>
            <plugins>                                                   
                <plugin>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-codegen-plugin</artifactId>
                    <version>2.5.2</version>                        
                    <executions>
                        <execution>
                            <id>process-sources</id>
                            <phase>generate-sources</phase>                                                                                               
                            <configuration>
                                <fork>once</fork>
                                <additionalJvmArgs>-Djava.endorsed.dirs=target/generated-sources/cxf</additionalJvmArgs>                                          
                            </configuration>
                            <goals>                             
                                <goal>wsdl2java</goal>
                            </goals>
                        </execution>
                    </executions>                       
                    <dependencies>
                        <dependency>
                           <groupId>com.sun.xml.bind</groupId>
                           <artifactId>jaxb-impl</artifactId>
                           <version>2.2</version>
                        </dependency>
                        <dependency>
                           <groupId>com.sun.xml.bind</groupId>
                           <artifactId>jaxb-xjc</artifactId>
                           <version>2.2</version>
                        </dependency>
                     </dependencies>
                </plugin>

                <!-- Actual war created in default target dir -->
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.2</version>                                               
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

Si votre dossier wsdl est dans $ {basedir} / src / main / resources, il le trouvera automatiquement

J'espère que cela t'aides! ~ wildbill


0

Dans le cas où, pour une raison quelconque, vous ne pouvez pas utiliser le plugin d'aide à la construction, le moyen le plus simple (mais pas aussi pratique et quelque peu fastidieux), j'ai trouvé que pour résoudre ce problème, c'est:

  1. Séparez le code source généré dans son propre projet ou sous-module.
  2. Vous voudrez garder ce projet principalement fermé ou non importé dans Eclipse lorsque vous travaillez sur le projet parent.
  3. Dans le projet parent qui a besoin du code généré, assurez-vous de dépendre maintenant du projet de code source généré via la dépendance Maven pom.
  4. Lorsque vous devez mettre à jour le code généré, accédez au projet de code généré et exécutez mvn install. Actualisez maintenant le projet parent en faisant un clic droit et en sélectionnant Maven-> Mettre à jour le projet ...

Cela fonctionne généralement bien pour les projets qui utilisent une source semi-statique pour la génération de code comme les WSDL SOAP (Apache CXF) ou le code généré à partir d'une base de données (jOOQ). Pour APT et d'autres codes de type AspectJ, cela ne fonctionne pas aussi bien car vous modifiez fréquemment la source.


-1

la configuration du plugin d'aide à la construction a fonctionné pour nous.

mais sachez que le dossier de destination doit toujours être égal à la configuration du plugin que vous utilisez pour le traitement des annotations lui-même.

par exemple, maven-processor-plugin utilise le dossier cible $ {project.build.directory} / generated-sources / apt par défaut. si vous souhaitez une autre destination pour vos fichiers source générés, vous pouvez la définir par la balise comme indiqué ci-dessous.

<plugin>
<groupId>org.bsc.maven</groupId>
                <artifactId>maven-processor-plugin</artifactId>
                <version>2.1.1</version>
                <executions>
                    <execution>
                        <id>process</id>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <phase>process-sources</phase>
                        <configuration>
                            <defaultOutputDirectory>apt_generated</defaultOutputDirectory>
                            <processors>
                                <processor>com.any.processor.invoker</processor>
                            </processors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

-3

Voici la solution

  1. Ouvrir la vue des marqueurs (Fenêtre> Afficher la vue
  2. Cliquez avec le bouton droit sur le message d'erreur
  3. Sélectionnez Quick Fix
  4. Cliquez sur Terminer
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.