M2E und mit Maven generierte Quellordner als Eclipse-Quellordner

91

Ich habe ein Maven-Projekt in Eclipse und Maven-Ziele, die Anmerkungsprozessoren ausführen, um Code zu generieren. Der Ausgabeordner für diesen Code lautet target / generate-sources / apt.

Damit Eclipse diesen generierten Code sehen kann, muss ich dem Eclipse-Projekt target / generate-sources / apt als Quellordner hinzufügen.

Dies führt jedoch zu einem Fehler vom Typ "Maven Configuration Problem"

Die Projektkonfiguration ist mit pom.xml nicht aktuell. Führen Sie das Projektkonfigurationsupdate aus

Ich glaube, ich verstehe, warum dies der Fall ist, da Eclipse einen anderen Satz von Quellordnern hat als Maven. Aber ich brauche diesen anderen Satz, da ich Eclipse brauche, um die generierten Quellordner sehen zu können ...

Wenn Sie einen reinen Maven erstellen, werden diese Quellordner von Maven in den Build aufgenommen.

Übrigens habe ich ein Upgrade auf die offizielle Eclipse-Version des Maven Eclipse-Plugins m2e 1.0 durchgeführt - was früher m2eclipse war. Ich würde gerne sehen, ob ich mit dem m2e-Plugin eine Lösung finden kann, bevor ich zur alten m2eclipse-Version zurückkehren muss.

Michael Wiles
quelle

Antworten:

105

Sie müssen das Quellverzeichnis mit dem Build-Helper-Plugin anhängen .

Wie so:

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

