Maven compila com vários diretórios src


194

Existe uma maneira de compilar vários diretórios de origem java em um único projeto maven?

Respostas:


278

Você pode adicionar um novo diretório de origem com o build-helper:

<build>
    <plugins>
        <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>src/main/generated</source>
                        </sources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2
O único problema com essa abordagem é que o artefato final também inclui os arquivos de origem java (arquivos .java). Existe uma maneira de excluir os arquivos de origem e incluir apenas os arquivos .class?
saravana_pc

17
apenas uma nota para outros (como eu), pluginelemento está em /project/build/pluginse não/project/build/pluginManagement/plugins
Betlista

3
Se você estiver usando eclipse, você pode querer instalar m2e connector for build-helper-maven-pluginde mercado eclipse para remover o erro no pom.xml
dieend

1
Se você receber um aviso como 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingvocê precisa adicionar dentro <plugin>da tag<version>1.12</version>
Alphaaa 20/10

4
Portanto, a melhor maneira de fazer isso, em 2017, foi criar uma massa XML. Ninguém vê um problema com isso?
Tom

55

Eu ingenuamente faço desta maneira:

<build>
  <finalName>osmwse</finalName>
  <sourceDirectory>src/main/java, src/interfaces, src/services</sourceDirectory>
</build>

2
Trabalhou para mim :) Embora o Eclipse não pareça gostar. Parece pensar que "src / main / java, src / interfaces" é um único src e, portanto, o sinaliza como (ausente).
Joel

1
Para mim, isso fez com que o Maven 3.2.2 não encontrasse nenhuma fonte.
user149408

40

Isso funcionou para mim

<build>
    <sourceDirectory>.</sourceDirectory>
    <plugins>
        <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
        <includes>
            <include>src/main/java/**/*.java</include>
            <include>src/main2/java/**/*.java</include>
        </includes>
        </configuration>
        </plugin>
    </plugins>
</build>

18
IMHO não é uma boa ideia, pois vários plugins assumem o sourceDirectory- e possivelmente adicional sources- como as raízes dos arquivos de origem. Na sua solução, o maven-compiler-pluginé o único plug-in ciente dessas raízes reais.
Laurent Pireyn

3
@ Laurent Você está certo sobre isso. Essa foi uma boa ideia há alguns anos, mas agora existem opções muito melhores. O build-helper listado acima é minhas opções preferidas.
sal

5
Isso não o adiciona ao modelo de projeto, portanto não funcionará corretamente nos IDEs.
David Phillips

+1 @sal funcionou como um encanto com uma dependência de projeto WAR.
ATorras

1
Isso não funcionará se eu quiser incluir um diretório de origem externo (contendo a classe Java que estou usando no meu projeto maven). E se minha fonte externa estiver localizada fora da área de trabalho do meu Eclipse? O que eu posso fazer?
Aerox

16

para fazê-lo funcionar no inteliJ, você também pode adicionar

<generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>

para maven-compiler-plugin


Gostaria de acrescentar que isso também funcionou no Eclipse para adicionar as fontes geradas como um local de origem na configuração do projeto.
precisa

2
Esse caminho parece ser para fontes geradas por processadores de anotação. Mesmo que funcione, é possível que esse caminho seja tratado de maneira diferente por alguns plugins. Por exemplo, eu esperaria que esse diretório pudesse ser excluído quando 'clean' for executado.
Kapex

2
Onde é que puseste ?
Pavel Niedoba 5/09/18

10

