Классы Specifi c не скомпилированы с плагином компилятора maven - PullRequest
4 голосов
/ 28 января 2020

Мне нужно преобразовать старый массивный проект из 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>
...