Maven compila con múltiples directorios src


194

¿Hay alguna manera de compilar múltiples directorios fuente de Java en un solo proyecto Maven?

Respuestas:


278

Puede agregar un nuevo directorio de origen con 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
El único problema con este enfoque es que el artefacto final incluye también los archivos fuente de Java (archivos .java). ¿Hay alguna manera de excluir los archivos de origen e incluir solo los archivos .class?
saravana_pc

17
solo una nota para otros (como yo), el pluginelemento está dentro /project/build/pluginsy NO dentro/project/build/pluginManagement/plugins
Betlista

3
Si está utilizando eclipse, es posible que desee instalar m2e connector for build-helper-maven-plugina partir del mercado Eclipse para eliminar el error en pom.xml
dieend

1
Si recibe una advertencia como la 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingque necesita agregar dentro de <plugin>la etiqueta<version>1.12</version>
Alphaaa

44
Entonces, la mejor manera de hacer esto, en 2017, fue crear una pasta XML. ¿Nadie ve un problema con eso?
Tom

55

Ingenuamente lo hago de esta manera:

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

2
Me funcionó :) Sin embargo, a Eclipse no parece gustarle. Parece pensar que "src / main / java, src / interfaces" es un solo src y, por lo tanto, lo marca como (falta).
Joel

1
Para mí, eso hizo que Maven 3.2.2 no encontrara ninguna fuente.
user149408

40

Esto funciono para mi

<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
No es una buena idea, en mi humilde opinión, ya que varios complementos asumen el sourceDirectory, y posiblemente adicional sources, como las raíces de los archivos fuente. En su solución, maven-compiler-plugines el único complemento que conoce estas raíces reales.
Laurent Pireyn

3
@ Laurent Tienes razón en eso. Esta fue una buena idea hace un par de años, pero ahora hay opciones mucho mejores. build-helper enumerado anteriormente son mis opciones preferidas.
Sal

55
Esto no lo agrega al modelo de proyecto, por lo que no funcionará correctamente en IDE.
David Phillips

+1 @sal funcionó de maravilla con una dependencia del proyecto WAR.
ATorras

1
Esto no puede funcionar si quiero incluir un directorio de origen externo (que contiene la clase Java que estoy usando en mi proyecto maven). ¿Qué sucede si mi fuente externa se encuentra fuera del espacio de trabajo de mi Eclipse? ¿Que puedo hacer?
Aerox

16

para que funcione en intelliJ, también puede agregar

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

a maven-compiler-plugin


Me gustaría agregar que esto también funcionó en Eclipse para agregar las fuentes generadas como una ubicación de fuente en la configuración del proyecto.
Adam Hawkes

2
Sin embargo, esta ruta parece ser para fuentes generadas por procesadores de anotaciones. Incluso si funciona, es posible que esta ruta sea manejada de manera diferente por algunos complementos. Por ejemplo, esperaría que este directorio se elimine cuando se ejecute 'clean'.
kapex

2
donde lo pusiste ?
Pavel Niedoba

10

Esto también funciona con maven definiendo la etiqueta de recursos. Puedes nombrar los nombres de tus carpetas src como quieras.

    <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

4

Esto funcionó con maven 3.5.4 y ahora Intellij Idea ve este código como fuente:

       <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

Usé el plugin build-helper-maven-del post - y actualicé src / main / generado. Y mvn clean compile funciona en mi ../common/src/main/java, o en ../common, así que mantuve este último. Entonces sí, confirmando que el nivel de compilación de IntelliJ IDEA (ver 10.5.2) falló como lo mencionó David Phillips. El problema era que IDEA no agregó otra raíz fuente al proyecto. Agregarlo manualmente resolvió el problema. No es bueno, ya que editar cualquier cosa en el proyecto debe provenir de maven y no de la edición directa de las opciones de proyecto de IDEA. Sin embargo, podré vivir con él hasta que admitan build-helper-maven-plugin directamente, de modo que agregue automáticamente las fuentes.

Luego necesité otra solución para que esto funcione. Como cada vez que IDEA reimportó la configuración de Maven después de un cambio de pom, la fuente recién agregada se mantuvo en el módulo, pero perdió sus selecciones de Carpetas de origen y fue inútil. Entonces, para IDEA, debe configurar estos una vez:

  • Seleccione - Configuración del proyecto / Maven / Importar / mantener las carpetas de origen y prueba en reimportar.
  • Agregar - Estructura del proyecto / Configuración del proyecto / Módulos / {Módulo} / Fuentes / Agregar raíz de contenido.

Ahora, mantener esas carpetas importadas tampoco es la mejor práctica del mundo, ..., pero intentarlo.


Ninguna de las opciones funciona con IntelliJ Idea 9.0.4, que es lo que uso. No he probado las opciones de ayuda de compilación con el reciente Eclipse, pero no funcionó con 3.4 y el complemento m2 cuando lo probé. A Maven no le gustan los múltiples árboles fuente o los artefactos múltiples construidos a partir del mismo proyecto; cualquier intento de sortear esta limitación suele ser un truco horrible.
sal

He estado en IntelliJ durante muchos años. Y nunca cambiaste al eclipse, así que no puedo hablar por eso, luego escuchar que generalmente también es muy bueno. Para IntelliJ Actualizar una licencia personal cada dos años es de $ 100 / año. Las nuevas versiones principales generalmente salen cada año en enero. Luego, en los últimos 2-3 meses del año anterior, le permiten comprar la versión anterior y obtener la actualización a la próxima gratis. Esto está activado ahora, así que es el momento "seguro" para comprar 10 y obtener 11. Además, si no necesita JSP y otras funciones empresariales, use la edición gratuita de la comunidad.
arntg

2

Si bien la respuesta de evokk es básicamente correcta, faltan clases de prueba . Debe agregar clases de prueba con el 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

Esto se puede hacer en dos pasos:

  • Para cada directorio fuente, debe crear su propio módulo.
  • En todos los módulos, debe especificar el mismo directorio de compilación: ${build.directory}

Si trabaja con Jetty iniciado ( jetty:run), la recompilación de cualquier clase en cualquier módulo (con Maven, IDEA o Eclipse) conducirá al reinicio de Jetty. El mismo comportamiento que obtendrá para los recursos modificados.


1

En la configuración, puede 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 son todas las configuraciones disponibles para la versión 3.8.1 del complemento del compilador. Las diferentes versiones tienen diferentes configuraciones que puede encontrar ejecutando su código -Xdespués del comando general mvn. Me gusta

mvn clean install -X
mvn compiler:compile -X

y busque con ID u objetivo o nombre del complemento Esto puede ayudar con otros complementos también. Eclipse, intelliJ puede no mostrar todas las configuraciones como sugerencias.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.