M2E e ter pastas de origem geradas pelo maven como pastas de origem do Eclipse

91

Eu tenho um projeto maven em eclipse e tenho objetivos maven que executam processadores de anotação para gerar código. A pasta de saída para este código é target / generated-sources / apt.

Para que o eclipse veja este código gerado, preciso adicionar target / generated-sources / apt como uma pasta de origem para o projeto eclipse.

No entanto, isso causa um erro do tipo "Problema de configuração Maven", informando

A configuração do projeto não está atualizada com pom.xml. Execute a atualização da configuração do projeto

Acho que entendo por que esse é o caso, já que o eclipse tem um conjunto de pastas de origem diferente do conjunto de maven. Mas preciso desse conjunto diferente, pois preciso do eclipse para ver as pastas de origem geradas ...

Ao fazer uma construção do maven puro, essas pastas de código-fonte serão incluídas na construção, pelo maven.

btw, eu atualizei para o lançamento oficial do eclipse do plugin maven eclipse, m2e 1.0 - que costumava ser m2eclipse. Gostaria de ver se consigo encontrar uma alternativa / solução para isso com o plugin m2e antes de ter que voltar para a versão antiga do m2eclipse.

Michael Wiles
fonte

Respostas:

105

Você precisa anexar o diretório de origem com o plugin build-helper .

Igual a:

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

Você também precisará:

Michael-O
fonte
4
esta solução funciona muito bem quando o m2e connector for build-helper-maven-pluginestá instalado no Eclipse
Brad Cupit
Não funciona para mim. Você pode explicar melhor a configuração do plugin auxiliar de construção?
Kevin Wong
<plugin> <groupId> org.codehaus.mojo </groupId> <artifactId> build-helper-maven-plugin </artifactId> <executions> <execution> <id> add-source </id> <phase> generate- fontes </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
Com o Kepler, também tive que instalar o conector m2e para o plugin do maven auxiliar de construção. (Basta abrir seu pom dentro do editor maven pom do eclipse e clicar no link vermelho no topo).
Snicolas
1
Tanto quanto eu posso dizer, a partir de build-helper-maven-plugincom <version>especificado como 3.2.0(o mais tardar, da escrita), não há necessidade de usar Apt M2E Connector. Atualmente trabalhando no Eclipse IDE 2020-06, usando Maven 3.6.3 embutido no Eclipse, e nossos problemas com a pasta de origem tendo exclusões (**) foram embora depois de tentar adicionar os caminhos de diretório das pastas de origem. Agora, todas as inclusões têm (** / *. java) neles.
tom_mai78101
80

Clique com o botão direito na mensagem de erro:

A configuração do projeto não está atualizada com pom.xml Execute a atualização da configuração do projeto

na Visualização de problemas, selecione Correção rápida e clique em Concluir para selecionar a configuração de projeto de atualização padrão . Isso resolve tudo.

Peter
fonte
1
Isso funciona para mim também. Por que essa não é a resposta aceita? Parece que a resposta aceita faz muito.
Niels Basjes
14
@NielsBasjes esta não é a resposta aceita porque simplesmente não é útil. Quando você adiciona algo ao caminho de construção no Eclipse, isso significa que você não está mais em sincronia com o POM, daí o aviso. Atualizar a configuração do projeto simplesmente remove a entrada de caminho de construção extra, que era o problema inicial para começar.
Phil
4

Depois de mudar para novas versões de m2e / maven / apt, ... eu tive erros de construção por causa dos arquivos duplicados, causados ​​pelo buildpath adicionado pelo buildhelper, então eu precisei remover as pastas "geradas pelo apt" do buildhelper.

Para corrigir o problema no Eclipse, não adicionando a pasta "gerada pelo apt" por meio de Atualizar configuração do Maven no M2E, escrevi um plug-in M2E para corrigir esse problema. Ele adiciona o outputDirectories configurado no maven-apt-plugin ao buildpath do Projeto.

https://apt-m2e.googlecode.com

Stefan Wo
fonte
1
infelizmente @Stefan Wo, sua página de plug-in / repo agora é 404 em googlecode.com; você se importaria de atualizá-lo, bem como a entrada do Eclipse Marketplace? consulte marketplace.eclipse.org/content/apt-m2e-connector
maxxyme
3

