Mavenは複数のsrcディレクトリでコンパイルします


194

単一のmavenプロジェクトで複数のJavaソースディレクトリをコンパイルする方法はありますか?

回答:


278

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
このアプローチの唯一の問題は、最終的なアーティファクトにJavaソースファイル(.javaファイル)も含まれることです。ソースファイルを除外し、.classファイルのみを含める方法はありますか?
saravana_pc 2012

17
他の人(私のような)への単なるメモ、plugin要素は含まれているの/project/build/pluginsではなく/project/build/pluginManagement/plugins
Betlista

3
Eclipseを使用している場合はm2e connector for build-helper-maven-plugin、Eclipseマーケットプレイスからインストールしてpom.xmlのエラーを削除することをお勧めします
dieend

1
タグ'build.plugins.plugin.version' for org.codehaus.mojo:build-helper-maven-plugin is missing内に追加する必要があるような警告を受け取った場合<plugin><version>1.12</version>
Alphaaa

4
したがって、これを行う最良の方法は、2017年にXMLパスタを作成することでした。誰もそれで問題を見ませんか?
トム

55

私は単純にこのようにします:

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

2
私のために働いた:) Eclipseはそれを好きではないようです。「src / main / java、src / interfaces」は単一のsrcであると考えられているため、(欠落)としてフラグを立てます。
Joel

1
私にとって、Maven 3.2.2はソースを見つけられませんでした。
user149408

40

これは私のために働いた

<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
いくつかのプラグインがソースファイルのルートとして- sourceDirectory場合によっては追加sources-を想定しているため、このような良い考えはありません。あなたのソリューションでmaven-compiler-pluginは、これらが実際のルートを認識する唯一のプラグインです。
Laurent Pireyn、2011年

3
@Laurentその通りです。これは数年前には良い考えでしたが、今ではもっと良い選択肢があります。上記のビルドヘルパーは、私の推奨オプションです。
SAL

5
これはプロジェクトモデルに追加しないため、IDEでは正しく機能しません。
デビッドフィリップス

+1 @salは、WARプロジェクトに依存する魅力のように機能しました。
ATorras

1
これは、外部ソースディレクトリ(私のMavenプロジェクトで使用しているJavaクラスを含む)を含めたい場合には機能しません。外部ソースがEclipseのワークスペースの外にある場合はどうなりますか?私に何ができる?
Aerox

16

intelliJで機能させるには、

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

maven-compiler-pluginへ


これがEclipseでも機能したことを追加し、生成されたソースをプロジェクト構成のソースの場所として追加します。
アダムホークス2013

2
ただし、このパスは注釈プロセッサによって生成されたソースを対象としているようです。動作しても、一部のプラグインではこのパスの処理が異なる可能性があります。たとえば、「clean」を実行すると、このディレクトリが削除されると思います。
kapex 2018年

2
どこに置いたの?
Pavel Niedoba、2018

10

これは、resourcesタグを定義することにより、mavenでも機能します。srcフォルダーには、好きな名前を付けることができます。

    <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

これはmaven 3.5.4で機能し、Intellij Ideaはこのコードをソースとして表示します。

       <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

投稿のbuild-helper-maven-pluginを使用し、src / main / generatedを更新しました。また、mvn clean compileは../common/src/main/javaまたは../commonで機能するため、後者を維持します。その後、そうです。DavidPhillipsが言及したように、IntelliJ IDEA(バージョン10.5.2)レベルのコンパイルが失敗したことを確認します。問題は、IDEAがプロジェクトに別のソースルートを追加しなかったことでした。手動で追加すると問題が解決しました。IDEAのプロジェクトオプションを直接編集するのではなく、プロジェクトのすべてを編集するのはmavenから行う必要があるため、これは良くありません。それでも、ソースが自動的に追加されるようにbuild-helper-maven-pluginを直接サポートするまでは、私はそれと共存できます。

次に、これを機能させるために別の回避策が必要でした。IDEAがpomの変更後にMaven設定を再インポートするたびに、新しく追加したソースがモジュールに保持されていましたが、ソースフォルダーの選択が失われ、役に立たなくなりました。IDEAの場合-これらを一度設定する必要があります:

  • 選択-プロジェクト設定/ Maven /インポート/再インポート時にソースとテストフォルダーを保持します。
  • 追加-プロジェクト構造/プロジェクト設定/モジュール/ {モジュール} /ソース/コンテンツルートの追加。

現在、これらのフォルダをインポート時に保持することは、世界でもベストプラクティスではありませんが、試してみてください。


どちらのオプションも、私が使用しているIntelliJ Idea 9.0.4では機能しません。最近のEclipseでビルドヘルパーオプションを試していませんが、3.4とm2プラグインでは試しましたが、うまくいきませんでした。Mavenは、同じプロジェクトからビルドされた複数のソースツリーや複数のアーティファクトを好みません。この制限を回避しようとする試みは通常、ひどいハックです。
SAL

長年IntelliJを利用しています。そして、皆既日食に切り替えたことがないので、それについて話すことができず、それを聞くのも一般的にとても良いです。IntelliJの場合個人ライセンスの1年おきのアップグレードは100ドル/年です。新しいメジャーバージョンは通常、毎年1月にリリースされます。その後、昨年の最後の2〜3か月で、以前のバージョンを購入して、次のバージョンへのアップグレードを無料で入手できるようになっています。現在、10を購入して11を取得するのは「安全な」時間です。また、JSPおよびその他のエンタープライズ機能が必要ない場合は、無料のコミュニティエディションを使用してください。
arntg

2

evokkからの答えは基本的に正しいですが、テストクラスがありません。目標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

これは次の2つのステップで実行できます。

  • ソースディレクトリごとに、独自のモジュールを作成する必要があります。
  • すべてのモジュールで、同じビルドディレクトリを指定する必要があります。 ${build.directory}

起動したJetty(jetty:run)で作業する場合、(Maven、IDEA、またはEclipseを使用した)任意のモジュールの任意のクラスの再コンパイルにより、Jettyが再起動します。変更されたリソースに対して得られるのと同じ動作。


1

構成では、を使用できます<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>

これらは、コンパイラプラグインの3.8.1バージョンで使用できるすべての構成です。異なるバージョンには異なる構成があり-X、一般的なmvnコマンドの後にコードを実行することで見つけることができます。お気に入り

mvn clean install -X
mvn compiler:compile -X

そして、ID、ゴール、またはプラグイン名で検索します。これは他のプラグインにも役立ちます。Eclipse、intelliJはすべての構成を提案として表示しない場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.