Maven kompilieren mit mehreren src-Verzeichnissen


194

Gibt es eine Möglichkeit, mehrere Java-Quellverzeichnisse in einem einzigen Maven-Projekt zu kompilieren?

Antworten:


278

Sie können mit build-helper ein neues Quellverzeichnis hinzufügen:

<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
Das einzige Problem bei diesem Ansatz ist, dass das endgültige Artefakt auch die Java-Quelldateien (Java-Dateien) enthält. Gibt es eine Möglichkeit, die Quelldateien auszuschließen und nur die .class-Dateien einzuschließen?
saravana_pc

17
Nur eine Notiz für andere (wie mich), pluginElement ist in /project/build/pluginsund NICHT in/project/build/pluginManagement/plugins
Betlista

3
Wenn Sie Eclipse verwenden, möchten Sie möglicherweise m2e connector for build-helper-maven-pluginvom Eclipse-Marktplatz installieren , um den Fehler in pom.xml zu entfernen
dieend

1
Wenn Sie eine Warnung erhalten, wie 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingSie sie innerhalb <plugin>des Tags hinzufügen müssen<version>1.12</version>
Alphaaa

4
Der beste Weg, dies im Jahr 2017 zu tun, war die Erstellung einer XML-Pasta. Sieht niemand ein Problem damit?
Tom

55

Ich mache es naiv so:

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

2
Hat für mich funktioniert :) Eclipse scheint es aber nicht zu mögen. Es scheint zu denken, dass "src / main / java, src / interfaces" ein einzelnes src ist und es daher als (fehlend) kennzeichnet.
Joel

1
Für mich führte dies dazu, dass Maven 3.2.2 keine Quellen fand.
user149408

40

Das hat bei mir funktioniert

<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 keine so gute Idee, da mehrere Plugins die sourceDirectory- und möglicherweise zusätzliche sources- als Wurzeln von Quelldateien annehmen . In Ihrer Lösung ist das maven-compiler-plugindas einzige Plugin , das diese tatsächlichen Wurzeln kennt.
Laurent Pireyn

3
@Laurent Da hast du recht. Das war vor ein paar Jahren eine gute Idee, aber jetzt gibt es viel bessere Möglichkeiten. Der oben aufgeführte Build-Helfer ist meine bevorzugte Option.
Sal

5
Dadurch wird es nicht zum Projektmodell hinzugefügt, sodass es in IDEs nicht ordnungsgemäß funktioniert.
David Phillips

+1 @sal es funktionierte wie ein Zauber mit einer WAR-Projektabhängigkeit.
ATorras

1
Dies kann nicht funktionieren, wenn ich ein externes Quellverzeichnis einschließen möchte (das die Java-Klasse enthält, die ich in meinem Maven-Projekt verwende). Was passiert, wenn sich meine externe Quelle außerhalb des Arbeitsbereichs meiner Eclipse befindet? Was kann ich tun?
Aerox

16

Damit es in IntelliJ funktioniert, können Sie auch hinzufügen

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

zum Maven-Compiler-Plugin


Ich möchte hinzufügen, dass dies auch in Eclipse funktioniert hat, um die generierten Quellen als Quellspeicherort in der Projektkonfiguration hinzuzufügen.
Adam Hawkes

2
Dieser Pfad scheint jedoch für Quellen zu gelten, die von Anmerkungsprozessoren generiert wurden. Selbst wenn es funktioniert, ist es möglich, dass dieser Pfad von einigen Plugins unterschiedlich behandelt wird. Zum Beispiel würde ich erwarten, dass dieses Verzeichnis gelöscht werden könnte, wenn 'clean' ausgeführt wird.
Kapex

2
wo hast du es hingelegt ?
Pavel Niedoba

10

Dies funktioniert auch mit maven, indem das Ressourcen-Tag definiert wird. Sie können Ihre src-Ordnernamen beliebig benennen.

    <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

Dies funktionierte mit Maven 3.5.4 und jetzt sieht Intellij Idea diesen Code als Quelle:

       <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

