Maven compile avec plusieurs répertoires src

194

Existe-t-il un moyen de compiler plusieurs répertoires source java dans un seul projet maven?

sal
la source

Réponses:

278

Vous pouvez ajouter un nouveau répertoire source avec 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>
SilverNak
la source
2
Le seul problème avec cette approche est que l'artefact final inclut également les fichiers source java (fichiers .java). Existe-t-il un moyen d'exclure les fichiers source et d'inclure uniquement les fichiers .class?
saravana_pc
17
juste une note pour les autres (comme moi), l' pluginélément est dans /project/build/pluginset NON dans/project/build/pluginManagement/plugins
Betlista
3
Si vous utilisez eclipse, vous voudrez peut-être installer m2e connector for build-helper-maven-plugindepuis eclipse marketplace pour supprimer l'erreur dans pom.xml
dieend
1
Si vous recevez un avertissement comme 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingvous devez l'ajouter dans <plugin>la balise<version>1.12</version>
Alphaaa
4
Donc, la meilleure façon de le faire, en 2017, était de créer des pâtes XML. Personne ne voit de problème avec ça?
Tom
55

Je le fais naïvement de cette façon:

<build>
  <finalName>osmwse</finalName>
  <sourceDirectory>src/main/java, src/interfaces, src/services</sourceDirectory>
</build>
viens en prendre
la source
2
Cela a fonctionné pour moi :) Eclipse ne semble pas l'aimer cependant. Il semble penser que "src / main / java, src / interfaces" est un src unique, et le marque donc comme (manquant).
Joel
1
Pour moi, cela a conduit Maven 3.2.2 à ne trouver aucune source.
user149408
40

Cela a fonctionné pour moi

