than - ¿Cómo ignorar el directorio de Java Source durante la compilación de Maven?
no compiler is provided in this environment. perhaps you are running on a jre rather than a jdk? (4)
Estoy intentando utilizar el Plugin de Lombok Maven para garantizar la creación correcta de Javadocs cuando utilizo Lombok .
Lombok Maven presenta un nuevo objetivo de generación de código, justo antes de la compilación. En mi configuración, mi sourceDirectory
(Java con anotaciones de Lombok, src/main/java
) se procesa para crear Java (sin anotaciones Lombok) en target/generated-sources/delombok
.
Sin embargo, cada archivo en sourceDirectory
ahora tiene un archivo correspondiente (idénticamente llamado) en target/generated-sources/delombok
, lo que resulta en fallas de compilación debido a clases duplicadas.
¿Cómo puedo decirle al compilador de Java que ignore las fuentes en sourceDirectory
?
Tenga en cuenta que la configuración predeterminada de Lombok Maven hará que el desarrollador ponga Java (con anotaciones Lombok) en la carpeta src/main/lombok
lugar de src/main/java
. Sin embargo, no deseo hacer esto porque confunde los IDEs y mi código compila muy bien (si elimino el plugin Maven).
Tenga en cuenta también que la simple redefinición de sourceDirectory
también afectará a los IDE (ya no saben dónde encontrar el código fuente de Java).
Recientemente cambié de usar el enfoque de flakey maven-exec-plugin para generar fuentes sin formato para la herramienta javadoc para usar el complemento lombok-maven-plugin
Mi configuración
- Todas las fuentes en
src/main/java
- Las fuentes generadas van en
target/generated-sources/delombok
Inicialmente me encontré con este problema, pero parece ser una solución fácil: no dejes que lombok-maven-plugin agregue la ruta delombok a las rutas fuente del compilador con addOutputDirectoy
. ES DECIR
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>0.11.2.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
</execution>
</executions>
<configuration>
<addOutputDirectory>false</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</plugin>
Esto parece resolver el problema por ahora
EDITAR: Bonificación, cómo generar javadocs adecuados con esta configuración
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.8.1</version>
<configuration>
<defaultVersion>${project.version}</defaultVersion>
<sourcepath>target/generated-sources/delombok</sourcepath>
</configuration>
</plugin>
El objetivo delombok
está diseñado para transformar el código java de src/main/lombok
a target/generated-source/delombok
. Luego, el otro código Java que se encuentra en src/main/java
se combina con target/generated-source/delombok
para producir las clases java combinadas.
Ayuda a pensar en delombok como un generador de código fuente.
Entonces, ¿cómo puedes obtener lo que realmente quieres? (Tenga en cuenta que Maven tiene un método addCompileSourceRoot , pero no un removeCompileSourceRoot correspondiente). Imagine el siguiente hack :
- Anule el
<build><sourceDirectory>
desrc/main/java
para que sea${project.build.directory}/generated-sources/delombok
. - Reemplace el directorio
sourceDirectory
delombok predeterminado desrc/main/lombok
para que seasrc/main/java
, y deshabiliteaddOutputDirectory
.
Básicamente, target/generated-sources/delombok
src/main/java
, pero Maven lo ignorará y utilizará target/generated-sources/delombok
. El plugin de Lombok transformará src/main/java
en código elaborado en target/generated-sources/delombok
.
<build>
<sourceDirectory>${project.build.directory}/generated-sources/delombok</sourceDirectory>
<plugins>
<plugin>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-maven-plugin</artifactId>
<version>1.16.6.1</version>
<executions>
<execution>
<id>delombok</id>
<phase>generate-sources</phase>
<goals>
<goal>delombok</goal>
</goals>
<configuration>
<addOutputDirectory>false</addOutputDirectory>
<sourceDirectory>src/main/java</sourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Tenga en cuenta que no debería tener que hackear otros complementos, como maven-jar-plugin
o maven-javadoc-plugin
, ya que deberían respetar el sourceDirectory
.
Use este truco bajo su propio riesgo. (Creo que esto puede confundir a tu IDE y a otros desarrolladores).
Cree un nuevo perfil de Maven , y en el nuevo perfil, simplemente redefina las fuentes:
<sourceDirectory>target/generated-sources/delombok</sourceDirectory>
Alternativamente
- Build helper: hay un helper de compilación que parece proporcionar esta funcionalidad, pero no lo he usado antes.
- Hack: hay un truco descrito aquí , pero el autor recomienda no hacerlo, y además: si vas a tomar el tiempo para modificar tu POM y crear este truco, también puedes hacer las cosas de la manera correcta e implementar un perfil.
Parece que no hay una buena manera de configurar Lombok Maven. El enfoque de "perfil" sugerido por @opyate no funciona debido a
http://jira.codehaus.org/browse/MNG-5310
Sin embargo, una solución realmente fea es simplemente tener otro pom.xml
, idéntico en todos los sentidos, excepto con el sourceDirectory
redefinido, usando los argumentos de línea de comando para usar el archivo como en: