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


195

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

Ответы:


279

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

18
просто записка для других (как и я), 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 20.10.16

4
Таким образом, лучший способ сделать это в 2017 году - создать пасту в формате XML. Никто не видит проблемы с этим?
Том

55

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

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

2
Работал на меня :) Затмение, похоже, не нравится. Кажется, он думает, что «src / main / java, src / interfaces» является единственным src, и поэтому помечает его как (отсутствует).
Джоэл

1
Для меня это заставило Maven 3.2.2 не найти никаких источников.
user149408

39

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

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

19
ИМХО это не очень хорошая идея, поскольку несколько плагинов принимают sourceDirectory- и, возможно, дополнительные sources- в качестве корней исходных файлов. В вашем решении, maven-compiler-pluginединственный плагин знает об этих фактических корнях.
Лоран Пирейн

3
@ Laurent Ты прав насчет этого. Это была хорошая идея пару лет назад, но сейчас есть гораздо лучшие варианты. Перечисленные выше сборочные помощники - мои предпочтительные варианты.
сала

5
Это не добавляет его в модель проекта, поэтому оно не будет работать правильно в IDE.
Дэвид Филлипс

+1 @sal это работало как шарм с зависимостью от проекта WAR.
ATorras

1
Это не может работать, если я хочу включить внешний исходный каталог (содержащий Java-класс, который я использую в моем проекте maven). Что если мой внешний источник находится вне рабочей области моего Eclipse? Что я могу сделать?
Aerox

16

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

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

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


Хотелось бы добавить, что это работает и в Eclipse, чтобы добавить сгенерированные источники в качестве исходного местоположения в конфигурации проекта.
Адам Хоукс

2
Этот путь, похоже, предназначен для источников, генерируемых процессорами аннотаций. Даже если это работает, некоторые плагины могут по-разному обрабатывать этот путь. Например, я ожидаю, что этот каталог может быть удален при запуске 'clean'.
Kapex

2
где ты это положил?
Павел Недоба

10

Это также работает с 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 / 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 / Импорт / сохранить исходные и тестовые папки при повторном импорте.
  • Добавить - Структура проекта / Настройки проекта / Модули / {Модуль} / Источники / Добавить корень контента.

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


Ни одна из этих опций не работает с IntelliJ Idea 9.0.4, которую я использую. Я не пробовал варианты build-helper с недавним Eclipse, но он не работал с 3.4 и плагином m2, когда я попробовал. Maven не любит множественные исходные деревья или множественные артефакты, созданные из одного и того же проекта, и любая попытка обойти это ограничение обычно является ужасным хаком.
Sal

Уже много лет на IntelliJ. И никогда не переключался на затмение, поэтому не могу говорить об этом, а потом слышать, что это вообще очень хорошо. Для IntelliJ Обновление личной лицензии раз в два года стоит 100 долларов в год. Новые основные версии обычно выходят каждый год в январе. Затем в последние 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

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

  • Для каждого исходного каталога вы должны создать собственный модуль.
  • Во всех модулях вы должны указать один и тот же каталог сборки: ${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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.