Kompilacja Maven z wieloma katalogami src

194

Czy istnieje sposób na skompilowanie wielu katalogów źródeł Java w jednym projekcie maven?

sal
źródło

Odpowiedzi:

278

Możesz dodać nowy katalog źródłowy za pomocą 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
źródło
2
Jedynym problemem związanym z tym podejściem jest to, że końcowy artefakt zawiera również pliki źródłowe Java (pliki .java). Czy istnieje sposób na wykluczenie plików źródłowych i uwzględnienie tylko plików .class?
saravana_pc
17
tylko uwaga dla innych (takich jak ja), pluginelement jest w /project/build/plugins/project/build/pluginManagement/plugins
środku,
3
Jeśli używasz Eclipse, możesz zainstalować m2e connector for build-helper-maven-pluginz Eclipse Marketplace, aby usunąć błąd w pom.xml
dieend
1
Jeśli pojawi się ostrzeżenie, 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingże musisz dodać w <plugin>tagu<version>1.12</version>
Alphaaa
4
Najlepszym sposobem na zrobienie tego w 2017 roku było stworzenie makaronu XML. Czy nikt nie widzi z tym problemu?
Tom
55

Naiwnie robię to w ten sposób:

<build>
  <finalName>osmwse</finalName>
  <sourceDirectory>src/main/java, src/interfaces, src/services</sourceDirectory>
</build>
chodź weź trochę
źródło
2
Pracowało dla mnie :) Wydaje się, że Eclipse to nie lubi. Wygląda na to, że „src / main / java, src / interfaces” to pojedynczy src, a zatem oznacza go jako (brakujący).
Joel
1
Dla mnie to spowodowało, że Maven 3.2.2 nie znalazł żadnych źródeł.
user149408
40

To zadziałało dla mnie

<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
źródło
18
Nie jest to dobry pomysł IMHO, ponieważ kilka wtyczek zakłada sourceDirectory- i być może dodatkowe sources- jako katalogi źródłowe plików. W twoim rozwiązaniu maven-compiler-pluginjest to jedyna wtyczka, która zna te rzeczywiste korzenie.
Laurent Pireyn
3
@Laurent Masz rację. To był dobry pomysł kilka lat temu, ale teraz są o wiele lepsze opcje. Wspomagany przeze mnie build-helper to moje preferowane opcje.
sal
5
To nie dodaje go do modelu projektu, więc nie będzie działać poprawnie w IDE.
David Phillips,
+1 @sal działało jak urok z zależnością od projektu WAR.
ATorras,
1
Nie może to działać, jeśli chcę dołączyć zewnętrzny katalog źródłowy (zawierający klasę Java, której używam w moim projekcie maven). Co jeśli moje źródło zewnętrzne znajduje się poza obszarem roboczym mojego Eclipse? Co mogę zrobić?
Aerox
16

aby działało w intelliJ, możesz także dodać

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

do wtyczki kompilatora maven

domi.vds
źródło
Chciałbym dodać, że działało to również w Eclipse, aby dodać wygenerowane źródła jako lokalizację źródłową w konfiguracji projektu.
Adam Hawkes,
2
Wydaje się, że ta ścieżka dotyczy źródeł generowanych przez procesory adnotacji. Nawet jeśli działa, możliwe jest, że ta ścieżka jest obsługiwana w inny sposób przez niektóre wtyczki. Na przykład oczekiwałbym, że ten katalog może zostać usunięty po uruchomieniu „czystego”.
kapex
2
gdzie to położyłeś ?
Pavel Niedoba
10

Działa to również z maven, definiując znacznik zasobów. Możesz nazywać nazwy folderów src, jak tylko chcesz.

    <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
źródło
8
maven.apache.org/pom.html#Resources ->Resources are not (usually) code. They are not compiled
SJuan76
4

Działa to z maven 3.5.4, a teraz Intellij Idea widzi ten kod jako źródło:

       <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
źródło
2

