首页 > 解决方案 > 未使用 maven 编译器插件编译的特定类

问题描述

我必须将一个旧的大型项目从 Ant 转换为 Maven。该项目包含多个子项目(Web 应用程序),但所有这些项目的源代码都位于不同的src文件夹下。为了创建war文件,我们dist target为每个模块选择和编译特定的类,复制一些文件并创建war。

我需要使用 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)

我的目标是为每个模块创建一个战争,我需要编译特定的类,但我没有任何成功的结果。这是我迄今为止尝试过的(module_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(解决方法 - 可能的解决方案)

使用ibuild-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>

标签: javamavenmaven-compiler-plugin

解决方案


推荐阅读