Maven 插件之 maven-enforcer-plugin 解决冲突重复依赖

本文介绍了MavenEnforcerPlugin,一个用于项目构建时管理环境约束的工具,包括检查Maven和JDK版本,防止重复类和依赖。文章详细讲解了如何配置插件来禁用重复的类和POM依赖版本,以提升项目结构的规范性。

0、前言

maven 项目种经常出现 jar 包冲突、重复依赖、无效引用怎么办,maven-enforcer-plugin 了解一下

1、enforcer 是什么

Enforcer is a build rule execution framework
提供了管控一系列环境约束的目标,包括但不限于Maven版本、JDK版本和操作系统家族等多个内置规则以及用户自定义规则。
https://maven.apache.org/enforcer/maven-enforcer-plugin/index.html

2、能干什么

在项目构建时,通过规则来约束项目配置,如jdk 、maven 版本,是否有重复的类,文件编码,文件大小等等,且规则是可以自己扩展的

3、怎么用

https://maven.apache.org/enforcer/maven-enforcer-plugin/usage.html

4、规则

https://maven.apache.org/enforcer/enforcer-rules/index.html

5、扩展规则

https://www.mojohaus.org/extra-enforcer-rules/index.html#

6、使用

pom 中配置如下插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>3.0.0-M3</version>
    <executions>
        <execution>
            <id>enforce-versions</id>
            <goals>
                <goal>enforce</goal>
            </goals>
            <configuration>
                <rules>
                    <bannedPlugins>
                        <!-- will only display a warning but does not fail the build. -->
                        <level>WARN</level>
                        <excludes>
                            <exclude>org.apache.maven.plugins:maven-verifier-plugin</exclude>
                        </excludes>
                        <message>Please consider using the maven-invoker-plugin (http://maven.apache.org/plugins/maven-invoker-plugin/)!</message>
                    </bannedPlugins>
                    <banDuplicateClasses>
                        <ignoreClasses>
                            <!-- example of ignoring one specific class -->
                            <ignoreClass>com.xyz.i18n.Messages</ignoreClass>
 
                            <!-- example of ignoring with wildcards -->
                            <ignoreClass>org.apache.commons.logging.*</ignoreClass>
                        </ignoreClasses>
                        <scopes>
                            <scope>compile</scope>
                            <scope>provided</scope>
                        </scopes>
                        <findAllDuplicates>true</findAllDuplicates>
                        <ignoreWhenIdentical>true</ignoreWhenIdentical>
                    </banDuplicateClasses>
                    <requireMavenVersion>
                        <version>3.2.0</version>
                    </requireMavenVersion>
                    <requireJavaVersion>
                        <version>1.8</version>
                    </requireJavaVersion>
                </rules>
                <fail>false</fail>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>extra-enforcer-rules</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>
</plugin>

7、banDuplicateClasses

重复类检测用的rule

<banDuplicateClasses>
    <ignoreClasses>
        <!-- example of ignoring one specific class -->
        <ignoreClass>com.xyz.i18n.Messages</ignoreClass>
 
        <!-- example of ignoring with wildcards -->
        <ignoreClass>org.apache.commons.logging.*</ignoreClass>
    </ignoreClasses>
    <scopes>
        <scope>compile</scope>
        <scope>provided</scope>
    </scopes>
    <findAllDuplicates>true</findAllDuplicates>
    <ignoreWhenIdentical>true</ignoreWhenIdentical>
</banDuplicateClasses>

执行 使用 mvn clean compile 即可
结果输出,可重点关注 Duplicat classes 部分

[INFO] --- maven-enforcer-plugin:3.0.0-M3:enforce (enforce-versions) @ tet-app ---
[INFO] artifact com.test.maven.test1:com.test.mavne.test1.contract: checking for updates from nexus-public-snapshots
[INFO] artifact com.test.maven.test1:com.test.mavne.test1.contract: checking for updates from nexus
[INFO] Adding ignore: module-info
[INFO] Adding ignore: META-INF/versions/*/module-info
[INFO] Adding ignore: com.xyz.i18n.Messages
[INFO] Adding ignore: org.apache.commons.logging.*
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.BanDuplicateClasses failed with message:
Duplicate classes found:
 
  Found in:
    org.apache.tomcat.embed:tomcat-embed-el:jar:8.5.34:provided
    org.glassfish:javax.el:jar:3.0.0:compile
  Duplicate classes:
    javax/el/LambdaExpression.class
    javax/el/ValueExpression.class
    javax/el/ExpressionFactory.class
    javax/el/MapELResolver.class
    javax/el/ELClass.class
    javax/el/PropertyNotFoundException.class
    javax/el/FunctionMapper.class
    javax/el/ELResolver.class
    javax/el/BeanNameResolver.class
    javax/el/BeanNameELResolver.class
    javax/el/CompositeELResolver.class
    javax/el/ELManager.class
    javax/el/EvaluationListener.class
    javax/el/ResourceBundleELResolver.class
    javax/el/ListELResolver.class
    javax/el/BeanELResolver$BeanProperty.class
    javax/el/ArrayELResolver.class
    javax/el/MethodInfo.class
    javax/el/StandardELContext.class
    javax/el/VariableMapper.class
    javax/el/ValueReference.class
    javax/el/MethodExpression.class
    javax/el/ELProcessor.class
    javax/el/TypeConverter.class
    javax/el/ELContextEvent.class
    javax/el/Expression.class
    javax/el/BeanELResolver.class
    javax/el/BeanELResolver$1.class
    javax/el/ELException.class
    javax/el/StaticFieldELResolver.class
    javax/el/ELContext.class
    javax/el/ImportHandler.class
    javax/el/PropertyNotWritableException.class
    javax/el/MethodNotFoundException.class
    javax/el/BeanELResolver$BeanProperties.class
 
  Found in:
    org.apache.xbean:xbean-reflect:jar:3.7:compile
    org.unidal.framework:foundation-service:jar:2.5.0:compile
  Duplicate classes:
    org/apache/xbean/recipe/ObjectRecipe$Property.class
    org/apache/xbean/recipe/ObjectRecipe$Member.class
    org/apache/xbean/recipe/ObjectRecipe.class
    org/apache/xbean/recipe/ObjectRecipe$MethodMember.class
    org/apache/xbean/recipe/ObjectRecipe$CompoundProperty.class
    org/apache/xbean/recipe/ObjectRecipe$AutoMatchProperty.class
    org/apache/xbean/recipe/ObjectRecipe$SetterProperty.class
    org/apache/xbean/recipe/ObjectRecipe$FieldProperty.class
    org/apache/xbean/recipe/ObjectRecipe$FieldMember.class
 
  Found in:
    org.codehaus.plexus:plexus-container-default:jar:1.6:compile
    org.unidal.framework:foundation-service:jar:2.5.0:compile
  Duplicate classes:
    org/codehaus/plexus/component/builder/XBeanComponentBuilder$RequirementRecipe.class
    org/codehaus/plexus/component/builder/XBeanComponentBuilder.class
    org/codehaus/plexus/component/builder/XBeanComponentBuilder$1.class
    org/codehaus/plexus/component/builder/XBeanComponentBuilder$PlexusConfigurationRecipe.class
 
  Found in:
    javax.servlet:servlet-api:jar:2.5:compile
    org.apache.tomcat.embed:tomcat-embed-core:jar:8.5.34:provided
  Duplicate classes:
    javax/servlet/http/Cookie.class
    javax/servlet/http/HttpSessionContext.class
    javax/servlet/http/HttpSessionListener.class
    javax/servlet/http/HttpSessionAttributeListener.class
    javax/servlet/ServletRequestAttributeListener.class
    javax/servlet/ServletRequest.class
    javax/servlet/http/HttpUtils.class
    javax/servlet/FilterConfig.class
    javax/servlet/ServletResponseWrapper.class
    javax/servlet/ServletResponse.class
    javax/servlet/SingleThreadModel.class
    javax/servlet/ServletConfig.class
    javax/servlet/http/HttpSessionBindingEvent.class
    javax/servlet/ServletOutputStream.class
    javax/servlet/ServletContextListener.class
    javax/servlet/Filter.class
    javax/servlet/Servlet.class
    javax/servlet/ServletContextEvent.class
    javax/servlet/http/NoBodyOutputStream.class
    javax/servlet/UnavailableException.class
    javax/servlet/ServletRequestListener.class
    javax/servlet/http/HttpServletRequest.class
    javax/servlet/ServletContext.class
    javax/servlet/FilterChain.class
    javax/servlet/http/HttpServletRequestWrapper.class
    javax/servlet/http/HttpSessionBindingListener.class
    javax/servlet/ServletRequestAttributeEvent.class
    javax/servlet/ServletRequestWrapper.class
    javax/servlet/ServletRequestEvent.class
    javax/servlet/http/HttpServlet.class
    javax/servlet/http/HttpServletResponseWrapper.class
    javax/servlet/http/HttpSessionActivationListener.class
    javax/servlet/http/NoBodyResponse.class
    javax/servlet/GenericServlet.class
    javax/servlet/ServletException.class
    javax/servlet/ServletContextAttributeEvent.class
    javax/servlet/http/HttpServletResponse.class
    javax/servlet/ServletContextAttributeListener.class
    javax/servlet/http/HttpSession.class
    javax/servlet/RequestDispatcher.class
    javax/servlet/http/HttpSessionEvent.class
    javax/servlet/ServletInputStream.class

  Found in:
    com.sun.mail:javax.mail:jar:1.4.4:compile
    javax.mail:mail:jar:1.4.5:compile
  Duplicate classes:
    com/sun/mail/iap/Atom.class
    com/sun/mail/util/logging/MailHandler$TailNameFormatter.class
    com/sun/mail/pop3/WritableSharedFile.class
    javax/mail/Session.class
    com/sun/mail/imap/IMAPFolder.class
    javax/mail/Multipart.class
    com/sun/mail/imap/IMAPFolder$FetchProfileItem.class
    com/sun/mail/pop3/POP3Folder.class
    com/sun/mail/iap/Response.class
    com/sun/mail/imap/IMAPFolder$17.class
    com/sun/mail/util/logging/LogManagerProperties$1.class
    com/sun/mail/imap/IMAPFolder$8.class
    javax/mail/internet/MimeBodyPart.class
    com/sun/mail/handlers/text_plain.class
    com/sun/mail/handlers/text_xml.class
    com/sun/mail/smtp/SMTPTransport$DigestMD5Authenticator.class
    com/sun/mail/smtp/DigestMD5.class
    com/sun/mail/util/logging/MailHandler.class
    com/sun/mail/smtp/SMTPTransport$Authenticator.class
    com/sun/mail/imap/protocol/FetchResponse.class
    com/sun/mail/smtp/SMTPTransport$NtlmAuthenticator.class
    javax/mail/internet/MimePartDataSource.class
    com/sun/mail/imap/protocol/Namespaces$Namespace.class
    com/sun/mail/auth/Ntlm.class
    com/sun/mail/iap/Argument.class
    com/sun/mail/pop3/POP3Message.class
    com/sun/mail/imap/IMAPFolder$5.class
    com/sun/mail/imap/IMAPFolder$14.class
    javax/mail/util/ByteArrayDataSource.class
    com/sun/mail/imap/MessageLiteral.class
    javax/mail/internet/MimeBodyPart$MimePartDataHandler.class
    com/sun/mail/pop3/TempFile.class
    javax/mail/util/SharedFileInputStream$SharedFile.class
    com/sun/mail/imap/IMAPStore.class
    com/sun/mail/imap/protocol/RFC822DATA.class
    com/sun/mail/imap/IMAPStore$1.class
    com/sun/mail/util/MailSSLSocketFactory.class
    com/sun/mail/smtp/SMTPTransport.class
    com/sun/mail/imap/IMAPFolder$15.class
    com/sun/mail/smtp/SMTPTransport$PlainAuthenticator.class
    com/sun/mail/util/MimeUtil$1.class
    javax/mail/internet/InternetAddress.class
    com/sun/mail/imap/IMAPFolder$6.class
    com/sun/mail/imap/IMAPBodyPart.class
    javax/mail/Transport.class
    com/sun/mail/imap/IMAPFolder$7.class
    com/sun/mail/imap/protocol/BODYSTRUCTURE.class
    com/sun/mail/imap/IMAPFolder$16.class
    com/sun/mail/imap/IMAPMessage.class
    com/sun/mail/imap/protocol/IMAPProtocol.class
    com/sun/mail/util/SocketFetcher$1.class
    com/sun/mail/iap/Protocol.class
    com/sun/mail/util/logging/LogManagerProperties.class
    com/sun/mail/imap/IMAPFolder$1.class
    com/sun/mail/imap/IMAPFolder$19.class
    javax/mail/util/SharedFileInputStream.class
    javax/mail/internet/MimeUtility.class
    com/sun/mail/pop3/AppendStream.class
    com/sun/mail/imap/IMAPFolder$4.class
    com/sun/mail/util/UUEncoderStream.class
    com/sun/mail/imap/protocol/IMAPSaslAuthenticator.class
    javax/mail/internet/MimeUtility$1NullInputStream.class
    com/sun/mail/imap/IMAPFolder$10.class
    com/sun/mail/imap/IMAPFolder$13.class
    com/sun/mail/imap/IMAPFolder$18.class
    com/sun/mail/pop3/POP3Store.class
    com/sun/mail/smtp/SMTPTransport$LoginAuthenticator.class
    com/sun/mail/imap/protocol/Namespaces.class
    com/sun/mail/pop3/Protocol.class
    com/sun/mail/imap/IMAPFolder$11.class
    com/sun/mail/util/MimeUtil.class
    com/sun/mail/imap/IMAPFolder$2.class
    com/sun/mail/imap/LengthCounter.class
    com/sun/mail/imap/IMAPFolder$12.class
    com/sun/mail/imap/IMAPMessage$1FetchProfileCondition.class
    com/sun/mail/util/MailSSLSocketFactory$MailTrustManager.class
    javax/mail/Folder.class
    com/sun/mail/imap/protocol/RFC822SIZE.class
    com/sun/mail/imap/IMAPFolder$3.class
    com/sun/mail/imap/IMAPFolder$9.class
    com/sun/mail/iap/AString.class
    javax/mail/internet/MimeMessage.class
    com/sun/mail/util/BASE64EncoderStream.class
    com/sun/mail/imap/MessageCache.class
    com/sun/mail/imap/IMAPStore$ConnectionPool.class
    javax/mail/Version.class
    com/sun/mail/util/SocketFetcher.class
    javax/mail/internet/AsciiOutputStream.class
    javax/mail/PasswordAuthentication.class
 
[INFO]
[INFO] --- jacoco-maven-plugin:0.7.6.201602180812:prepare-agent (default-prepare-agent) @ test-app ---
[INFO] argLine set to -javaagent:/Users/test/.m2/repository/org/jacoco/org.jacoco.agent/0.7.6.201602180812/org.jacoco.agent-0.7.6.201602180812-runtime.jar=destfile=/Users/test/Develop/IdeaProjects/test-app/target/jacoco.exec -Xms512m -Xmx1024m
[INFO]
[INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ test-app ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 6 resources
[INFO] Copying 154 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ test-app ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1432 source files to /Users/test/Develop/IdeaProjects/test-app/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 05:28 min
[INFO] Finished at: 2024-02-26T23:44:18+08:00
[INFO] Final Memory: 68M/664M
[INFO] ------------------------------------------------------------------------

8、banDuplicatePomDependencyVersions

重复的pom 依赖配置 输出结果

[WARNING] Rule 3: org.apache.maven.plugins.enforcer.BanDuplicatePomDependencyVersions failed with message:
Found 2 duplicate dependency declaration in this project:
 - dependencies.dependency[com.daojia.mobile:com.daojia.mobile.signalbomb.contract:jar] ( 2 times )
 - dependencyManagement.dependencies.dependency[com.daojia.mobile:com.daojia.mobile.signalbomb.contract:jar] ( 2 times )

更多使用欢迎大家一起来发掘探讨。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值