Merge branch 'develop' into stable
This commit is contained in:
@@ -31,13 +31,14 @@ This is a maven plugin that allows for developers and organizations to ban Maven
|
|||||||
</artifact>
|
</artifact>
|
||||||
<artifact>com.inteligr8:ban-maven-plugin:[,1.0.0)</artifact>
|
<artifact>com.inteligr8:ban-maven-plugin:[,1.0.0)</artifact>
|
||||||
<artifact>log4j:log4j</artifact>
|
<artifact>log4j:log4j</artifact>
|
||||||
<artifact>org\.springframework.*::[,4.0.0.RELEASE)</artifact>
|
<artifact>org\.springframe.+::[,4.0.0.RELEASE)</artifact>
|
||||||
</includes>
|
</includes>
|
||||||
<excludes>
|
<excludes>
|
||||||
<artifact>
|
<artifact>
|
||||||
....
|
....
|
||||||
</artifact>
|
</artifact>
|
||||||
</excludes>
|
</excludes>
|
||||||
|
<import>https://domain:port/path/file</import>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
...
|
...
|
||||||
@@ -61,5 +62,3 @@ The `version` element supports the standard Maven specification. You can match
|
|||||||
There is nothing stopping you from specifying two `artifact` elements with the exact same values. So you can ban multiple version ranges of the same artifact by using multiple `artifact` elements.
|
There is nothing stopping you from specifying two `artifact` elements with the exact same values. So you can ban multiple version ranges of the same artifact by using multiple `artifact` elements.
|
||||||
|
|
||||||
If you *include* all versions by omitting the `version` element, you can still *exclude* (unban) certain versions, like `[1.2.17,)`.
|
If you *include* all versions by omitting the `version` element, you can still *exclude* (unban) certain versions, like `[1.2.17,)`.
|
||||||
|
|
||||||
It is recommended that you look into [Maven Tiles](https://github.com/repaint-io/maven-tiles) so you can use a tile to define your banned artifacts and side load them into all your projects.
|
|
@@ -0,0 +1,130 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
||||||
|
import org.apache.maven.artifact.versioning.VersionRange;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import com.inteligr8.maven.model.ArtifactFilter;
|
||||||
|
|
||||||
|
public class AbstractBanConfiguration implements BanConfiguration {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||||
|
private final Pattern artifactPattern = Pattern.compile("^([^:]+):([^:]+)(:([^:]+))?$");
|
||||||
|
private final Pattern notRegexPattern = Pattern.compile("^[A-Za-z0-9_\\.]*$");
|
||||||
|
|
||||||
|
private final List<ArtifactFilter> includeArtifacts = new LinkedList<>();
|
||||||
|
private final List<ArtifactFilter> excludeArtifacts = new LinkedList<>();
|
||||||
|
|
||||||
|
public void init(Xpp3Dom rootDom) throws IOException, MojoFailureException {
|
||||||
|
if (rootDom == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Xpp3Dom importDom = rootDom.getChild("import");
|
||||||
|
if (importDom != null) {
|
||||||
|
String url = StringUtils.trimToNull(importDom.getValue());
|
||||||
|
BanConfigurationDownloader downloader = new BanConfigurationDownloader(url);
|
||||||
|
this.includeArtifacts.addAll(downloader.getIncludeArtifacts());
|
||||||
|
this.excludeArtifacts.addAll(downloader.getExcludeArtifacts());
|
||||||
|
}
|
||||||
|
|
||||||
|
Xpp3Dom includesDom = rootDom.getChild("includes");
|
||||||
|
if (includesDom != null)
|
||||||
|
this.includeArtifacts.addAll(this.parseArtifacts(includesDom));
|
||||||
|
|
||||||
|
Xpp3Dom excludesDom = rootDom.getChild("excludes");
|
||||||
|
if (excludesDom != null)
|
||||||
|
this.excludeArtifacts.addAll(this.parseArtifacts(excludesDom));
|
||||||
|
|
||||||
|
this.logger.debug("Include artifacts: {}", this.includeArtifacts);
|
||||||
|
this.logger.debug("Exclude artifacts: {}", this.excludeArtifacts);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ArtifactFilter> getIncludeArtifacts() {
|
||||||
|
return this.includeArtifacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ArtifactFilter> getExcludeArtifacts() {
|
||||||
|
return this.excludeArtifacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ArtifactFilter> parseArtifacts(Xpp3Dom artifactsDom) {
|
||||||
|
List<ArtifactFilter> filters = new LinkedList<>();
|
||||||
|
|
||||||
|
for (Xpp3Dom artifactDom : artifactsDom.getChildren("artifact")) {
|
||||||
|
ArtifactFilter filter = new ArtifactFilter();
|
||||||
|
String versionSpec = null;
|
||||||
|
if (artifactDom.getChildCount() == 0) {
|
||||||
|
Matcher matcher = this.artifactPattern.matcher(artifactDom.getValue());
|
||||||
|
if (!matcher.matches()) {
|
||||||
|
this.logger.warn("The artifact format '{}' does not match the expected regular expression: {}; ignoring ...", artifactDom.getValue(), this.artifactPattern.pattern());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.notRegexPattern.matcher(matcher.group(1)).matches()) {
|
||||||
|
filter.setGroupId(StringUtils.trimToNull(matcher.group(1)));
|
||||||
|
} else {
|
||||||
|
filter.setGroupIdRegex(StringUtils.trimToNull(matcher.group(1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.notRegexPattern.matcher(matcher.group(2)).matches()) {
|
||||||
|
filter.setArtifactId(StringUtils.trimToNull(matcher.group(2)));
|
||||||
|
} else {
|
||||||
|
filter.setArtifactIdRegex(StringUtils.trimToNull(matcher.group(2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
versionSpec = StringUtils.trimToNull(matcher.group(4));
|
||||||
|
} else {
|
||||||
|
filter.setGroupId(this.getChildValue(artifactDom, "groupId"));
|
||||||
|
filter.setGroupIdRegex(this.getChildValue(artifactDom, "groupIdRegex"));
|
||||||
|
filter.setArtifactId(this.getChildValue(artifactDom, "artifactId"));
|
||||||
|
filter.setArtifactIdRegex(this.getChildValue(artifactDom, "artifactIdRegex"));
|
||||||
|
|
||||||
|
versionSpec = this.getChildValue(artifactDom, "version");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (versionSpec != null) {
|
||||||
|
try {
|
||||||
|
VersionRange versionRange = VersionRange.createFromVersionSpec(versionSpec);
|
||||||
|
filter.setVersionRange(versionRange);
|
||||||
|
} catch (InvalidVersionSpecificationException ivse) {
|
||||||
|
this.logger.warn("The artifact '{}' has an invalid version specification; the artifact element will be ignored: {}", ivse.getMessage());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filters.add(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
return filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getChildValue(Xpp3Dom dom, String child) {
|
||||||
|
Xpp3Dom childDom = dom.getChild(child);
|
||||||
|
return childDom == null ? null : StringUtils.trimToNull(childDom.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
27
src/main/java/com/inteligr8/maven/ban/BanConfiguration.java
Normal file
27
src/main/java/com/inteligr8/maven/ban/BanConfiguration.java
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.inteligr8.maven.model.ArtifactFilter;
|
||||||
|
|
||||||
|
public interface BanConfiguration {
|
||||||
|
|
||||||
|
List<ArtifactFilter> getIncludeArtifacts();
|
||||||
|
|
||||||
|
List<ArtifactFilter> getExcludeArtifacts();
|
||||||
|
|
||||||
|
}
|
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* This program is free software: you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
|
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
|
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
|
||||||
|
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class BanConfigurationDownloader extends AbstractBanConfiguration {
|
||||||
|
|
||||||
|
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
|
public BanConfigurationDownloader(String url) throws IOException, MojoFailureException {
|
||||||
|
try {
|
||||||
|
Xpp3Dom rootDom = this.load(new URL(url));
|
||||||
|
this.init(rootDom);
|
||||||
|
} catch (XmlPullParserException xppe) {
|
||||||
|
throw new MojoFailureException(xppe.getMessage(), xppe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Xpp3Dom load(URL url) throws IOException, XmlPullParserException {
|
||||||
|
InputStream istream = url.openStream();
|
||||||
|
BufferedInputStream bistream = new BufferedInputStream(istream, 16384);
|
||||||
|
try {
|
||||||
|
this.logger.debug("Downloading configuration: {}", url);
|
||||||
|
return Xpp3DomBuilder.build(bistream, "utf-8");
|
||||||
|
} finally {
|
||||||
|
bistream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -14,118 +14,17 @@
|
|||||||
*/
|
*/
|
||||||
package com.inteligr8.maven.ban;
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
|
|
||||||
import org.apache.maven.artifact.versioning.VersionRange;
|
|
||||||
import org.apache.maven.model.Plugin;
|
import org.apache.maven.model.Plugin;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
import org.codehaus.plexus.util.xml.Xpp3Dom;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
import com.inteligr8.maven.model.ArtifactFilter;
|
public class BanConfigurationParser extends AbstractBanConfiguration {
|
||||||
|
|
||||||
public class BanConfigurationParser {
|
public BanConfigurationParser(Plugin plugin) throws IOException, MojoFailureException {
|
||||||
|
|
||||||
private final Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
||||||
private final Pattern artifactPattern = Pattern.compile("^([^:]+):([^:]+)(:([^:]+))?$");
|
|
||||||
private final Pattern notRegexPattern = Pattern.compile("^[A-Za-z0-9_\\.]*$");
|
|
||||||
|
|
||||||
private final List<ArtifactFilter> includeArtifacts;
|
|
||||||
private final List<ArtifactFilter> excludeArtifacts;
|
|
||||||
|
|
||||||
public BanConfigurationParser(Plugin plugin) {
|
|
||||||
Xpp3Dom rootDom = (Xpp3Dom) plugin.getConfiguration();
|
Xpp3Dom rootDom = (Xpp3Dom) plugin.getConfiguration();
|
||||||
if (rootDom == null) {
|
this.init(rootDom);
|
||||||
this.includeArtifacts = Collections.emptyList();
|
|
||||||
this.excludeArtifacts = Collections.emptyList();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Xpp3Dom includesDom = rootDom.getChild("includes");
|
|
||||||
if (includesDom != null) {
|
|
||||||
this.includeArtifacts = this.parseArtifacts(includesDom);
|
|
||||||
this.logger.debug("Include artifacts: {}", this.includeArtifacts);
|
|
||||||
} else {
|
|
||||||
this.includeArtifacts = Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
Xpp3Dom excludesDom = rootDom.getChild("excludes");
|
|
||||||
if (excludesDom != null) {
|
|
||||||
this.excludeArtifacts = this.parseArtifacts(excludesDom);
|
|
||||||
this.logger.debug("Exclude artifacts: {}", this.excludeArtifacts);
|
|
||||||
} else {
|
|
||||||
this.excludeArtifacts = Collections.emptyList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ArtifactFilter> getIncludeArtifacts() {
|
|
||||||
return this.includeArtifacts;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ArtifactFilter> getExcludeArtifacts() {
|
|
||||||
return this.excludeArtifacts;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<ArtifactFilter> parseArtifacts(Xpp3Dom artifactsDom) {
|
|
||||||
List<ArtifactFilter> filters = new LinkedList<>();
|
|
||||||
|
|
||||||
for (Xpp3Dom artifactDom : artifactsDom.getChildren("artifact")) {
|
|
||||||
ArtifactFilter filter = new ArtifactFilter();
|
|
||||||
String versionSpec = null;
|
|
||||||
if (artifactDom.getChildCount() == 0) {
|
|
||||||
Matcher matcher = this.artifactPattern.matcher(artifactDom.getValue());
|
|
||||||
if (!matcher.matches()) {
|
|
||||||
this.logger.warn("The artifact format '{}' does not match the expected regular expression: {}; ignoring ...", artifactDom.getValue(), this.artifactPattern.pattern());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.notRegexPattern.matcher(matcher.group(1)).matches()) {
|
|
||||||
filter.setGroupId(StringUtils.trimToNull(matcher.group(1)));
|
|
||||||
} else {
|
|
||||||
filter.setGroupIdRegex(StringUtils.trimToNull(matcher.group(1)));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.notRegexPattern.matcher(matcher.group(2)).matches()) {
|
|
||||||
filter.setArtifactId(StringUtils.trimToNull(matcher.group(2)));
|
|
||||||
} else {
|
|
||||||
filter.setArtifactIdRegex(StringUtils.trimToNull(matcher.group(2)));
|
|
||||||
}
|
|
||||||
|
|
||||||
versionSpec = StringUtils.trimToNull(matcher.group(4));
|
|
||||||
} else {
|
|
||||||
filter.setGroupId(this.getChildValue(artifactDom, "groupId"));
|
|
||||||
filter.setGroupIdRegex(this.getChildValue(artifactDom, "groupIdRegex"));
|
|
||||||
filter.setArtifactId(this.getChildValue(artifactDom, "artifactId"));
|
|
||||||
filter.setArtifactIdRegex(this.getChildValue(artifactDom, "artifactIdRegex"));
|
|
||||||
|
|
||||||
versionSpec = this.getChildValue(artifactDom, "version");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (versionSpec != null) {
|
|
||||||
try {
|
|
||||||
VersionRange versionRange = VersionRange.createFromVersionSpec(versionSpec);
|
|
||||||
filter.setVersionRange(versionRange);
|
|
||||||
} catch (InvalidVersionSpecificationException ivse) {
|
|
||||||
this.logger.warn("The artifact '{}' has an invalid version specification; the artifact element will be ignored: {}", ivse.getMessage());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
filters.add(filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
return filters;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getChildValue(Xpp3Dom dom, String child) {
|
|
||||||
Xpp3Dom childDom = dom.getChild(child);
|
|
||||||
return childDom == null ? null : StringUtils.trimToNull(childDom.getValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
package com.inteligr8.maven.ban;
|
package com.inteligr8.maven.ban;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -25,6 +26,7 @@ import org.apache.maven.AbstractMavenLifecycleParticipant;
|
|||||||
import org.apache.maven.MavenExecutionException;
|
import org.apache.maven.MavenExecutionException;
|
||||||
import org.apache.maven.execution.MavenSession;
|
import org.apache.maven.execution.MavenSession;
|
||||||
import org.apache.maven.model.Plugin;
|
import org.apache.maven.model.Plugin;
|
||||||
|
import org.apache.maven.plugin.MojoFailureException;
|
||||||
import org.apache.maven.plugin.PluginResolutionException;
|
import org.apache.maven.plugin.PluginResolutionException;
|
||||||
import org.apache.maven.plugin.internal.PluginDependenciesResolver;
|
import org.apache.maven.plugin.internal.PluginDependenciesResolver;
|
||||||
import org.apache.maven.project.DefaultDependencyResolutionRequest;
|
import org.apache.maven.project.DefaultDependencyResolutionRequest;
|
||||||
@@ -59,7 +61,7 @@ public class BanExtension extends AbstractMavenLifecycleParticipant {
|
|||||||
@Override
|
@Override
|
||||||
public void afterProjectsRead(MavenSession session) throws MavenExecutionException {
|
public void afterProjectsRead(MavenSession session) throws MavenExecutionException {
|
||||||
MavenProject project = session.getCurrentProject();
|
MavenProject project = session.getCurrentProject();
|
||||||
BanConfigurationParser config = this.getConfiguration(project);
|
BanConfiguration config = this.getConfiguration(project);
|
||||||
if (config == null)
|
if (config == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -104,7 +106,11 @@ public class BanExtension extends AbstractMavenLifecycleParticipant {
|
|||||||
this.logger.warn("The '{}' plugin must be defined with '<extensions>true</extensions>'; ignoring plugin", plugin.getId());
|
this.logger.warn("The '{}' plugin must be defined with '<extensions>true</extensions>'; ignoring plugin", plugin.getId());
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
|
try {
|
||||||
return new BanConfigurationParser(plugin);
|
return new BanConfigurationParser(plugin);
|
||||||
|
} catch (IOException | MojoFailureException e) {
|
||||||
|
throw new MavenExecutionException(e.getMessage(), project.getFile());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -159,7 +159,7 @@ public class PurgeRepoMojo extends AbstractMojo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private BanConfigurationParser getConfiguration(MavenProject project) throws MojoFailureException {
|
private BanConfigurationParser getConfiguration(MavenProject project) throws MojoFailureException, IOException {
|
||||||
Plugin plugin = project.getPlugin(BanExtension.THIS_PLUGIN_KEY);
|
Plugin plugin = project.getPlugin(BanExtension.THIS_PLUGIN_KEY);
|
||||||
if (plugin == null)
|
if (plugin == null)
|
||||||
throw new MojoFailureException("The plugin is executing but it cannot be found");
|
throw new MojoFailureException("The plugin is executing but it cannot be found");
|
||||||
|
Reference in New Issue
Block a user