Sie müssen auch:

  • Installieren Sie den "Apt M2E Connector" vom Eclipse Marketplace. Klicken Sie dazu auf den Fehler in der Registerkarte Übersicht Ihrer pom.xml und wählen Sie "Entdecken".
  • Stellen Sie sicher, dass keine Plugin-Ausführungsfilter für das Build-Helper-Maven-Plugin vorhanden sind (siehe https://www.eclipse.org/m2e/documentation/m2e-execution-not-covered.html ).
Michael-O
quelle
4
Diese Lösung funktioniert hervorragend, wenn die m2e connector for build-helper-maven-pluginin Eclipse
Brad Cupit
Funktioniert bei mir nicht Können Sie das Setup des Build-Helper-Plugins näher erläutern?
Kevin Wong
<plugin> <groupId> org.codehaus.mojo </ groupId> <artifactId> Build-Helfer-Maven-Plugin </ifactId> <Ausführungen> <Ausführung> <id> Add-Source </ id> <phase> generate- Quellen </ Phase> <Ziele> <Ziel> Quelle hinzufügen </ Ziel> </ Ziele> <Konfiguration> <Quellen> <Quelle> $ {project.build.directory} / generierte-Quellen / Java / </ Quelle> <Quelle> $ {project.build.directory} / jaxws / wsimport / java </ source> </ source> </ configuration> </ Ausführung> </ Ausführung> </ Plugin>
Kevin Wong
2
Mit Kepler musste ich auch den m2e-Connector für das Build Helper Maven Plugin installieren. (Öffnen Sie einfach Ihren Pom im Maven Pom Editor von Eclipse und klicken Sie auf den roten Link oben).
Snicolas
1
Soweit ich das beurteilen kann, wie der build-helper-maven-pluginmit <version>angegeben als 3.2.0(die letzten als dem Schreiben), gibt es keine Notwendigkeit Apt M2E Connector zu verwenden. Derzeit wird an Eclipse IDE 2020-06 mit Embedded Maven 3.6.3 in Eclipse gearbeitet, und unsere Probleme mit Quellordnern mit Ausschlüssen (**) wurden behoben, nachdem versucht wurde, die Verzeichnispfade der Quellordner hinzuzufügen. Jetzt haben alle Einschlüsse (** / *. Java) in ihnen.
tom_mai78101
80

Klicken Sie mit der rechten Maustaste auf die Fehlermeldung:

Die Projektkonfiguration ist mit pom.xml nicht aktuell. Führen Sie die Aktualisierung der Projektkonfiguration aus

Wählen Sie in der Problemansicht die Option Schnellkorrektur aus und klicken Sie auf Fertig stellen , um die Standardkonfiguration für das Update-Projekt auszuwählen . Dies behebt es.

Peter
quelle
1
Das funktioniert auch bei mir. Warum ist das nicht die akzeptierte Antwort? Die akzeptierte Antwort scheint zu viel zu bewirken.
Niels Basjes
14
@NielsBasjes Dies ist nicht die akzeptierte Antwort, weil es einfach nicht hilfreich ist. Wenn Sie dem Erstellungspfad in Eclipse etwas hinzufügen, bedeutet dies, dass Sie nicht mehr mit dem POM synchronisiert sind, daher die Warnung. Durch das Aktualisieren der Projektkonfiguration wird einfach der zusätzliche Eintrag für den Erstellungspfad entfernt, was zunächst das anfängliche Problem war.
Phil
4

Nach dem Wechsel zu neuen Versionen von m2e / maven / apt ... hatte ich Builderrors aufgrund der duplizierten Dateien, die durch den vom Buildhelper hinzugefügten Buildpfad verursacht wurden. Daher musste ich die "apt-generierten" -Folder aus dem Buildhelper entfernen.

Um das Problem in Eclipse zu beheben, habe ich ein M2E-Plugin geschrieben, um dieses Problem zu beheben. Es fügt die im maven-apt-plugin konfigurierten outputDirectories zum Buildpath des Projekts hinzu.

https://apt-m2e.googlecode.com

Stefan Wo
quelle
1
leider @Stefan Wo ist deine Plugin Seite / Repo jetzt 404 bei googlecode.com; Würde es Ihnen etwas ausmachen, es sowie den Eclipse Marketplace-Eintrag zu aktualisieren? siehe marketplace.eclipse.org/content/apt-m2e-connector
maxxyme
3

In m2e 1.0 hat sich die Handhabung von Maven-Plugins geändert. Möglicherweise fehlt Ihnen eine bestimmte m2e-Erweiterung für Ihr Plugin zur Codegenerierung. Hier ist die gesamte Dokumentation ich gefunden habe.

Dieser Fehlerbericht kann ebenfalls relevant sein.

Nicola Musatti
quelle
Ich denke, m2e ist neu und hat viele herausragende Entwicklungen
Michael Wiles
2
Ich glaube, das Problem ist, dass nur das Anwenden von Maven-Plugins auf m2eclipse-Projekte, wie es früher bei m2eclipse der Fall war, die meiste Zeit funktioniert hat, aber nicht garantiert wurde, dass immer das Richtige getan wird. Der neue Ansatz ist möglicherweise solider, erfordert jedoch, dass viele Maven-Plugins ein m2e-Gegenstück haben.
Nicola Musatti
2

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

Anforderung an CXF JIRA (siehe 1 ), Lebenszykluszuordnungen im cxf-codegen-Plugin selbst hinzuzufügen. Dies würde m2e 1.1 erfordern, aber ich glaube, es ist ein besserer Ansatz als das Erstellen von Konnektoren außerhalb des cxf-Projekts, vorausgesetzt, die API für die Lebenszykluszuordnung würde sich weniger häufig ändern als das cxf-codegen-plugin und cxf.

Mike Grandmaison
quelle
0

Sie können auch den im Discovery-Katalog verfügbaren Buildhelper m2e-Connector verwenden. Ich verwende Eclipse 3.7

Cédric Vidal
quelle
0

Eclipse Java EE IDE für Webentwickler. Version: Juno Service Release 1

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

mvn clean install

perfekt arbeiten.

Aber in Eclipse habe ich den gleichen Fehler in der Asinc-Klasse.

Drücken Sie einfach F5 für das Projekt. Beheben Sie dieses Problem.

burtsevyg
quelle
0

Ich fand, dass dies mit Spring 3.1.1, das auch die Version 3.0.6 enthält, gut funktioniert hat. Nachdem ich die Plugins eingerichtet und in den richtigen Bereich des POM gestellt und die Argline und die Endorseddirs eingefügt hatte, um die Java-Quellen in den Ordner target / generate-sources / cxf zu verschieben, generierte maven die Quellen 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>

Wenn sich Ihr wsdl-Ordner in $ {basedir} / src / main / resources befindet, wird er automatisch gefunden

Hoffe das hilft! ~ Wildbill

WildBill
quelle
0

Für den Fall, dass Sie das Build-Helfer-Plugin aus irgendeinem Grund nicht auf einfachste Weise verwenden können (wenn auch nicht so bequem und etwas langweilig), habe ich festgestellt, dass ich damit umgehen kann:

  1. Trennen Sie den generierten Quellcode in ein eigenes Projekt oder Untermodul.
  2. Sie sollten dieses Projekt überwiegend geschlossen lassen oder nicht in Eclipse importieren, wenn Sie am übergeordneten Projekt arbeiten.
  3. Stellen Sie im übergeordneten Projekt, das den generierten Code benötigt, sicher, dass Sie jetzt über die Maven-POM-Abhängigkeit vom generierten Quellcode-Projekt abhängig sind.
  4. Wenn Sie den generierten Code aktualisieren müssen, gehen Sie zum generierten Code-Projekt und führen Sie es aus mvn install. Aktualisieren Sie nun das übergeordnete Projekt, indem Sie mit der rechten Maustaste klicken und Maven-> Projekt aktualisieren ... auswählen.

Dies funktioniert im Allgemeinen gut für Projekte, die eine semistatische Quelle für die Codegenerierung verwenden, z. B. SOAP-WSDLs (Apache CXF) oder aus einer Datenbank generierten Code (jOOQ). Für APT und anderen AspectJ-ähnlichen Code funktioniert dies nicht so gut, da Sie die Quelle häufig bearbeiten.

Adam Gent
quelle
-1

Die Konfiguration des Build Helper Plugins hat bei uns funktioniert.

Beachten Sie jedoch, dass der Zielordner immer der Konfiguration des Plugins entsprechen muss, das Sie für die Annotationsverarbeitung selbst verwenden.

Beispielsweise verwendet das Maven-Prozessor-Plugin standardmäßig den Zielordner $ {project.build.directory} / generate-sources / apt. Wenn Sie ein anderes Ziel für Ihre generierten Quelldateien wünschen, können Sie es wie unten gezeigt über das Tag festlegen.

<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>
Hannes Kogler
quelle
-3

Hier ist die Lösung

  1. Öffnen Sie die Markierungsansicht (Fenster> Ansicht anzeigen)
  2. Klicken Sie mit der rechten Maustaste auf die Fehlermeldung
  3. Wählen Sie Quick Fix
  4. Klicken Sie auf Fertig stellen
imesh
quelle