Isso também funciona com o maven, definindo a etiqueta de recursos. Você pode nomear os nomes de pastas src como desejar.

    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/generated</directory>
            <includes>
                <include>**/*.java</include>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>

8
maven.apache.org/pom.html#Resources ->Resources are not (usually) code. They are not compiled
SJuan76 08/15

4

Isso funcionou com o maven 3.5.4 e agora o Intellij Idea vê esse código como fonte:

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <generatedSourcesDirectory>src/main/generated</generatedSourcesDirectory>                    
            </configuration>
        </plugin>

2

Utilizou o build-helper-maven-plugin da postagem - e atualize src / main / gerados. E o mvn clean compile funciona no meu ../common/src/main/java, ou no ../common, então mantive o último. Sim, confirmando que o nível de compilação do IntelliJ IDEA (versão 10.5.2) falhou, como David Phillips mencionou. O problema foi que o IDEA não adicionou outra raiz de origem ao projeto. Adicioná-lo manualmente resolveu o problema. Não é legal, pois a edição de qualquer coisa no projeto deve vir do maven e não da edição direta das opções do projeto da IDEA. No entanto, poderei viver com ele até que eles suportem o build-helper-maven-plugin diretamente, de forma que ele adicione automaticamente as fontes.

Em seguida, precisava de outra solução alternativa para fazer isso funcionar. Desde que cada vez que a IDEA reimportava as configurações do maven, após uma mudança de endereço, a fonte recém-adicionada era mantida no módulo, mas perdia as seleções de Pastas de origem e era inútil. Portanto, para a IDEA - é necessário configurá-los uma vez:

  • Selecione - Configurações do projeto / Maven / Importar / manter as pastas de origem e teste na reimportação.
  • Adicionar - Estrutura do Projeto / Configurações do Projeto / Módulos / {Módulo} / Fontes / Adicionar Raiz de Conteúdo.

Agora, manter essas pastas importadas também não é a melhor prática do mundo, ..., mas tentar.


Nenhuma opção funciona com o IntelliJ Idea 9.0.4, que é o que eu uso. Ainda não tentei as opções do build-helper com o recente Eclipse, mas não funcionou com o 3.4 e o plugin m2 quando o experimentei. O Maven não gosta de várias árvores de origem ou de vários artefatos construídos a partir do mesmo projeto. Qualquer tentativa de contornar essa limitação é geralmente um truque terrível.
Sal

Estão no IntelliJ há muitos anos. E nunca mudei para o eclipse, então não posso falar por isso, então ouvir também é geralmente muito bom. Para IntelliJ O upgrade de uma licença pessoal a cada dois anos é de US $ 100 / ano. As novas versões principais geralmente são lançadas todos os anos em janeiro. Então, nos últimos 2-3 meses do ano anterior, eles permitirão que você compre a versão anterior e obtenha a atualização para a próxima versão gratuita. Isso está ativado agora, portanto é o momento "seguro" para comprar 10 e obter 11. Além disso, se você não precisar de JSP e outros recursos empresariais, use a edição gratuita da comunidade.
Arntg

2

Embora a resposta do evokk esteja basicamente correta, faltam aulas de teste . Você deve adicionar classes de teste com o objetivo add-test-source :

                        <execution>
                            <phase>generate-sources</phase>
                            <goals>
                                <goal>add-test-source</goal>
                            </goals>
                            <configuration>
                                <sources>
                                    <source>target/generated/some-test-classes</source>
                                </sources>
                            </configuration>
                        </execution>

1

Isso pode ser feito em duas etapas:

  • Para cada diretório de origem, você deve criar seu próprio módulo.
  • Em todos os módulos, você deve especificar o mesmo diretório de construção: ${build.directory}

Se você trabalha com o Jetty iniciado ( jetty:run), a recompilação de qualquer classe em qualquer módulo (com Maven, IDEA ou Eclipse) levará ao reinício do Jetty. O mesmo comportamento que você terá para recursos modificados.


1

Na configuração, você pode usar <compileSourceRoots>.

oal:          org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-cli)
[DEBUG] Style:         Regular
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <basedir default-value="${basedir}"/>
  <buildDirectory default-value="${project.build.directory}"/>
  <compilePath default-value="${project.compileClasspathElements}"/>
  <compileSourceRoots default-value="${project.compileSourceRoots}"/>
  <compilerId default-value="javac">${maven.compiler.compilerId}</compilerId>
  <compilerReuseStrategy default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
  <compilerVersion>${maven.compiler.compilerVersion}</compilerVersion>
  <debug default-value="true">${maven.compiler.debug}</debug>
  <debuglevel>${maven.compiler.debuglevel}</debuglevel>
  <encoding default-value="${project.build.sourceEncoding}">${encoding}</encoding>
  <executable>${maven.compiler.executable}</executable>
  <failOnError default-value="true">${maven.compiler.failOnError}</failOnError>
  <failOnWarning default-value="false">${maven.compiler.failOnWarning}</failOnWarning>
  <forceJavacCompilerUse default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
  <fork default-value="false">${maven.compiler.fork}</fork>
  <generatedSourcesDirectory default-value="${project.build.directory}/generated-sources/annotations"/>
  <maxmem>${maven.compiler.maxmem}</maxmem>
  <meminitial>${maven.compiler.meminitial}</meminitial>
  <mojoExecution default-value="${mojoExecution}"/>
  <optimize default-value="false">${maven.compiler.optimize}</optimize>
  <outputDirectory default-value="${project.build.outputDirectory}"/>
  <parameters default-value="false">${maven.compiler.parameters}</parameters>
  <project default-value="${project}"/>
  <projectArtifact default-value="${project.artifact}"/>
  <release>${maven.compiler.release}</release>
  <session default-value="${session}"/>
  <showDeprecation default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
  <showWarnings default-value="false">${maven.compiler.showWarnings}</showWarnings>
  <skipMain>${maven.main.skip}</skipMain>
  <skipMultiThreadWarning default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
  <source default-value="1.6">${maven.compiler.source}</source>
  <staleMillis default-value="0">${lastModGranularityMs}</staleMillis>
  <target default-value="1.6">${maven.compiler.target}</target>
  <useIncrementalCompilation default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
  <verbose default-value="false">${maven.compiler.verbose}</verbose>
</configuration>

estas são todas as configurações disponíveis para a versão 3.8.1 do plug-in do compilador. Versões diferentes têm configurações diferentes que você pode encontrar executando seu código -Xapós o comando geral mvn. Gostar

mvn clean install -X
mvn compiler:compile -X

e pesquise com o ID, objetivo ou nome do plug-in. Isso também pode ajudar com outros plug-ins. Eclipse, intelliJ pode não mostrar todas as configurações como sugestões.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.