Użyłem wtyczki build-helper-maven z posta i zaktualizowałem src / main / wygenerowano. A mvn clean compile działa na moim ../common/src/main/java lub na ../common, więc zachowałem to drugie. Tak, potwierdzając, że poziom kompilacji IntelliJ IDEA (wersja 10.5.2) nie powiódł się, jak wspomniał David Phillips. Problem polegał na tym, że IDEA nie dodała innego źródłowego katalogu głównego do projektu. Dodanie go ręcznie rozwiązało problem. To nie jest miłe, ponieważ edytowanie czegokolwiek w projekcie powinno pochodzić z raju, a nie z bezpośredniej edycji opcji projektu IDEA. Będę jednak mógł z nim żyć, dopóki nie będzie wspierał wtyczki build-helper-maven-plug, tak aby automatycznie dodawała źródła.

Potrzebowałem jednak innego obejścia, aby to zadziałało. Ponieważ za każdym razem, gdy IDEA ponownie importowała ustawienia maven po zmianie pom pom, nowo dodane źródło było przechowywane w module, ale traciło to wybór folderów źródłowych i było bezużyteczne. Więc dla IDEA - musisz ustawić je raz:

  • Wybierz - Ustawienia projektu / Maven / Importowanie / zachowaj foldery źródłowe i testowe przy ponownym imporcie.
  • Dodaj - Struktura projektu / Ustawienia projektu / Moduły / {Moduł} / Źródła / Dodaj katalog główny zawartości.

Teraz trzymanie tych folderów podczas importu nie jest najlepszą praktyką na świecie, ... ale daje szansę.

arntg
źródło
Żadna z tych opcji nie działa z IntelliJ Idea 9.0.4, z którego korzystam. Nie wypróbowałem opcji pomocnika kompilacji w ostatnim Eclipse, ale nie działało to z 3.4 i wtyczką m2, kiedy próbowałem. Maven nie lubi wielu drzew źródłowych ani wielu artefaktów zbudowanych z tego samego projektu, każda próba obejścia tego ograniczenia jest zwykle okropnym włamaniem.
sal
Są na IntelliJ od wielu lat. I nigdy nie przestawiłem się na zaćmienie, więc nie mogę o tym mówić, wtedy słysząc, że ogólnie jest bardzo dobry. W przypadku IntelliJ Aktualizacja licencji osobistej co drugi rok wynosi 100 USD rocznie. Nowe główne wersje są zwykle wypuszczane co roku w styczniu. Następnie w ciągu ostatnich 2-3 miesięcy poprzedniego roku pozwalają ci kupić poprzednią wersję i uzyskać bezpłatną aktualizację do nadchodzącej. To jest teraz włączone, więc jest to „bezpieczny” czas na zakup 10 i zdobycie 11. Ponadto, jeśli nie potrzebujesz JSP i innych funkcji dla przedsiębiorstw, skorzystaj z bezpłatnej wersji dla społeczności.
arntg 11.11.11
2

Chociaż odpowiedź z evokk jest zasadniczo poprawna, brakuje klas testowych . Musisz dodać klasy testowe z celem 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
źródło
1

Można to zrobić w dwóch krokach:

  • Dla każdego katalogu źródłowego powinieneś utworzyć własny moduł.
  • We wszystkich modułach należy podać ten sam katalog kompilacji: ${build.directory}

Jeśli pracujesz z uruchomioną Jetty ( jetty:run), wówczas rekompilacja dowolnej klasy w dowolnym module (z Maven, IDEA lub Eclipse) doprowadzi do ponownego uruchomienia Jetty. Takie samo zachowanie uzyskasz dla zmodyfikowanych zasobów.

ursa
źródło
1

W konfiguracji możesz użyć <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>

są to wszystkie konfiguracje dostępne dla wersji kompilatora 3.8.1. Różne wersje mają różne konfiguracje, które można znaleźć, uruchamiając kod za -Xpomocą ogólnej komendy mvn. Lubić

mvn clean install -X
mvn compiler:compile -X

i wyszukiwanie za pomocą identyfikatora lub celu lub nazwy wtyczki Może to pomóc również w przypadku innych wtyczek. Eclipse, intelliJ może nie wyświetlać wszystkich konfiguracji jako sugestii.

Prabhu
źródło