No m2e 1.0, a manipulação dos plug-ins Maven mudou. Você pode estar faltando uma extensão m2e específica para o seu plugin de geração de código. Aqui está toda a documentação que consegui encontrar.

Este relatório de bug também pode ser relevante.

Nicola Musatti
fonte
Eu acho que m2e é novo e tem muitos desenvolvimentos excelentes
Michael Wiles
2
Eu acredito que o problema é que apenas aplicar plugins Maven em projetos m2eclipse, como m2eclipse costumava fazer, simplesmente funcionava na maioria das vezes, mas não era garantido que sempre fizesse a coisa certa. A nova abordagem é potencialmente mais sólida, mas requer que muitos plug-ins Maven tenham uma contraparte m2e.
Nicola Musatti
2

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

solicitação no CXF JIRA (consulte 1 ) para adicionar mapeamentos de ciclo de vida no próprio plugin cxf-codegen. Isso exigiria m2e 1.1, mas acredito que é uma abordagem melhor do que ter conectores construídos fora do projeto cxf, assumindo que a API de mapeamento do ciclo de vida mudaria com menos frequência do que cxf-codegen-plugin e cxf.

Mike Grandmaison
fonte
0

Você também pode usar o conector buildhelper m2e disponível no catálogo de descoberta. Estou usando o Eclipse 3.7

Cédric Vidal
fonte
0

Eclipse Java EE IDE para desenvolvedores da web. Versão: Juno Service Release 1

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

mvn clean install

funcionam perfeitamente.

Mas em eclipse eu tenho o mesmo erro na classe Asinc.

Basta pressionar F5 no projeto. Corrija este problema.

Burtsevyg
fonte
0

Isso foi o que eu achei que funcionou bem usando o spring 3.1.1, que tem a versão 3.0.6 também. Depois de configurar os plug-ins e colocá-los na área correta do pom e incluir o argline e endorseddirs para que as fontes java sejam colocadas na pasta target / generated-sources / cxf, o maven gerou as fontes 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>

Se sua pasta wsdl estiver em $ {basedir} / src / main / resources, ela irá encontrá-la automaticamente

Espero que isto ajude! ~ wildbill

WildBill
fonte
0

Caso, por algum motivo, você não consiga usar o plug-in auxiliar de construção, a maneira mais fácil (embora não seja tão conveniente e um tanto entediante) que descobri para lidar com isso é:

  1. Separe o código-fonte gerado em seu próprio projeto ou submódulo.
  2. Você desejará manter este projeto predominantemente fechado ou não importado para o Eclipse quando estiver trabalhando no projeto pai.
  3. No projeto pai que precisa do código gerado, certifique-se de depender agora do projeto de código-fonte gerado por meio da dependência de pom do Maven.
  4. Quando você precisar atualizar o código gerado, vá para o projeto de código gerado e execute mvn install. Agora atualize o projeto pai clicando com o botão direito e selecionando Maven-> Atualizar projeto ...

Isso geralmente funciona bem para projetos que usam uma fonte semi estática para geração de código, como SOAP WSDLs (Apache CXF) ou código gerado a partir de um banco de dados (jOOQ). Para APT e outros códigos do tipo AspectJ, ele não funciona bem porque você edita o código-fonte com frequência.

Adam Gent
fonte
-1

a configuração do plugin auxiliar de construção funcionou para nós.

mas esteja ciente de que a pasta de destino sempre deve ser igual à configuração do plugin que você está usando para o próprio processamento de anotação.

por exemplo, o maven-processor-plugin usa a pasta de destino $ {project.build.directory} / generated-sources / apt como padrão. se desejar outro destino para seus arquivos de origem gerados, você pode configurá-lo pela tag conforme mostrado abaixo.

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

Aqui está a solução

  1. Abra a Visualização de Marcadores (Janela> Mostrar Visualização
  2. Clique com o botão direito na mensagem de erro
  3. Selecione Quick Fix
  4. Clique em Terminar
imesh
fonte