diff --git a/src/main/docs/ant-task.html b/src/main/docs/ant-task.html
index 58ac7012..0fccce6d 100644
--- a/src/main/docs/ant-task.html
+++ b/src/main/docs/ant-task.html
@@ -109,6 +109,13 @@
Parameters
Fail the build if a signature is not resolving. If this parameter is set to to false, then such signatures are silently ignored. |
+
+ failOnViolation |
+ boolean |
+ true |
+ Fail the build if violations have been found. If this parameter is set to false , then the build will continue even if violations have been found. |
+
+
internalRuntimeForbidden |
boolean |
diff --git a/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java
index 4db2b566..afe1bf5e 100644
--- a/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java
+++ b/src/main/java/de/thetaphi/forbiddenapis/AbstractCheckMojo.java
@@ -97,7 +97,14 @@ public abstract class AbstractCheckMojo extends AbstractMojo {
*/
@Parameter(required = false, defaultValue = "true")
private boolean failOnUnresolvableSignatures;
-
+
+ /**
+ * Fail the build if violations have been found. Defaults to {@code true}.
+ * @since 1.9
+ */
+ @Parameter(required = false, property="forbiddenapis.failOnViolation", defaultValue = "true")
+ private boolean failOnViolation;
+
/**
* The default compiler target version used to expand references to bundled JDK signatures.
* E.g., if you use "jdk-deprecated", it will expand to this version.
@@ -200,7 +207,7 @@ public void execute() throws MojoExecutionException, MojoFailureException {
ClassLoader.getSystemClassLoader();
try {
- final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnUnresolvableSignatures) {
+ final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnViolation, failOnUnresolvableSignatures) {
@Override
protected void logError(String msg) {
log.error(msg);
diff --git a/src/main/java/de/thetaphi/forbiddenapis/AntTask.java b/src/main/java/de/thetaphi/forbiddenapis/AntTask.java
index 9bc8fa53..5771e212 100644
--- a/src/main/java/de/thetaphi/forbiddenapis/AntTask.java
+++ b/src/main/java/de/thetaphi/forbiddenapis/AntTask.java
@@ -59,6 +59,7 @@ public final class AntTask extends Task {
private boolean restrictClassFilename = true;
private boolean failOnMissingClasses = true;
private boolean failOnUnresolvableSignatures = true;
+ private boolean failOnViolation = true;
private boolean ignoreEmptyFileset = false;
@Override
@@ -76,7 +77,7 @@ public void execute() throws BuildException {
classFiles.setProject(getProject());
apiSignatures.setProject(getProject());
- final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnUnresolvableSignatures) {
+ final Checker checker = new Checker(loader, internalRuntimeForbidden, failOnMissingClasses, failOnViolation, failOnUnresolvableSignatures) {
@Override
protected void logError(String msg) {
log(msg, Project.MSG_ERR);
@@ -325,4 +326,12 @@ public void setIgnoreEmptyFileSet(boolean ignoreEmptyFileset) {
this.ignoreEmptyFileset = ignoreEmptyFileset;
}
+ /**
+ * Fail the build if violations have been found. If this parameter is set to {@code false},
+ * then the build will continue even if violations have been found.
+ * Defaults to {@code true}.
+ */
+ public void setFailOnViolation(boolean failOnViolation) {
+ this.failOnViolation = failOnViolation;
+ }
}
diff --git a/src/main/java/de/thetaphi/forbiddenapis/Checker.java b/src/main/java/de/thetaphi/forbiddenapis/Checker.java
index 234feab6..2d4fdcd6 100644
--- a/src/main/java/de/thetaphi/forbiddenapis/Checker.java
+++ b/src/main/java/de/thetaphi/forbiddenapis/Checker.java
@@ -64,7 +64,7 @@ public abstract class Checker implements RelatedClassLookup {
final Set bootClassPathJars;
final Set bootClassPathDirs;
final ClassLoader loader;
- final boolean internalRuntimeForbidden, failOnMissingClasses, defaultFailOnUnresolvableSignatures;
+ final boolean internalRuntimeForbidden, failOnMissingClasses, failOnViolation, defaultFailOnUnresolvableSignatures;
// key is the internal name (slashed):
final Map classesToCheck = new HashMap();
@@ -86,10 +86,11 @@ public abstract class Checker implements RelatedClassLookup {
protected abstract void logWarn(String msg);
protected abstract void logInfo(String msg);
- public Checker(ClassLoader loader, boolean internalRuntimeForbidden, boolean failOnMissingClasses, boolean defaultFailOnUnresolvableSignatures) {
+ public Checker(ClassLoader loader, boolean internalRuntimeForbidden, boolean failOnMissingClasses, boolean failOnViolation, boolean defaultFailOnUnresolvableSignatures) {
this.loader = loader;
this.internalRuntimeForbidden = internalRuntimeForbidden;
this.failOnMissingClasses = failOnMissingClasses;
+ this.failOnViolation = failOnViolation;
this.defaultFailOnUnresolvableSignatures = defaultFailOnUnresolvableSignatures;
this.start = System.currentTimeMillis();
@@ -439,7 +440,7 @@ public final void run() throws ForbiddenApiException {
final String message = String.format(Locale.ENGLISH,
"Scanned %d (and %d related) class file(s) for forbidden API invocations (in %.2fs), %d error(s).",
classesToCheck.size(), classesToCheck.isEmpty() ? 0 : classpathClassCache.size(), (System.currentTimeMillis() - start) / 1000.0, errors);
- if (errors > 0) {
+ if (failOnViolation && errors > 0) {
logError(message);
throw new ForbiddenApiException("Check for forbidden API calls failed, see log.");
} else {
diff --git a/src/main/java/de/thetaphi/forbiddenapis/CliMain.java b/src/main/java/de/thetaphi/forbiddenapis/CliMain.java
index 3e516ef1..9e8372a8 100644
--- a/src/main/java/de/thetaphi/forbiddenapis/CliMain.java
+++ b/src/main/java/de/thetaphi/forbiddenapis/CliMain.java
@@ -221,7 +221,7 @@ public void run() throws ExitException {
final URLClassLoader loader = URLClassLoader.newInstance(urls, ClassLoader.getSystemClassLoader());
try {
final Checker checker = new Checker(loader, cmd.hasOption(internalruntimeforbiddenOpt.getLongOpt()),
- !cmd.hasOption(allowmissingclassesOpt.getLongOpt()), !cmd.hasOption(allowunresolvablesignaturesOpt.getLongOpt())) {
+ !cmd.hasOption(allowmissingclassesOpt.getLongOpt()), true, !cmd.hasOption(allowunresolvablesignaturesOpt.getLongOpt())) {
@Override
protected void logError(String msg) {
CliMain.this.logError(msg);
diff --git a/src/test/antunit/TestFailOnViolation.xml b/src/test/antunit/TestFailOnViolation.xml
new file mode 100644
index 00000000..f7dc998c
--- /dev/null
+++ b/src/test/antunit/TestFailOnViolation.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+ java.awt.Color @ Color is disallowed, thats not bad, because ANT has no colors...
+ java.lang.String @ You are crazy that you disallow strings
+
+
+
+
+
+
+
+
+ java.awt.Color @ Color is disallowed, thats not bad, because ANT has no colors...
+ java.lang.String @ You are crazy that you disallow strings
+
+
+
+
\ No newline at end of file
diff --git a/src/test/antunit/TestMavenMojo.xml b/src/test/antunit/TestMavenMojo.xml
index f646d6fa..bd97b0b6 100644
--- a/src/test/antunit/TestMavenMojo.xml
+++ b/src/test/antunit/TestMavenMojo.xml
@@ -43,6 +43,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/antunit/pom-generator.xsl b/src/test/antunit/pom-generator.xsl
index df3e6b46..253c70b3 100644
--- a/src/test/antunit/pom-generator.xsl
+++ b/src/test/antunit/pom-generator.xsl
@@ -48,6 +48,7 @@
true
${antunit.failOnUnresolvableSignatures}
+ ${antunit.failOnViolation}
jdk-unsafe
jdk-deprecated
diff --git a/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java b/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java
index 56900048..1036dbd2 100644
--- a/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java
+++ b/src/test/java/de/thetaphi/forbiddenapis/CheckerSetupTest.java
@@ -29,7 +29,7 @@ public final class CheckerSetupTest {
@SuppressForbidden
static final class MyChecker extends Checker {
public MyChecker() {
- super(ClassLoader.getSystemClassLoader(), true, true, true);
+ super(ClassLoader.getSystemClassLoader(), true, true, true, true);
}
@Override