<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>
sal
la source
18
Pas une si bonne idée à mon humble avis, car plusieurs plugins supposent sourceDirectory- et éventuellement supplémentaires sources- que les racines des fichiers source. Dans votre solution, le maven-compiler-pluginest le seul plugin connaissant ces racines réelles.
Laurent Pireyn
3
@Laurent Vous avez raison à ce sujet. C'était une bonne idée il y a quelques années, mais il existe maintenant de bien meilleures options. build-helper répertorié ci-dessus est mes options préférées.
sal
5
Cela ne l'ajoute pas au modèle de projet, il ne fonctionnera donc pas correctement dans les IDE.
David Phillips
+1 @sal cela a fonctionné comme un charme avec une dépendance de projet WAR.
ATorras
1
Cela ne peut pas fonctionner si je veux inclure un répertoire source externe (contenant la classe Java que j'utilise dans mon projet maven). Que faire si ma source externe est située en dehors de l'espace de travail d'Eclipse? Que puis-je faire?
Aerox
16

pour le faire fonctionner dans intelliJ, vous pouvez également ajouter

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

à maven-compiler-plugin

domi.vds
la source
J'aimerais ajouter que cela a également fonctionné dans Eclipse pour ajouter les sources générées comme emplacement source dans la configuration du projet.
Adam Hawkes
2
Ce chemin semble cependant être pour les sources générées par les processeurs d'annotation. Même si cela fonctionne, il est possible que ce chemin soit géré différemment par certains plugins. Par exemple, je m'attendrais à ce que ce répertoire puisse être supprimé lorsque «clean» est exécuté.
kapex
2
où l'avez-vous mis?
Pavel Niedoba
10

Cela fonctionne également avec maven en définissant la balise de ressources. Vous pouvez nommer les noms de vos dossiers src comme bon vous semble.

    <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>
sendon1982
la source
8
maven.apache.org/pom.html#Resources ->Resources are not (usually) code. They are not compiled
SJuan76
4

Cela a fonctionné avec maven 3.5.4 et maintenant Intellij Idea voit ce code comme source:

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

Utilisé le plugin build-helper-maven du post - et mettre à jour src / main / généré. Et mvn clean compile fonctionne sur mon ../common/src/main/java, ou sur ../common, donc gardez ce dernier. Alors oui, confirmant que le niveau IntelliJ IDEA (ver 10.5.2) de la compilation a échoué comme l'a mentionné David Phillips. Le problème était que IDEA n'a pas ajouté une autre racine source au projet. L'ajouter manuellement a résolu le problème. Ce n'est pas bien car éditer quoi que ce soit dans le projet devrait provenir de maven et non de l'édition directe des options du projet IDEA. Pourtant, je pourrai vivre avec jusqu'à ce qu'ils prennent en charge build-helper-maven-plugin directement, de sorte qu'il ajoutera automatiquement les sources.

Il fallait ensuite une autre solution de contournement pour que cela fonctionne. Depuis chaque fois que IDEA a réimporté les paramètres maven après un changement de pom, la nouvelle source ajoutée a été conservée sur le module, mais elle a perdu ses sélections de dossiers source et était inutile. Donc, pour IDEA - vous devez définir ces paramètres une fois:

  • Sélectionnez - Paramètres du projet / Maven / Importation / conserver les dossiers source et de test lors de la réimportation.
  • Ajouter - Structure du projet / Paramètres du projet / Modules / {Module} / Sources / Ajouter une racine de contenu.

Maintenant, garder ces dossiers à l'importation n'est pas non plus la meilleure pratique au monde, ..., mais l'essayer.

arntg
la source
Aucune des deux options ne fonctionne avec IntelliJ Idea 9.0.4, ce que j'utilise. Je n'ai pas essayé les options d'aide à la construction avec la récente Eclipse, mais cela ne fonctionnait pas avec 3.4 et le plugin m2 lorsque je l'ai essayé. Maven n'aime pas les arborescences de sources multiples ou les artefacts multiples construits à partir du même projet.Toute tentative de contourner cette limitation est généralement un hack terrible.
sal
Je suis sur IntelliJ depuis de nombreuses années maintenant. Et je ne suis jamais passé à l'éclipse, donc je ne peux pas parler pour ça, alors entendre c'est généralement très bien aussi. Pour IntelliJ, la mise à niveau d'une licence personnelle tous les deux ans est de 100 $ / an. Les nouvelles versions majeures sont généralement publiées chaque année en janvier. Ensuite, au cours des 2-3 derniers mois de l'année précédente, ils vous permettent d'acheter la version précédente et d'obtenir la mise à niveau vers la prochaine gratuitement. C'est en ce moment donc c'est le moment "sûr" d'acheter 10 et d'en obtenir 11. De plus, si vous n'avez pas besoin de JSP et d'autres fonctionnalités d'entreprise, utilisez l'édition communautaire gratuite.
arntg
2

Bien que la réponse d'evokk soit fondamentalement correcte, il manque des classes de test . Vous devez ajouter des classes de test avec objectif 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>
radzimir
la source
1

Cela peut se faire en deux étapes:

  • Pour chaque répertoire source, vous devez créer votre propre module.
  • Dans tous les modules, vous devez spécifier le même répertoire de construction: ${build.directory}

Si vous travaillez avec Jetty ( jetty:run) démarré , la recompilation de n'importe quelle classe dans n'importe quel module (avec Maven, IDEA ou Eclipse) entraînera le redémarrage de Jetty. Le même comportement que vous obtiendrez pour les ressources modifiées.

Ursa
la source
1

Dans la configuration, vous pouvez utiliser <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>

ce sont toutes les configurations disponibles pour la version 3.8.1 du plugin du compilateur. Différentes versions ont des configurations différentes que vous pouvez trouver en exécutant votre code avec -Xaprès la commande générale mvn. Comme

mvn clean install -X
mvn compiler:compile -X

et effectuez une recherche avec un identifiant, un objectif ou un nom de plugin. Cela peut également être utile avec d'autres plugins. Eclipse, intelliJ peut ne pas afficher toutes les configurations comme suggestions.

Prabhu
la source