Компіляція 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 marketplace, щоб усунути помилку в 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
Я працював для мене :) Затемнення, мабуть, не подобається. Здається, що "src / main / java, src / інтерфейси" - це єдиний src, а тому позначає його як (відсутнє).
Джоель

1
Для мене це спричинило Maven 3.2.2 не знайти жодних джерел.
користувач149408

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
Не дуже гарна ідея IMHO, оскільки декілька плагінів вважають sourceDirectory- і, можливо, додатковими sources- як корені вихідних файлів. У вашому рішенні, maven-compiler-pluginєдиний плагін, обізнаний про ці фактичні корені.
Лоран Пірейн

3
@Laurent Ви маєте рацію з цим. Це була гарна ідея кілька років тому, але зараз є набагато кращі варіанти. перелічені вище помічники - це мої переважні варіанти.
сл

5
Це не додає його до проектної моделі, тому воно не буде працювати належним чином в IDE.
Девід Філліпс

+1 @sal це спрацьовувало як шарм із залежністю від проекту ВПО.
Аторрас

1
Це не може працювати, якщо я хочу включити каталог зовнішніх джерел (що містить клас Java, який я використовую у своєму проекті Maven). Що робити, якщо моє зовнішнє джерело знаходиться поза робочим простором мого Eclipse? Що я можу зробити?
Аерокс

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-плагін з поста - і оновлювали src / main / generated. І mvn чистий збірник працює на моєму ../common/src/main/java або на ../common, тому зберігав останнє. Тоді так, підтверджуючи, що рівень компіляції IntelliJ IDEA (версія 10.5.2) не вдався, як згадував Девід Філліпс. Проблема полягала в тому, що IDEA не додала іншого корінця до проекту. Додавши його вручну, вирішили проблему. Це не приємно, оскільки редагування будь-якого проекту повинно виходити з Maven, а не безпосередньо редагувати варіанти проектів IDEA. Але я зможу жити з цим, поки вони не підтримують плагін build-helper-maven-plugin безпосередньо таким чином, що він автоматично додаватиме джерела.

Тоді знадобився ще один спосіб вирішити цю роботу. Оскільки кожен раз, коли IDEA повторно імпортував параметри Maven після зміни пам’яті, щойно додане джерело зберігалось у модулі, проте воно втрачало вибір папок Source Source і було марним. Тож для IDEA - потрібно встановити їх один раз:

  • Виберіть - Налаштування проекту / Maven / Імпорт / зберігайте джерела та тестуйте папки під час повторного імпорту.
  • Додати - Структура проекту / Налаштування проекту / Модулі / {Модуль} / Джерела / Додати корінь вмісту.

Тепер збереження цих папок при імпорті також не є найкращою практикою у світі, ... але спробувати.


Жодна опція не працює з IntelliJ Idea 9.0.4, що я використовую. Я не випробовував параметри побудови-помічники з недавнім Eclipse, але він не працював із 3.4 та плагіном m2, коли я його спробував. Maven не любить кілька дерев-джерел або безліч артефактів, побудованих з одного проекту, будь-яка спроба обійти це обмеження, як правило, жахливий злом.
саль

На IntelliJ вже багато років. І ніколи не переходило на затемнення, тому не можу говорити про це, тоді чуючи, що це взагалі дуже добре. Для оновлення персональної ліцензії IntelliJ кожен другий рік становить 100 доларів США на рік. Нові основні версії зазвичай виходять щороку в січні. Потім на останніх 2-3 місяці попереднього року вони дозволяють придбати попередню версію та отримати оновлення до майбутньої безкоштовно. Зараз це зараз, тому "безпечний" час придбати 10 та отримати 11. Крім того, якщо вам не потрібні JSP та інші функції підприємства, скористайтеся безкоштовним виданням для громад.
arntg

2

Хоча відповідь від evokk в основному правильна, у ньому відсутні тестові класи . Ви повинні додати тестові класи з цільовим джерелом add-test :

                        <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

і пошук за допомогою id або цілі або імені плагіна Це може допомогти і для інших плагінів. Eclipse, intelliJ може не відображати всі конфігурації як пропозиції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.