diff --git a/src/it/enforce-bytecode-version-module-info-jdk8-strict/invoker.properties b/src/it/enforce-bytecode-version-module-info-jdk8-strict/invoker.properties new file mode 100644 index 00000000..38b185e5 --- /dev/null +++ b/src/it/enforce-bytecode-version-module-info-jdk8-strict/invoker.properties @@ -0,0 +1,2 @@ +invoker.goals = enforcer:enforce +invoker.buildResult = failure diff --git a/src/it/enforce-bytecode-version-module-info-jdk8-strict/pom.xml b/src/it/enforce-bytecode-version-module-info-jdk8-strict/pom.xml new file mode 100644 index 00000000..6fd6a4f5 --- /dev/null +++ b/src/it/enforce-bytecode-version-module-info-jdk8-strict/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + pim.pam.poum + smoking + 1.0-SNAPSHOT + + + UTF-8 + + + + + org.ow2.asm + asm + 6.0 + runtime + + + + + + + maven-enforcer-plugin + @enforcerPluginVersion@ + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + + + 1.8 + true + + + + + + compile + + + + + + diff --git a/src/it/enforce-bytecode-version-module-info-jdk8-strict/verify.groovy b/src/it/enforce-bytecode-version-module-info-jdk8-strict/verify.groovy new file mode 100644 index 00000000..3703f11b --- /dev/null +++ b/src/it/enforce-bytecode-version-module-info-jdk8-strict/verify.groovy @@ -0,0 +1,9 @@ +File file = new File( basedir, "build.log" ); +assert file.exists(); + +String text = file.getText("utf-8"); + +assert ! text.contains( '[INFO] Adding ignore: module-info' ) +assert text.contains( 'Found Banned Dependency: org.ow2.asm:asm:jar:6.0' ) + +return true; diff --git a/src/it/enforce-bytecode-version-module-info-jdk9-strict/invoker.properties b/src/it/enforce-bytecode-version-module-info-jdk9-strict/invoker.properties new file mode 100644 index 00000000..a30e3767 --- /dev/null +++ b/src/it/enforce-bytecode-version-module-info-jdk9-strict/invoker.properties @@ -0,0 +1,2 @@ +invoker.goals = enforcer:enforce +invoker.buildResult = success diff --git a/src/it/enforce-bytecode-version-module-info-jdk9-strict/pom.xml b/src/it/enforce-bytecode-version-module-info-jdk9-strict/pom.xml new file mode 100644 index 00000000..2b1e4790 --- /dev/null +++ b/src/it/enforce-bytecode-version-module-info-jdk9-strict/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + pim.pam.poum + smoking + 1.0-SNAPSHOT + + + UTF-8 + + + + + org.ow2.asm + asm + 6.0 + runtime + + + + + + + maven-enforcer-plugin + @enforcerPluginVersion@ + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + + + 1.9 + true + + + + + + compile + + + + + + diff --git a/src/it/enforce-bytecode-version-module-info-jdk9-strict/verify.groovy b/src/it/enforce-bytecode-version-module-info-jdk9-strict/verify.groovy new file mode 100644 index 00000000..1940ff78 --- /dev/null +++ b/src/it/enforce-bytecode-version-module-info-jdk9-strict/verify.groovy @@ -0,0 +1,9 @@ +File file = new File( basedir, "build.log" ); +assert file.exists(); + +String text = file.getText("utf-8"); + +assert ! text.contains( '[INFO] Adding ignore: module-info' ) +assert ! text.contains( 'Found Banned Dependency: org.ow2.asm:asm:jar:6.0' ) + +return true; diff --git a/src/it/enforce-bytecode-version-multirelease-strict/invoker.properties b/src/it/enforce-bytecode-version-multirelease-strict/invoker.properties new file mode 100644 index 00000000..38b185e5 --- /dev/null +++ b/src/it/enforce-bytecode-version-multirelease-strict/invoker.properties @@ -0,0 +1,2 @@ +invoker.goals = enforcer:enforce +invoker.buildResult = failure diff --git a/src/it/enforce-bytecode-version-multirelease-strict/pom.xml b/src/it/enforce-bytecode-version-multirelease-strict/pom.xml new file mode 100644 index 00000000..a3bde43c --- /dev/null +++ b/src/it/enforce-bytecode-version-multirelease-strict/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + pim.pam.poum + smoking + 1.0-SNAPSHOT + + + UTF-8 + + + + + org.apache.logging.log4j + log4j-api + 2.17.2 + runtime + + + + + + + maven-enforcer-plugin + @enforcerPluginVersion@ + + + + @project.groupId@ + @project.artifactId@ + @project.version@ + + + + + + + 1.8 + true + + + + + + + compile + + + + + + diff --git a/src/it/enforce-bytecode-version-multirelease-strict/verify.groovy b/src/it/enforce-bytecode-version-multirelease-strict/verify.groovy new file mode 100644 index 00000000..108bb6b9 --- /dev/null +++ b/src/it/enforce-bytecode-version-multirelease-strict/verify.groovy @@ -0,0 +1,9 @@ +File file = new File( basedir, "build.log" ); +assert file.exists(); + +String text = file.getText("utf-8"); + +assert ! text.contains( '[INFO] Adding ignore: module-info' ) +assert text.contains( 'Found Banned Dependency: org.apache.logging.log4j:log4j-api:jar:2.17.2' ) + +return true; diff --git a/src/main/java/org/apache/maven/plugins/enforcer/EnforceBytecodeVersion.java b/src/main/java/org/apache/maven/plugins/enforcer/EnforceBytecodeVersion.java index 2d35a35a..d7cdafdf 100644 --- a/src/main/java/org/apache/maven/plugins/enforcer/EnforceBytecodeVersion.java +++ b/src/main/java/org/apache/maven/plugins/enforcer/EnforceBytecodeVersion.java @@ -48,7 +48,7 @@ /** * Enforcer rule that will check the bytecode version of each class of each dependency. - * + * * @see Java class file general layout * @since 1.0-alpha-4 */ @@ -148,7 +148,7 @@ static String renderVersion( int major, int minor ) /** * This parameter is here for potentially advanced use cases, but it seems like it is actually always 0. - * + * * @see #maxJavaMajorVersionNumber * @see Java class file general layout */ @@ -167,6 +167,11 @@ static String renderVersion( int major, int minor ) */ private String[] ignoreClasses; + /** + * Process module-info and Multi-Release JAR classes if true + */ + private boolean strict = false; + /** * Optional list of dependency scopes to ignore. {@code test} and {@code provided} make sense here. */ @@ -240,7 +245,7 @@ private void computeParameters() "\"1.7\", \"8\", \"11\", \"12\", \"13\", \"14\", \"15\", \"16\", \"17\"" ); } maxJavaMajorVersionNumber = needle; - if ( needle < 53 ) + if ( !strict && needle < 53 ) { IgnorableDependency ignoreModuleInfoDependency = new IgnorableDependency(); ignoreModuleInfoDependency.applyIgnoreClasses(DEFAULT_CLASSES_IGNORE_BEFORE_JDK_9, false ); @@ -342,17 +347,17 @@ private String isBadArtifact( Artifact a ) int major = ( magicAndClassFileVersion[6] << 8 ) + magicAndClassFileVersion[7]; // Assuming regex match is more expensive, verify bytecode versions first - + if ( ( major > maxJavaMajorVersionNumber ) || ( major == maxJavaMajorVersionNumber && minor > maxJavaMinorVersionNumber ) ) { - + Matcher matcher = MULTIRELEASE.matcher( entry.getName() ); - - if ( matcher.matches() ) + + if ( !strict && matcher.matches() ) { Integer maxExpectedMajor = JDK_TO_MAJOR_VERSION_NUMBER_MAPPING.get( matcher.group( 1 ) ); - + if (maxExpectedMajor == null) { getLog().warn( "Unknown bytecodeVersion for " + a + " : " + entry.getName() + ": got " + maxExpectedMajor + " class-file-version" ); @@ -423,6 +428,15 @@ public void setSearchTransitive( boolean theSearchTransitive ) this.searchTransitive = theSearchTransitive; } + /** + * Process module-info and Multi-Release JAR classes if true + * @param strict the strictness to set + */ + public void setStrict( boolean strict ) + { + this.strict = strict; + } + // copied from RequireReleaseDeps /* * Filter the dependency artifacts according to the includes and excludes If includes and excludes are both null, diff --git a/src/site/apt/enforceBytecodeVersion.apt.vm b/src/site/apt/enforceBytecodeVersion.apt.vm index 96c811c9..d288404a 100644 --- a/src/site/apt/enforceBytecodeVersion.apt.vm +++ b/src/site/apt/enforceBytecodeVersion.apt.vm @@ -43,9 +43,11 @@ Enforce Bytecode Version * ignoreOptionals - a boolean, if <<>> all dependencies which have <<<true>>> are ignored. + * strict - a boolean, if <<>> process module-info and Multi-Release JAR classes + [] -Note +Note Sample Plugin Configuration: +---+