Maven mengkompilasi dengan beberapa direktori src


194

Apakah ada cara untuk mengkompilasi beberapa direktori sumber java dalam satu proyek pakar?

Jawaban:


278

Anda dapat menambahkan direktori sumber baru dengan 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
Satu-satunya masalah dengan pendekatan ini adalah bahwa artifak final juga menyertakan file sumber java (file .java). Apakah ada cara untuk mengecualikan file sumber dan hanya menyertakan file .class?
saravana_pc

17
hanya catatan untuk orang lain (seperti saya), pluginelemen dalam /project/build/pluginsdan BUKAN dalam/project/build/pluginManagement/plugins
Betlista

3
Jika Anda menggunakan eclipse, Anda mungkin ingin menginstal m2e connector for build-helper-maven-plugindari eclipse marketplace untuk menghapus kesalahan di pom.xml
dieend

1
Jika Anda menerima peringatan seperti 'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missingAnda perlu menambahkan di <plugin>dalam tag<version>1.12</version>
Alphaaa

4
Jadi cara terbaik untuk melakukan ini, pada 2017, adalah membuat pasta XML. Apakah tidak ada yang melihat masalah dengan itu?
Tom

55

Dengan naif saya melakukannya dengan cara ini:

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

2
Berhasil bagi saya untuk :) Eclipse sepertinya tidak menyukainya. Tampaknya berpikir "src / main / java, src / interfaces" adalah src tunggal, dan karenanya menandainya sebagai (hilang).
Joel

1
Bagi saya, itu menyebabkan Maven 3.2.2 tidak menemukan sumber.
user149408

40

Ini berhasil untuk saya

<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
Bukan ide yang bagus IMHO, karena beberapa plugin menganggap sourceDirectory- dan mungkin tambahan sources- sebagai akar dari file sumber. Dalam solusi Anda, maven-compiler-pluginini adalah satu-satunya plugin yang mengetahui akar sebenarnya ini.
Laurent Pireyn

3
@ Laurent Anda benar tentang itu. Ini adalah ide yang bagus beberapa tahun yang lalu tetapi ada banyak pilihan yang lebih baik sekarang. build-helper yang tercantum di atas adalah opsi yang saya sukai.
sal

5
Ini tidak menambahkannya ke model proyek, sehingga tidak akan berfungsi dengan benar dalam IDE.
David Phillips

+1 @sal berfungsi seperti pesona dengan ketergantungan proyek WAR.
ATorras

1
Ini tidak dapat berfungsi jika saya ingin memasukkan direktori sumber eksternal (berisi kelas Java yang saya gunakan dalam proyek pakar saya). Bagaimana jika sumber eksternal saya terletak di luar ruang kerja Eclipse saya? Apa yang dapat saya?
Aerox

16

untuk membuatnya bekerja di intelliJ, Anda juga bisa menambahkan

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

untuk maven-compiler-plugin


Ingin menambahkan bahwa ini berfungsi di Eclipse juga untuk menambahkan sumber yang dihasilkan sebagai lokasi sumber dalam konfigurasi proyek.
Adam Hawkes

2
Jalur ini tampaknya untuk sumber yang dihasilkan oleh prosesor anotasi. Bahkan jika itu bekerja, ada kemungkinan bahwa jalur ini ditangani secara berbeda oleh beberapa plugin. Misalnya saya berharap direktori ini bisa dihapus ketika 'bersih' dijalankan.
kapex

2
dimana kamu taruh itu
Pavel Niedoba

10

Ini juga berfungsi dengan pakar dengan mendefinisikan tag sumber daya. Anda dapat memberi nama nama folder src Anda apa pun yang Anda suka.

    <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

Ini berfungsi dengan maven 3.5.4 dan sekarang Intellij Idea melihat kode ini sebagai sumber:

       <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