Verwendete das Build-Helper-Maven-Plugin aus dem Post - und aktualisiere src / main / generate. Und mvn clean compile funktioniert auf meinem ../common/src/main/java oder auf ../common, also behalte letzteres bei. Dann ja, um zu bestätigen, dass die IntelliJ IDEA (Version 10.5.2) -Ebene der Kompilierung fehlgeschlagen ist, wie David Phillips erwähnt hat. Das Problem war, dass IDEA dem Projekt keinen weiteren Quellstamm hinzufügte. Durch manuelles Hinzufügen wurde das Problem behoben. Es ist nicht schön, da die Bearbeitung von Elementen im Projekt von Maven stammen sollte und nicht von der direkten Bearbeitung der IDEA-Projektoptionen. Ich werde jedoch in der Lage sein, damit zu leben, bis sie das Build-Helper-Maven-Plugin direkt unterstützen, sodass die Quellen automatisch hinzugefügt werden.

Dann brauchte ich eine weitere Problemumgehung, damit dies funktioniert. Da jedes Mal, wenn IDEA die Maven-Einstellungen nach einem POM-Wechsel erneut importierte, die neu hinzugefügte Quelle im Modul beibehalten wurde, verlor sie die Auswahl der Quellordner und war nutzlos. Also für IDEA - müssen diese einmal einstellen:

  • Wählen Sie - Projekteinstellungen / Maven / Importieren / Quell- und Testordner beim erneuten Import beibehalten.
  • Hinzufügen - Projektstruktur / Projekteinstellungen / Module / {Modul} / Quellen / Inhaltsstamm hinzufügen.

Jetzt ist es auch nicht die beste Vorgehensweise der Welt, diese Ordner beim Import zu behalten, ... aber es auszuprobieren.


Keine der beiden Optionen funktioniert mit IntelliJ Idea 9.0.4, das verwende ich. Ich habe die Build-Helper-Optionen mit der letzten Eclipse nicht ausprobiert, aber es hat mit 3.4 und dem m2-Plugin nicht funktioniert, als ich es ausprobiert habe. Maven mag nicht mehrere Quellbäume oder mehrere Artefakte, die aus demselben Projekt erstellt wurden. Jeder Versuch, diese Einschränkung zu umgehen, ist normalerweise ein schrecklicher Hack.
Sal

Ich bin jetzt seit vielen Jahren auf IntelliJ. Und nie auf Eclipse umgestellt, kann also nicht dafür sprechen und dann hören, dass es im Allgemeinen auch sehr gut ist. Für IntelliJ Das Upgrade einer persönlichen Lizenz alle zwei Jahre kostet 100 US-Dollar pro Jahr. Die neuen Hauptversionen erscheinen normalerweise jedes Jahr im Januar. In den letzten zwei bis drei Monaten des Vorjahres können Sie dann die vorherige Version kaufen und das Upgrade auf die kommende Version kostenlos erhalten. Dies ist im Moment so, dass es die "sichere" Zeit ist, 10 zu kaufen und 11 zu erhalten. Wenn Sie JSP und andere Unternehmensfunktionen nicht benötigen, verwenden Sie die kostenlose Community-Edition.
Arntg

2

Während die Antwort von evokk grundsätzlich richtig ist, es fehlt Testklassen . Sie müssen Testklassen mit dem Ziel add-test-source hinzufügen :

                        <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

Dies kann in zwei Schritten erfolgen:

  • Für jedes Quellverzeichnis sollten Sie ein eigenes Modul erstellen.
  • In allen Modulen sollten Sie dasselbe Build-Verzeichnis angeben: ${build.directory}

Wenn Sie mit gestartetem Jetty ( jetty:run) arbeiten, führt die Neukompilierung einer Klasse in einem beliebigen Modul (mit Maven, IDEA oder Eclipse) zum Neustart von Jetty. Das gleiche Verhalten erhalten Sie für geänderte Ressourcen.


1

In der Konfiguration können Sie verwenden <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>

Dies sind alle Konfigurationen, die für die Version 3.8.1 des Compiler-Plugins verfügbar sind. Verschiedene Versionen haben unterschiedliche Konfigurationen, die Sie finden können, indem Sie Ihren Code -Xnach dem allgemeinen Befehl mvn ausführen . Mögen

mvn clean install -X
mvn compiler:compile -X

und Suche mit ID oder Ziel oder Plugin-Name Dies kann auch bei anderen Plugins hilfreich sein. Eclipse, IntelliJ zeigt möglicherweise nicht alle Konfigurationen als Vorschläge an.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.