From ec650ae6cdde05dceae701752944fec4a5638600 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Mon, 28 Sep 2015 19:03:27 +0200 Subject: [PATCH 1/9] Initial commit, completely untested --- ivy.xml | 1 + .../maven/AbstractCheckMojo.java | 49 ++++++++++++++++++- .../maven/SignaturesArtifact.java | 25 ++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java diff --git a/ivy.xml b/ivy.xml index a695f6f5..065ca7ca 100644 --- a/ivy.xml +++ b/ivy.xml @@ -26,6 +26,7 @@ + diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index 3a59c9fc..c8ecbc5b 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -18,9 +18,16 @@ import static de.thetaphi.forbiddenapis.Checker.Option.*; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.repository.ArtifactRepository; +import org.apache.maven.artifact.resolver.ArtifactNotFoundException; +import org.apache.maven.artifact.resolver.ArtifactResolutionException; +import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.logging.Log; +import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; import org.codehaus.plexus.util.DirectoryScanner; @@ -41,6 +48,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; +import java.util.Set; /** * Base class for forbiddenapis Mojos. @@ -56,6 +64,14 @@ public abstract class AbstractCheckMojo extends AbstractMojo { @Parameter(required = false) private File[] signaturesFiles; + /** + * Lists all Maven artifacts, which contain signatures and comments for forbidden API calls. + * The signatures are resolved against the compile classpath. + * @since 2.0 + */ + @Parameter(required = false) + private SignaturesArtifact[] signaturesArtifacts; + /** * Gives a multiline list of signatures, inline in the pom.xml. Use an XML CDATA section to do that! * The signatures are resolved against the compile classpath. @@ -163,6 +179,18 @@ public abstract class AbstractCheckMojo extends AbstractMojo { /** The project packaging (pom, jar, etc.). */ @Parameter(defaultValue = "${project.packaging}", readonly = true, required = true) private String packaging; + + @Component + private ArtifactFactory artifactFactory; + + @Component + private ArtifactResolver artifactResolver; + + @Parameter(defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true) + private List remoteRepositories; + + @Parameter(defaultValue = "${localRepository}", readonly = true, required = true) + private ArtifactRepository localRepository; /** provided by the concrete Mojos for compile and test classes processing */ protected abstract List getClassPathElements(); @@ -174,6 +202,12 @@ public abstract class AbstractCheckMojo extends AbstractMojo { protected String getTargetVersion() { return targetVersion; } + + private File resolveSignaturesArtifact(SignaturesArtifact signatureArtifact) throws ArtifactResolutionException, ArtifactNotFoundException { + final Artifact artifact = this.artifactFactory.createArtifact(signatureArtifact.groupId, signatureArtifact.artifactId, signatureArtifact.version, "", signatureArtifact.type); + artifactResolver.resolve(artifact, this.remoteRepositories, this.localRepository); + return artifact.getFile(); + } @Override public void execute() throws MojoExecutionException { @@ -287,7 +321,16 @@ public void info(String msg) { checker.parseBundledSignatures(bs, targetVersion); } } - if (signaturesFiles != null) for (final File f : new LinkedHashSet(Arrays.asList(signaturesFiles))) { + final Set sfiles = new LinkedHashSet(); + if (signaturesFiles != null) { + sfiles.addAll(Arrays.asList(signaturesFiles)); + } + if (signaturesArtifacts != null) { + for (final SignaturesArtifact sa : signaturesArtifacts) { + sfiles.add(resolveSignaturesArtifact(sa)); + } + } + for (final File f : sfiles) { checker.parseSignaturesFile(f); } final String sig = (signatures != null) ? signatures.trim() : null; @@ -298,6 +341,10 @@ public void info(String msg) { throw new MojoExecutionException("IO problem while reading files with API signatures.", ioe); } catch (ParseException pe) { throw new MojoExecutionException("Parsing signatures failed: " + pe.getMessage(), pe); + } catch (ArtifactResolutionException e) { + throw new MojoExecutionException("Problem while resolving signatures Maven artifact.", e); + } catch (ArtifactNotFoundException e) { + throw new MojoExecutionException("Signatures Maven artifact does not exist.", e); } if (checker.hasNoSignatures()) { diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java new file mode 100644 index 00000000..869cac07 --- /dev/null +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java @@ -0,0 +1,25 @@ +package de.thetaphi.forbiddenapis.maven; + +/* + * (C) Copyright Uwe Schindler (Generics Policeman) and others. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * TODO + * @since 2.0 + */ +public final class SignaturesArtifact { + String groupId, artifactId, version, type; +} From 211619c37fc866dc927e61d27c143d480472ee21 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Mon, 28 Sep 2015 19:45:59 +0200 Subject: [PATCH 2/9] Add Maven artifact classifier (optionally) --- .../de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java | 6 ++++-- .../de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index c8ecbc5b..6fc346bc 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -203,8 +203,10 @@ protected String getTargetVersion() { return targetVersion; } - private File resolveSignaturesArtifact(SignaturesArtifact signatureArtifact) throws ArtifactResolutionException, ArtifactNotFoundException { - final Artifact artifact = this.artifactFactory.createArtifact(signatureArtifact.groupId, signatureArtifact.artifactId, signatureArtifact.version, "", signatureArtifact.type); + private File resolveSignaturesArtifact(SignaturesArtifact signaturesArtifact) throws ArtifactResolutionException, ArtifactNotFoundException { + final Artifact artifact = (signaturesArtifact.classifier != null) ? + this.artifactFactory.createArtifactWithClassifier(signaturesArtifact.groupId, signaturesArtifact.artifactId, signaturesArtifact.version, signaturesArtifact.type, signaturesArtifact.classifier) : + this.artifactFactory.createArtifact(signaturesArtifact.groupId, signaturesArtifact.artifactId, signaturesArtifact.version, null/*scope*/, signaturesArtifact.type); artifactResolver.resolve(artifact, this.remoteRepositories, this.localRepository); return artifact.getFile(); } diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java index 869cac07..e123112b 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java @@ -21,5 +21,5 @@ * @since 2.0 */ public final class SignaturesArtifact { - String groupId, artifactId, version, type; + public String groupId, artifactId, version, type, classifier; } From c66aaa19c0e56cce7897a07da435ae0e854b97f4 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Mon, 28 Sep 2015 23:07:47 +0200 Subject: [PATCH 3/9] First working version of Maven artifact signatures --- .../maven/AbstractCheckMojo.java | 25 +++++++++++++------ .../maven/SignaturesArtifact.java | 21 +++++++++++++++- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index 6fc346bc..25267710 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -204,9 +204,7 @@ protected String getTargetVersion() { } private File resolveSignaturesArtifact(SignaturesArtifact signaturesArtifact) throws ArtifactResolutionException, ArtifactNotFoundException { - final Artifact artifact = (signaturesArtifact.classifier != null) ? - this.artifactFactory.createArtifactWithClassifier(signaturesArtifact.groupId, signaturesArtifact.artifactId, signaturesArtifact.version, signaturesArtifact.type, signaturesArtifact.classifier) : - this.artifactFactory.createArtifact(signaturesArtifact.groupId, signaturesArtifact.artifactId, signaturesArtifact.version, null/*scope*/, signaturesArtifact.type); + final Artifact artifact = signaturesArtifact.createArtifact(artifactFactory); artifactResolver.resolve(artifact, this.remoteRepositories, this.localRepository); return artifact.getFile(); } @@ -323,18 +321,29 @@ public void info(String msg) { checker.parseBundledSignatures(bs, targetVersion); } } - final Set sfiles = new LinkedHashSet(); + final Set sigFiles = new LinkedHashSet(); + final Set sigUrls = new LinkedHashSet(); if (signaturesFiles != null) { - sfiles.addAll(Arrays.asList(signaturesFiles)); + sigFiles.addAll(Arrays.asList(signaturesFiles)); } if (signaturesArtifacts != null) { - for (final SignaturesArtifact sa : signaturesArtifacts) { - sfiles.add(resolveSignaturesArtifact(sa)); + for (final SignaturesArtifact artifact : signaturesArtifacts) { + final File f = resolveSignaturesArtifact(artifact); + if (artifact.path != null) { + final URL fileUrl = f.toURI().toURL(); + final URL jarUrl = new URL("jar", "", -1, fileUrl.toExternalForm() + "!/"); + sigUrls.add(new URL(jarUrl, artifact.path)); + } else { + sigFiles.add(f); + } } } - for (final File f : sfiles) { + for (final File f : sigFiles) { checker.parseSignaturesFile(f); } + for (final URL u : sigUrls) { + checker.parseSignaturesFile(u); + } final String sig = (signatures != null) ? signatures.trim() : null; if (sig != null && sig.length() != 0) { checker.parseSignaturesString(sig); diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java index e123112b..c9f41b6e 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java @@ -1,5 +1,8 @@ package de.thetaphi.forbiddenapis.maven; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; + /* * (C) Copyright Uwe Schindler (Generics Policeman) and others. * @@ -21,5 +24,21 @@ * @since 2.0 */ public final class SignaturesArtifact { - public String groupId, artifactId, version, type, classifier; + public String groupId; + public String artifactId; + public String version; + public String classifier; + public String type; + + /** Path to resource inside JAR artifacts. */ + public String path; + + public Artifact createArtifact(ArtifactFactory artifactFactory) { + if (groupId == null || artifactId == null || version == null || type == null) { + throw new NullPointerException("signaturesArtifact is missing some properties. Required are: groupId, artifactId, version, type"); + } + return (classifier != null) ? + artifactFactory.createArtifactWithClassifier(groupId, artifactId, version, type, classifier) : + artifactFactory.createArtifact(groupId, artifactId, version, null/*scope*/, type); + } } From e57c9cf082d81a922b7cf72fda5f46fbfd91f135 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 29 Sep 2015 00:09:04 +0200 Subject: [PATCH 4/9] Escape resource path when creating JAR URL --- .../forbiddenapis/maven/AbstractCheckMojo.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index 25267710..e4c9cdf3 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -40,6 +40,8 @@ import java.io.File; import java.io.IOException; import java.lang.annotation.RetentionPolicy; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URLClassLoader; import java.net.MalformedURLException; import java.net.URL; @@ -208,6 +210,15 @@ private File resolveSignaturesArtifact(SignaturesArtifact signaturesArtifact) th artifactResolver.resolve(artifact, this.remoteRepositories, this.localRepository); return artifact.getFile(); } + + private String encodeUrlPath(String path) { + try { + // hack to encode the URL path by misusing URI class: + return new URI(null, path, null).toASCIIString(); + } catch (URISyntaxException e) { + throw new IllegalArgumentException(e.getMessage()); + } + } @Override public void execute() throws MojoExecutionException { @@ -331,8 +342,8 @@ public void info(String msg) { final File f = resolveSignaturesArtifact(artifact); if (artifact.path != null) { final URL fileUrl = f.toURI().toURL(); - final URL jarUrl = new URL("jar", "", -1, fileUrl.toExternalForm() + "!/"); - sigUrls.add(new URL(jarUrl, artifact.path)); + final URL jarBaseUrl = new URL("jar", null, fileUrl.toExternalForm() + "!/"); + sigUrls.add(new URL(jarBaseUrl, encodeUrlPath(artifact.path))); } else { sigFiles.add(f); } From 516012d08b49f723730cd9cd9ec0271f39afade6 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 29 Sep 2015 08:39:48 +0200 Subject: [PATCH 5/9] Move JAR URl creator to separate method --- .../forbiddenapis/maven/AbstractCheckMojo.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index e4c9cdf3..0cc06738 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -219,6 +219,12 @@ private String encodeUrlPath(String path) { throw new IllegalArgumentException(e.getMessage()); } } + + private URL createJarUrl(File f, String jarPath) throws MalformedURLException { + final URL fileUrl = f.toURI().toURL(); + final URL jarBaseUrl = new URL("jar", null, fileUrl.toExternalForm() + "!/"); + return new URL(jarBaseUrl, encodeUrlPath(jarPath)); + } @Override public void execute() throws MojoExecutionException { @@ -341,9 +347,7 @@ public void info(String msg) { for (final SignaturesArtifact artifact : signaturesArtifacts) { final File f = resolveSignaturesArtifact(artifact); if (artifact.path != null) { - final URL fileUrl = f.toURI().toURL(); - final URL jarBaseUrl = new URL("jar", null, fileUrl.toExternalForm() + "!/"); - sigUrls.add(new URL(jarBaseUrl, encodeUrlPath(artifact.path))); + sigUrls.add(createJarUrl(f, artifact.path)); } else { sigFiles.add(f); } From a176b373fcfb8bf82d2220f5676ec8a7f6e92404 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 29 Sep 2015 13:47:12 +0200 Subject: [PATCH 6/9] Cleanup logging --- .../maven/AbstractCheckMojo.java | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index 0cc06738..74e50a6d 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -26,7 +26,6 @@ import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.logging.Log; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; import org.codehaus.plexus.util.DirectoryScanner; @@ -228,7 +227,22 @@ private URL createJarUrl(File f, String jarPath) throws MalformedURLException { @Override public void execute() throws MojoExecutionException { - final Log log = getLog(); + final Logger log = new Logger() { + @Override + public void error(String msg) { + getLog().error(msg); + } + + @Override + public void warn(String msg) { + getLog().warn(msg); + } + + @Override + public void info(String msg) { + getLog().info(msg); + } + }; if (skip) { log.info("Skipping forbidden-apis checks."); @@ -253,7 +267,6 @@ public void execute() throws MojoExecutionException { urls[i++] = new File(cpElement).toURI().toURL(); } assert i == urls.length; - if (log.isDebugEnabled()) log.debug("Compile Classpath: " + Arrays.toString(urls)); } catch (MalformedURLException e) { throw new MojoExecutionException("Failed to build classpath.", e); } @@ -269,22 +282,7 @@ public void execute() throws MojoExecutionException { if (failOnMissingClasses) options.add(FAIL_ON_MISSING_CLASSES); if (failOnViolation) options.add(FAIL_ON_VIOLATION); if (failOnUnresolvableSignatures) options.add(FAIL_ON_UNRESOLVABLE_SIGNATURES); - final Checker checker = new Checker(new Logger() { - @Override - public void error(String msg) { - log.error(msg); - } - - @Override - public void warn(String msg) { - log.warn(msg); - } - - @Override - public void info(String msg) { - log.info(msg); - } - }, loader, options); + final Checker checker = new Checker(log, loader, options); if (!checker.isSupportedJDK) { final String msg = String.format(Locale.ENGLISH, From c120d35d8c2d5c20a1ccb0514786fcf8351c96a6 Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 29 Sep 2015 15:14:59 +0200 Subject: [PATCH 7/9] Update documentation --- .../maven/AbstractCheckMojo.java | 28 +++++++++++++++++-- .../maven/SignaturesArtifact.java | 28 +++++++++++++++---- 2 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index 74e50a6d..4c78c1f2 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -67,7 +67,29 @@ public abstract class AbstractCheckMojo extends AbstractMojo { /** * Lists all Maven artifacts, which contain signatures and comments for forbidden API calls. - * The signatures are resolved against the compile classpath. + * The artifact needs to be specified like a Maven dependency. Resolution is not transitive. + * You can refer to plain text Maven artifacts ({@code type="txt"}, e.g., with a separate {@code classifier}): + *
+   * <signaturesArtifact>
+   *   <groupId>org.apache.foobar</groupId>
+   *   <artifactId>example</artifactId>
+   *   <version>1.0</version>
+   *   <classifier>signatures</classifier>
+   *   <type>txt</type>
+   * </signaturesArtifact>
+   * 
+ * Alternatively, refer to signatures files inside JAR artifacts. In that case, the additional + * parameter {@code path} has to be given: + *
+   * <signaturesArtifact>
+   *   <groupId>org.apache.foobar</groupId>
+   *   <artifactId>example</artifactId>
+   *   <version>1.0</version>
+   *   <type>jar</type>
+   *   <path>path/inside/jar/file/signatures.txt</path>
+   * </signaturesArtifact>
+   * 
+ *

The signatures are resolved against the compile classpath. * @since 2.0 */ @Parameter(required = false) @@ -366,9 +388,9 @@ public void info(String msg) { } catch (ParseException pe) { throw new MojoExecutionException("Parsing signatures failed: " + pe.getMessage(), pe); } catch (ArtifactResolutionException e) { - throw new MojoExecutionException("Problem while resolving signatures Maven artifact.", e); + throw new MojoExecutionException("Problem while resolving Maven artifact.", e); } catch (ArtifactNotFoundException e) { - throw new MojoExecutionException("Signatures Maven artifact does not exist.", e); + throw new MojoExecutionException("Maven artifact does not exist.", e); } if (checker.hasNoSignatures()) { diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java index c9f41b6e..01da5c11 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/SignaturesArtifact.java @@ -20,25 +20,41 @@ */ /** - * TODO + * Defines coordinates of a Maven artifact that provides signatures files. + * It may be a plain text file ({@link #path} is not given) or alternatively + * refer to a text file inside a JAR file. For that, define the resource path + * using {@link #path}. * @since 2.0 */ public final class SignaturesArtifact { + + /** Artifact's group ID (required) */ public String groupId; + + /** Artifact's ID (required) */ public String artifactId; + + /** Version (required) */ public String version; + + /** Classifier (optional) */ public String classifier; + + /** + * Type (required; {@code txt} or {@code jar}). + * If the artifact refers to a JAR file, the {@link #path} should be + * given, that identifies the signatures file inside the JAR. + * */ public String type; - /** Path to resource inside JAR artifacts. */ + /** Path to resource inside JAR artifacts. If given, the {@link #type} must be {@code "jar"} or {@code "zip"}. */ public String path; - public Artifact createArtifact(ArtifactFactory artifactFactory) { + /** Used by the mojo to fetch the artifact */ + Artifact createArtifact(ArtifactFactory artifactFactory) { if (groupId == null || artifactId == null || version == null || type == null) { throw new NullPointerException("signaturesArtifact is missing some properties. Required are: groupId, artifactId, version, type"); } - return (classifier != null) ? - artifactFactory.createArtifactWithClassifier(groupId, artifactId, version, type, classifier) : - artifactFactory.createArtifact(groupId, artifactId, version, null/*scope*/, type); + return artifactFactory.createArtifactWithClassifier(groupId, artifactId, version, type, classifier); } } From 216b6e77ab2b52cc17b34bd1153c04ee9658b42f Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 29 Sep 2015 15:16:32 +0200 Subject: [PATCH 8/9] Add missing property in error message --- .../java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java index 4c78c1f2..5ecb0328 100644 --- a/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java +++ b/src/main/java/de/thetaphi/forbiddenapis/maven/AbstractCheckMojo.java @@ -395,7 +395,7 @@ public void info(String msg) { if (checker.hasNoSignatures()) { if (failOnUnresolvableSignatures) { - throw new MojoExecutionException("No API signatures found; use parameters 'signatures', 'bundledSignatures', and/or 'signaturesFiles' to define those!"); + throw new MojoExecutionException("No API signatures found; use parameters 'signatures', 'bundledSignatures', 'signaturesFiles', and/or 'signaturesArtifacts' to define those!"); } else { log.info("Skipping execution because no API signatures are available."); return; From 4c4b4b29e7afad2719e2bfab628d6e08ccf6265b Mon Sep 17 00:00:00 2001 From: Uwe Schindler Date: Tue, 29 Sep 2015 16:26:03 +0200 Subject: [PATCH 9/9] Add test for signatures artifacts --- src/test/antunit/TestMavenMojo.xml | 18 +++++++++ src/test/antunit/pom-sigArtifacts.xml | 56 +++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 src/test/antunit/pom-sigArtifacts.xml diff --git a/src/test/antunit/TestMavenMojo.xml b/src/test/antunit/TestMavenMojo.xml index 4c0edeb0..821eaa9f 100644 --- a/src/test/antunit/TestMavenMojo.xml +++ b/src/test/antunit/TestMavenMojo.xml @@ -109,4 +109,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/antunit/pom-sigArtifacts.xml b/src/test/antunit/pom-sigArtifacts.xml new file mode 100644 index 00000000..d5a60df1 --- /dev/null +++ b/src/test/antunit/pom-sigArtifacts.xml @@ -0,0 +1,56 @@ + + + + 4.0.0 + de.thetaphi + forbiddenapi-test3 + 0.0-SNAPSHOT + Dummy Project to test signatures from Maven artifacts + + + + + ${groupId} + ${artifactId} + ${version} + + . + false + false + + + ${groupId} + ${artifactId} + ${version} + jar + de/thetaphi/forbiddenapis/signatures/jdk-deprecated-${jdk.version}.txt + + + + + + + check + + + + + + + +