如何消除一个被混淆的.jar文件中module-info.class警告?

47

我正在使用maven-shade插件将Spring Boot应用程序打包成一个超级jar文件。 简单吧? 最近,当我运行mvn clean package命令时,会收到以下警告:

[WARNING] Discovered module-info.class. Shading will break its strong encapsulation.

实际上它并没有破坏任何东西,但我是一个完美主义者,这让我很疯狂。我该怎么消除它?我尝试了很多方法,但都没有成功。


3
创建“Uber Jar”会移除该jar中模块的使用。简单地回答是作为开发者,你需要放弃完美主义态度。然而,真正的问题是为什么要创建这个“Uber Jar”,以及你是否真的需要它。 - nerdlyist
1
查看这个问题,虽然不是很好的答案,但它涉及了主要的要点。https://dev59.com/tlQK5IYBdhLWcg3wgf9B - nerdlyist
1
抱歉留下了多个评论。Shade上有一个配置可以过滤文件,所以你可以事先处理好,如果这发生在警告之前,你就不会再看到它了。在这里查看 https://maven.apache.org/plugins/maven-shade-plugin/examples/includes-excludes.html - nerdlyist
2
如果你正在开发一个Spring Boot应用程序,我不知道为什么你要使用maven-shade-plugin,这没有意义。在Spring Boot应用程序中,你应该使用spring-boot-maven-plugin...它会处理这个问题...此外,在Spring Boot应用程序中使用module-info也没有意义... - khmarbaise
感谢大家的回复。我回家后会仔细检查我的代码,并告诉你们结果。我认为khmarbaise可能是对的,我的项目最近从Dropwizard项目转换为Springboot项目,maven-shade插件可能是这种转换的遗留问题... - Albert Rannetsperger
1个回答

50

在shade插件中过滤文件对我来说似乎很有效。

这是我的 maven-shade-plugin 配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.1</version>
    <configuration>
        <filters>
            <filter>
                <artifact>*:*</artifact>
                <excludes>
                    <exclude>module-info.class</exclude>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                </excludes>
            </filter>
        </filters>
    </configuration>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>
        </execution>
    </executions>
</plugin>

关键是 <exclude>module-info.class</exclude> 这行代码。该筛选器会在任何构件中排除找到的文件(*:* = 任何构件),此处排除模块信息文件。 (我使用其他三个排除文件来消除依赖项中签名文件的错误)

我没有注意到任何不良副作用,现在警告已经消失了!


3
我不得不添加 <exclude>META-INF/**</exclude> 来完全消除我的项目中的所有警告。 - Vapid
1
请注意,这需要插件版本>=3.2.1。在排除类时,早期版本即使打印警告也是如此。https://issues.apache.org/jira/browse/MSHADE-303 - sudeep
只排除特定的资源更安全。排除 META-INF/** 可能会以难以调试的方式影响应用程序行为。 - Bart Swennenhuis
2
@VapidLinus 只有一件事需要注意:如果你排除整个META-INF目录,那么如果使用SPI服务接口,应用程序可能会停止工作。在这种情况下,您还应该包括“org.apache.maven.plugins.shade.resource.ServicesResourceTransformer”来重新定位包括服务的软件包(如果您进行了重新定位)。最好排除META-INF/versions/**/*。 - Tiemo Vorschütz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接