java - 未使用 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>
解决方案
推荐阅读
- javascript - 在数组中添加输入值
- python - ModuleNotFoundError:没有名为“__main__.models”的模块
- sql - 如何连接没有公共字段的 2 个表?
- python-2.7 - 如何在 google colab 中安装网格
- javascript - 如何通过 JavaScript 在 HTML 表格中加减数字
- r - 将具有单个 |Date|Temperature_1|Temperature_2|Temperature_3|etc ..... 的数据框重塑为 |Date |Temperature| 形式
- okhttp3 - Okhttp解析和recyclerview片段?
- javascript - 将数据从 Angularjs 传递到 PHP
- c# - windows窗体通知图标无法正常工作
- c# - 具有给定类的最大成员的抽象类