问题描述
在过去几年中,对于 Eclipse 中的父 POM 项目,我不得不对 Eclipse 的配置进行稍微不同的调整,以避免 Eclipse 出现如下错误:
...target/classes/meta-inf/MANIFEST.MF (No such file or directory) pom.xml
Maven > Update Project
但这仅在我进行另一次“全新安装”时才有效。
过去,我通过对 Eclipse 进行以下 2 项调整让 Eclipse 停止抱怨:
Preferences > Maven > check "Automatically update Maven projects configuration (experimental)"
Preferences > Maven > Java EE Integration > uncheck "Maven Archiver generates files under the build directory".
但是,这不再适用于最新版本的 Eclipse(例如,版本:2021-03)。
为什么 Eclipse 会这样做,我如何才能一劳永逸地摆脱这种烦恼?
解决方法
我找到了解决方案。
该问题是由标准的 maven-compiler-plugin 引起的。当它生成一个 JAR 文件时,它会删除 target/classes/META-INF/MANIFEST.MF。 最终(但不是马上),Eclipse 注意到了这一点并抱怨清单文件丢失。
清理项目(如相关 Stack Overflow 问题中经常推荐的那样)不是解决方案。虽然暂时让错误消失了,但是错误很快又回来了,下次maven-compiler-plugin再生成一个JAR文件。
一个永久的解决方案是将这个额外的插件包含在我的 POM 中,它不仅生成一个清单文件,而且将它保存在 target/classes/META-INF/MANIFEST.MF:
...
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>bundle-manifest</id>
<phase>compile</phase>
<goals>
<goal>manifest</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<index>true</index>
<manifest>
<addDefaultSpecificationEntries>false</addDefaultSpecificationEntries>
<addDefaultImplementationEntries>false</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
...
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
...
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
...
</plugin>
</plugins>
...
</build>
...