如何摆脱最新 Eclipse (2021-03) 的 MANIFEST.MF (No such file or directory) 错误?

How to rid latest Eclipse (2021-03) of MANIFEST.MF (No such file or directory) error?

在过去的几年里,对于我们在 Eclipse 中的父 POM 项目,我不得不对 Eclipse 的配置进行稍微不同的调整,以避免 Eclipse 出现如下错误:

...target/classes/META-INF/MANIFEST.MF (No such file or directory)  pom.xml

我知道我可以通过右键单击父项目并执行

来手动消除这些错误
Maven > Update Project

但这只在我执行另一个“全新安装”时的下一个构建之前有效。

过去,我通过进行以下 2 个 Eclipse 调整让 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 问题中经常推荐)不是解决方案。虽然它使错误暂时消失,但错误很快就会出现 return,下次 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>
...