Compilazione Maven con più directory src


195

C'è un modo per compilare più directory di sorgenti Java in un singolo progetto maven?

Risposte:


279

È possibile aggiungere una nuova directory di origine 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
L'unico problema con questo approccio è che l'artefatto finale include anche i file sorgente java (file .java). C'è un modo per escludere i file di origine e includere solo i file .class?
saravana_pc,

18
solo una nota per gli altri (come me), pluginelement is in /project/build/pluginse NOT in/project/build/pluginManagement/plugins
Betlista,

3
Se stai usando eclipse, potresti voler installare m2e connector for build-helper-maven-plugindal marketplace di eclipse per rimuovere l'errore in pom.xml
dieend

1
Se ricevi un avviso come quello che 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingdevi aggiungere all'interno <plugin>del tag<version>1.12</version>
Alphaaa,

4
Quindi il modo migliore per farlo, nel 2017, è stato creare una pasta XML. Nessuno vede un problema con quello?
Tom,

55

Lo faccio ingenuamente in questo modo:

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

2
Ha funzionato per me :) Eclipse non sembra gradirlo però. Sembra che "src / main / java, src / interfaces" sia un singolo src, e quindi lo contrassegna come (mancante).
Gioele,

1
Per me, ciò ha fatto sì che Maven 3.2.2 non trovasse alcuna fonte.
user149408

39

Questo ha funzionato per me

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

19
Non è una buona idea IMHO, dal momento che diversi plugin assumono sourceDirectory- e possibilmente ulteriori sources- come le radici dei file di origine. Nella tua soluzione, maven-compiler-pluginè l'unico plugin a conoscenza di queste radici reali.
Laurent Pireyn,

3
@Laurent Hai ragione. Questa è stata una buona idea un paio di anni fa, ma ora ci sono opzioni molto migliori. build-helper elencato sopra sono le mie opzioni preferite.
sal

5
Questo non lo aggiunge al modello di progetto, quindi non funzionerà correttamente negli IDE.
David Phillips,

+1 @sal ha funzionato come un incantesimo con una dipendenza dal progetto WAR.
ATorras,

1
Questo non può funzionare se voglio includere una directory di origine esterna (contenente la classe Java che sto usando nel mio progetto Maven). Cosa succede se la mia fonte esterna si trova al di fuori dell'area di lavoro di Eclipse? Cosa posso fare?
Aerox,

16

per farlo funzionare in IntelliJ, puoi anche aggiungere

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

a maven-compilatore-plugin


Vorrei aggiungere che questo ha funzionato anche in Eclipse per aggiungere le fonti generate come posizione di origine nella configurazione del progetto.
Adam Hawkes,

2
Questo percorso sembra essere per le fonti generate dai processori di annotazioni. Anche se funziona, è possibile che questo percorso sia gestito in modo diverso da alcuni plugin. Ad esempio, mi aspetto che questa directory possa essere eliminata quando viene eseguito 'clean'.
Kapex,

2
dove l'hai messo ?
Pavel Niedoba,

10

Questo funziona anche con Mavven definendo il tag delle risorse. Puoi nominare i nomi delle tue cartelle src come preferisci.

    <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

Questo ha funzionato con Maven 3.5.4 e ora Intellij Idea vede questo codice come 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

Ho usato il plug-in build-helper-maven dal post - e aggiorna src / main / generate. E mvn clean compile funziona sul mio ../common/src/main/java, o su ../common, quindi ho mantenuto quest'ultimo. Quindi sì, confermando che il livello della compilation di IntelliJ IDEA (versione 10.5.2) è fallito, come menzionato da David Phillips. Il problema era che IDEA non ha aggiunto un'altra radice di origine al progetto. L'aggiunta manualmente ha risolto il problema. Non è bello in quanto la modifica di qualcosa nel progetto dovrebbe provenire da Maven e non dalla modifica diretta delle opzioni del progetto IDEA. Tuttavia sarò in grado di convivere con esso fino a quando non supportano direttamente build-helper-maven-plugin in modo tale da aggiungere automaticamente le fonti.

Quindi aveva bisogno di un'altra soluzione alternativa per farlo funzionare però. Dal momento che ogni volta che IDEA ha reimportato le impostazioni di Maven dopo un cambio di pom, il nuovo sorgente aggiunto è stato mantenuto sul modulo, eppure ha perso le selezioni delle cartelle di origine ed è stato inutile. Quindi per IDEA - è necessario impostare questi una volta:

  • Selezionare - Impostazioni progetto / Maven / Importazione / Mantieni origine e prova cartelle su reimport.
  • Aggiungi - Struttura progetto / Impostazioni progetto / Moduli / {Modulo} / Sorgenti / Aggiungi radice contenuto.

Ora mantenere quelle cartelle all'importazione non è la migliore pratica al mondo, ..., ma provarlo.


Nessuna opzione funziona con IntelliJ Idea 9.0.4, che è quello che uso. Non ho provato le opzioni di build-helper con il recente Eclipse, ma non ha funzionato con 3.4 e il plugin m2 quando l'ho provato. A Maven non piacciono gli alberi di più fonti o più artefatti creati dallo stesso progetto, ogni tentativo di aggirare questa limitazione è di solito un brutto scherzo.
sal

Sono in IntelliJ da molti anni ormai. E non sono mai passato all'eclissi, quindi non posso parlarne, quindi sentirlo è generalmente molto buono. Per IntelliJ L'aggiornamento di una licenza personale ogni due anni è di $ 100 / anno. Le nuove versioni principali di solito escono ogni anno a gennaio. Quindi negli ultimi 2-3 mesi dell'anno precedente ti stanno permettendo di acquistare la versione precedente e ottenere l'aggiornamento a quello imminente gratuitamente. Adesso è attivo, quindi è il momento "sicuro" di acquistare 10 e ottenere 11. Inoltre, se non hai bisogno di JSP e di altre funzionalità aziendali, usa l'edizione gratuita della community.
arntg

2

Sebbene la risposta di evokk sia sostanzialmente corretta, mancano le classi di test . Devi aggiungere classi di test con obiettivo 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

Questo può essere fatto in due passaggi:

  • Per ogni directory di origine è necessario creare il proprio modulo.
  • In tutti i moduli è necessario specificare la stessa directory di build: ${build.directory}

Se lavori con Jetty avviato ( jetty:run), la ricompilazione di qualsiasi classe in qualsiasi modulo (con Maven, IDEA o Eclipse) porterà al riavvio di Jetty. Lo stesso comportamento che otterrai per le risorse modificate.


1

Nella configurazione, è possibile utilizzare <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>

queste sono tutte le configurazioni disponibili per la versione 3.8.1 del plug-in del compilatore. Versioni diverse hanno configurazioni diverse che puoi trovare eseguendo il codice -Xdopo il comando generale mvn. Piace

mvn clean install -X
mvn compiler:compile -X

e cerca con ID o obiettivo o nome del plug-in Questo può aiutare anche con altri plug-in. Eclipse, intelliJ potrebbe non mostrare tutte le configurazioni come suggerimenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.