Мне нужно преобразовать старый массивный проект из Ant в Maven. Проект состоит из различных подпроектов (веб-приложений), но исходный код всех этих проектов находится в различных папках src
. Для создания файлов войны у нас есть dist target
для каждого модуля, который выбирает и компилирует определенные c классы, копирует некоторые файлы и создает войну.
Мне нужно добиться того же результата с Maven. Я не могу разделить кодовую базу проекта в отдельных проектах maven , поэтому мне нужно найти решение. На данный момент он состоит из родительского элемента pom
, который имеет различные модули (по одному для каждого подпроекта). Вот пример структуры проекта:
OldMassiveProject
│ ├── src
│ │ └── bunch.of.packages
│ ├── other_src
│ │ └── bunch.of.packages
│ ├── various_resources_folder
...
│ ├── maven_modules
│ │ ├── module_1
│ │ │ └── pom.xml
│ │ ├── module_2
│ │ │ └── pom.xml
...
│ │ ├── module_n
│ │ │ └── pom.xml
│ ├── deploy_configuration
│ │ ├── module_1
│ │ │ ├── spring_files
│ │ │ └── web.xml
│ │ ├── module_2
│ │ │ ├── spring_files
│ │ │ └── web.xml
...
│ │ ├── module_n
│ │ │ ├── spring_files
│ │ │ └── web.xml
│ └── pom.xml (parent pom)
Моя цель - создать войну для каждого модуля, мне нужно скомпилировать определенные c классы, но у меня нет успешного результата. Это то, что я пробовал до сих пор (модуль_1 pom. xml):
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>my.company</groupId>
<artifactId>parent-id</artifactId>
<version>10.0</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<groupId>my.company</groupId>
<artifactId>module-1</artifactId>
<packaging>war</packaging>
<properties>
<project.base.folder>../../</project.base.folder>
<project.base.src>${project.base.folder}src</project.base.src>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<resources>
<resource>
<directory>${project.base.src}</directory>
<filtering>true</filtering> (not sure about this, I need to understand it better)
<targetPath>${basedir}/src/main/java</targetPath>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<compilerVersion>1.8</compilerVersion>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<includes>
<include>${basedir}/src/main/java/package1/ToCompile.java</include>
<include>${basedir}/src/main/java/package2/*.java</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<webXml>${project.base.folder}deploy_configuration/module_1/web.xml</webXml>
<warName>Module1</warName>
<webResources>
<resource>
<directory>${project.base.src}</directory>
<targetPath>WEB-INF/classes</targetPath>
<includes>
<include>**/*.sql</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
...
</dependencies>
</project>
Когда я запускаю mvn clean install
, файлы .class
не генерируются, фактически вывод для плагин компилятора Nothing to compile - all classes are up to date
. Я не могу понять, что я делаю неправильно, я относительно новичок в Maven.
Редактировать
Я исправил <include>
, как указано в комментариях @eduyayo. Я также исправил исходный каталог, в результате pom
выглядит следующим образом (только часть плагина компилятора):
<build>
<sourceDirectory>${project.base.src}</sourceDirectory>
<directory>target</directory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>-proc:none</arg>
</compilerArgs>
<includes>
<include>package1/ToCompile.java</include>
<include>package2/*.java</include>
</includes>
</configuration>
</plugin>
...
Теперь кажется, что компилятор может найти указанные классы, но они помечены как дубликаты компилятором:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project module-1: Compilation failure:
[ERROR] /C:/Development/Workspaces/OLDPROJ/OldMassiveProject/src/package2/Aclass.java:[25,8] duplicate class: package2.Aclass.java
[ERROR] /C:/Development/Workspaces/OLDPROJ/OldMassiveProject/src/package2/Cclass.java:[25,8] duplicate class: package2.Cclass.java
[ERROR] /C:/Development/Workspaces/OLDPROJ/OldMassiveProject/package1/ToCompile.java duplicate class: package1.ToCompile.java
Но я почти уверен, что имена классов уникальны, поэтому я не могу понять, почему возникает эта ошибка.
Подробнее
Я пытался выбрать только фиктивный класс, я вижу, что во время компиляции 2 исходный файл компилируется, это странно:
[INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ module-1 ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 2 source files to C:\Development\Workspaces\OLDPROJ\OldMassiveProject\maven_modules\module_1\target\classes
Это нормальное поведение? Может быть, это ошибка. Вот (часть) журнал компилятора:
[parsing started RegularFileObject[C:\Development\Workspaces\OLDPROJ\OldMassiveProject\src\testmaven\TestMaven.java]]
[parsing completed 17ms]
[parsing started RegularFileObject[C:\Development\Workspaces\OLDPROJ\OldMassiveProject\maven_modules\module_1\..\..\src\testmaven\TestMaven.java]]
[parsing completed 0ms]
В режиме отладки вот конфигурация для maven-compiler-plugin
:
[DEBUG] (f) compileSourceRoots = [C:\Development\Workspaces\OLDPROJ\OldMassiveProject\maven_modules\module_1\..\..\src, C:\Development\Workspaces\OLDPROJ\OldMassiveProject\src]
Странно, что это в 2 раза больше src
папка как compileSourceRoots
. Возможно, это может что-то объяснить.
Редактировать 2 (Обходной путь - возможное решение)
Используя build-helper-maven-plugin
, я могу успешно скомпилировать классы, указанные в <include>
maven-compiler-plugin
. В моем случае я удалил <sourceDirectory>
в <build>
, объявление добавило папку src
в build-helper-maven-plugin
. Кажется, что это работает, но компилятор также выбирает папку src/main/java
, которая не существует (ошибка не возникает, но было бы полезно, если бы я мог удалить эту настройку по умолчанию). Вот часть плагинов pom.xml
:
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src</source>
<source>other_src</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
<encoding>UTF-8</encoding>
<includes>
<include>package1/ToCompile.java</include>
<include>package2/*.java</include>
</includes>
</configuration>
</plugin>
</plugins>