目录
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 )
更多使用欢迎大家一起来发掘探讨。

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

被折叠的 条评论
为什么被折叠?



