Компиляция Maven с несколькими каталогами src

Есть ли способ собрать несколько исходных каталогов Java в одном проекте Maven?

7 ответов

Решение

Вы можете добавить новый исходный каталог с помощью 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>

Я наивно так поступаю

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

Это сработало для меня

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

Чтобы он работал в intelliJ, вы также можете добавить

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

в maven-компилятор-плагин

Это также работает с 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>

Это работало с 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>

Хотя ответ от 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>

Использовал build-helper-maven-plugin из поста - и обновил src / main / generate. И mvn clean compile работает на моем../common/src/main/java или на../common, поэтому сохранил последнее. Тогда да, подтверждая, что уровень компиляции IntelliJ IDEA (версия 10.5.2) не удался, как упоминал Дэвид Филлипс. Проблема заключалась в том, что IDEA не добавляла в проект другой источник root. Добавление его вручную решило проблему. Это нехорошо, так как редактирование чего-либо в проекте должно исходить от maven, а не от прямого редактирования опций проекта IDEA. Тем не менее, я буду в состоянии жить с этим, пока они не будут напрямую поддерживать build-helper-maven-plugin, так что он будет автоматически добавлять исходники.

Тогда нужен был другой обходной путь, чтобы сделать эту работу все же. Поскольку каждый раз, когда IDEA повторно импортировала настройки maven после смены pom, вновь добавленный источник сохранялся в модуле, но он терял выбор папок источника и был бесполезен. Так что для ИДЕИ - нужно установить их один раз:

  • Выберите - Настройки проекта / Maven / Импорт / сохранить исходные и тестовые папки при повторном импорте.
  • Добавить - Структура проекта / Настройки проекта / Модули / {Модуль} / Источники / Добавить корень контента.

Сохранение этих папок при импорте также не является лучшей практикой в ​​мире,... но стоит попробовать.

В конфигурации вы можете использовать <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

поиск по идентификатору, цели или названию плагина. Это может помочь и с другими плагинами. Eclipse, intelliJ может показывать не все конфигурации в качестве предложений.

Это можно сделать в два этапа:

  • Для каждого исходного каталога вы должны создать собственный модуль.
  • Во всех модулях вы должны указать один и тот же каталог сборки: ${build.directory}

Если вы работаете с запущенной Jetty (jetty:run), то перекомпиляция любого класса в любом модуле (с Maven, IDEA или Eclipse) приведет к перезапуску Jetty. То же самое поведение вы получите для измененных ресурсов.

Другие вопросы по тегам