Menggunakan build-helper-maven-plugin dari postingan - dan memperbarui src / main / dihasilkan. Dan mvn kompilasi bersih berfungsi pada ../common/src/main/java saya, atau pada ../common, jadi simpan yang terakhir. Maka ya, mengonfirmasi bahwa tingkat kompilasi IntelliJ IDEA (ver 10.5.2) gagal seperti yang disebutkan oleh David Phillips. Masalahnya adalah bahwa IDEA tidak menambahkan root sumber lain ke proyek. Menambahkannya secara manual memecahkan masalah. Ini tidak baik karena mengedit apa pun dalam proyek harus berasal dari pakar dan bukan dari pengeditan langsung opsi proyek IDEA. Namun saya akan dapat hidup dengannya sampai mereka mendukung build-helper-maven-plugin secara langsung sehingga akan secara otomatis menambahkan sumber.

Kemudian perlu solusi lain untuk membuat pekerjaan ini. Karena setiap kali IDEA mengimpor ulang pengaturan pakar setelah pom mengubah saya, sumber yang baru ditambahkan disimpan dalam modul, namun kehilangan pilihan Sumber Folder itu dan tidak berguna. Jadi untuk IDEA - perlu mengatur ini sekali:

  • Pilih - Pengaturan Proyek / Maven / Mengimpor / menyimpan sumber dan menguji folder pada impor ulang.
  • Tambah - Struktur Proyek / Pengaturan Proyek / Modul / {Modul} / Sumber / Tambahkan Root Konten.

Sekarang menjaga folder tersebut pada impor juga bukan praktik terbaik di dunia, ..., tetapi cobalah.


Tidak ada opsi yang bekerja dengan IntelliJ Idea 9.0.4 yang merupakan apa yang saya gunakan. Belum mencoba opsi build-helper dengan Eclipse baru-baru ini, tetapi tidak berhasil dengan plugin 3.4 dan m2 ketika saya mencobanya. Maven tidak suka banyak pohon sumber atau banyak artefak yang dibangun dari proyek yang sama setiap upaya untuk mengatasi batasan ini biasanya merupakan peretasan yang mengerikan.
sal

Sudah di IntelliJ selama bertahun-tahun sekarang. Dan tidak pernah beralih ke gerhana, jadi tidak bisa bicara untuk itu, kemudian mendengar itu umumnya sangat baik. Untuk IntelliJ Meningkatkan lisensi pribadi setiap tahun adalah $ 100 / tahun. Versi utama baru biasanya keluar setiap tahun di bulan Januari. Kemudian pada 2-3 bulan terakhir tahun sebelumnya mereka memungkinkan Anda untuk membeli versi sebelumnya dan mendapatkan yang gratis ke versi mendatang. Ini sedang aktif sekarang, jadi ini saatnya "aman" untuk membeli 10 dan mendapatkan 11. Selain itu, jika Anda tidak memerlukan JSP dan fitur perusahaan lainnya, gunakan edisi komunitas gratis.
arntg

2

Meskipun jawaban dari evokk pada dasarnya benar, namun tidak ada kelas tes . Anda harus menambahkan kelas tes dengan sumber add-test-tujuan :

                        <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

Ini dapat dilakukan dalam dua langkah:

  • Untuk setiap direktori sumber Anda harus membuat modul sendiri.
  • Di semua modul Anda harus menentukan direktori build yang sama: ${build.directory}

Jika Anda bekerja dengan memulai Jetty ( jetty:run), maka kompilasi ulang setiap kelas dalam modul apa pun (dengan Maven, IDEA atau Eclipse) akan mengarah ke restart Jetty. Perilaku yang sama Anda akan dapatkan untuk sumber daya yang dimodifikasi.


1

Dalam konfigurasi, Anda dapat menggunakan <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>

ini semua konfigurasi yang tersedia untuk versi 3.8.1 dari plugin kompiler. Versi berbeda memiliki konfigurasi berbeda yang dapat Anda temukan dengan menjalankan kode Anda -Xsetelah perintah mvn umum. Suka

mvn clean install -X
mvn compiler:compile -X

dan cari dengan id atau tujuan atau nama plugin Ini juga dapat membantu dengan plugin lain. Eclipse, intelliJ mungkin tidak menampilkan semua konfigurasi sebagai saran.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.