From 11e29a14b7df6a40854a662b642c08182c776de1 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Wed, 22 Jul 2020 11:08:07 +0200 Subject: [PATCH 01/10] align .gitattributes with .editorconfig --- .../src/files/properties/.gitattributes | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/it/update-file-header-test-mojo/src/files/properties/.gitattributes diff --git a/src/it/update-file-header-test-mojo/src/files/properties/.gitattributes b/src/it/update-file-header-test-mojo/src/files/properties/.gitattributes new file mode 100644 index 000000000..00a9c8f0e --- /dev/null +++ b/src/it/update-file-header-test-mojo/src/files/properties/.gitattributes @@ -0,0 +1 @@ +*.crlf.sh text eol=crlf From 75160e45cb800084c2a4069d7e5a33d132caeed7 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Wed, 22 Jul 2020 11:24:40 +0200 Subject: [PATCH 02/10] skip ITs on jitpack --- jitpack.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 jitpack.yml diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 000000000..8802b4012 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,3 @@ +install: + # We also need to skip the integration tests + - ./mvnw clean install -DskipTests -DskipITs From 93a998e5b29ccec8cd2a6c54a8164870c34bcce2 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Wed, 22 Jul 2020 11:41:03 +0200 Subject: [PATCH 03/10] update version and groupId so the plugin descriptor is correct --- jitpack.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jitpack.yml b/jitpack.yml index 8802b4012..d93843f73 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,3 +1,7 @@ install: + # Fix the group id + - find . -name "pom.xml" | xargs sed -i "s/<\/parent>/<\/parent>${GROUP}<\/groupId>/g" + # Fix the version + - ./mvnw versions:set -DnewVersion=${VERSION} # We also need to skip the integration tests - ./mvnw clean install -DskipTests -DskipITs From a5b87c27945f6448f3cc87f59ccca11062e5fa5f Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Wed, 22 Jul 2020 12:03:01 +0200 Subject: [PATCH 04/10] Convert mac file endings for CDATA --- .../codehaus/mojo/license/download/LicenseSummaryWriter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/codehaus/mojo/license/download/LicenseSummaryWriter.java b/src/main/java/org/codehaus/mojo/license/download/LicenseSummaryWriter.java index 2eef92a9b..e73b90690 100644 --- a/src/main/java/org/codehaus/mojo/license/download/LicenseSummaryWriter.java +++ b/src/main/java/org/codehaus/mojo/license/download/LicenseSummaryWriter.java @@ -302,14 +302,14 @@ private static void addCdataIfSet(Document doc, Node parentNode, String elementN } /** - * Fix string to being written as CDATA under windows, also compatible with *nix systems.
+ * Fix string to being written as CDATA under windows or mac os, also compatible with *nix systems.
* See https://bugs.openjdk.java.net/browse/JDK-8133452 * * @param property Property to prepare being written as XML CDATA * @return The properly prepared string. */ private static String prepareCdata(String property) { - return property.replace("\r\n", "\n").replace("\f", "\n"); + return property.replace("\r\n", "\n").replace("\f", "\n").replace("\r", "\n"); } private static void addPropertyIfSet( From 8f70e4dfd79f3ef70830e3193c50e8ca5ca409a4 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Sun, 10 Dec 2023 15:38:59 +0100 Subject: [PATCH 05/10] Added license.excludedModules Exclude modules from processing. Comma separated list of relative module paths. Exclusions are not recursive. --- .../AggregateDownloadLicensesMojo.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java index 6c2aecc47..d16169f70 100644 --- a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java @@ -108,6 +108,16 @@ public class AggregateDownloadLicensesMojo extends AbstractDownloadLicensesMojo @Parameter(property = "license.extendedInfo", defaultValue = "false") private boolean extendedInfo; + /** + * Exclude modules from processing. + *

+ * Comma separated list of relative module paths. Exclusions are not recursive. + * + * @since 2.1 + */ + @Parameter(property = "license.excludedModules") + private String excludedModules; + // ---------------------------------------------------------------------- // AbstractDownloadLicensesMojo Implementation // ---------------------------------------------------------------------- @@ -126,7 +136,17 @@ protected boolean isSkip() { protected Map getDependencies() { final Map result = new TreeMap<>(); + List excludedModules = MojoHelper.getParams(this.excludedModules); + for (MavenProject p : reactorProjects) { + if (excludedModules.contains(getProject() + .getBasedir() + .toPath() + .relativize(p.getBasedir().toPath()) + .toString())) { + getLog().info("Skipping excluded module " + p); + continue; + } licensedArtifactResolver.loadProjectDependencies( new ResolvedProjectDependencies(p.getArtifacts(), MojoHelper.getDependencyArtifacts(p)), this, From 9cb27291c16a74e26e4903d002c17c4366bec61a Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Wed, 22 Jul 2020 21:40:45 +0200 Subject: [PATCH 06/10] Mark .jar as binary --- .gitattributes | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitattributes b/.gitattributes index 8151bc4fa..2cb6a8ba7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ * text eol=lf *.cmd text eol=crlf +*.jar binary \ No newline at end of file From 6558b49a7f9a866c6d273b1718ff43822f275e5b Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Fri, 24 Jul 2020 10:05:41 +0200 Subject: [PATCH 07/10] Added license.includedModules Include modules for processing. Comma separated list of relative module paths. Inclusions are not recursive. Empty value includes all. --- .../AggregateDownloadLicensesMojo.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java index d16169f70..39a47afc9 100644 --- a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java @@ -118,6 +118,18 @@ public class AggregateDownloadLicensesMojo extends AbstractDownloadLicensesMojo @Parameter(property = "license.excludedModules") private String excludedModules; + /** + * Includes modules from processing. + *

+ * Comma separated list of relative module paths. Inclusions are not recursive. + * + * Includes all modules if left empty + * + * @since 2.1 + */ + @Parameter(property = "license.includedModules") + private String includedModules; + // ---------------------------------------------------------------------- // AbstractDownloadLicensesMojo Implementation // ---------------------------------------------------------------------- @@ -136,24 +148,27 @@ protected boolean isSkip() { protected Map getDependencies() { final Map result = new TreeMap<>(); + List includedModules = MojoHelper.getParams(this.includedModules); List excludedModules = MojoHelper.getParams(this.excludedModules); for (MavenProject p : reactorProjects) { - if (excludedModules.contains(getProject() + String modulePath = getProject() .getBasedir() .toPath() .relativize(p.getBasedir().toPath()) - .toString())) { + .toString(); + if ((includedModules.isEmpty() || includedModules.contains(modulePath)) + && !excludedModules.contains(modulePath)) { + licensedArtifactResolver.loadProjectDependencies( + new ResolvedProjectDependencies(p.getArtifacts(), MojoHelper.getDependencyArtifacts(p)), + this, + remoteRepositories, + result, + extendedInfo, + licenseMerges); + } else { getLog().info("Skipping excluded module " + p); - continue; } - licensedArtifactResolver.loadProjectDependencies( - new ResolvedProjectDependencies(p.getArtifacts(), MojoHelper.getDependencyArtifacts(p)), - this, - remoteRepositories, - result, - extendedInfo, - licenseMerges); } return result; } From a7619a74d3fb1299e15077107ab6dcd2ba846553 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Fri, 24 Jul 2020 17:04:55 +0200 Subject: [PATCH 08/10] use resource manager to load licensesConfigFile * supports loading licensesConfigFile from file/url/classpath --- pom.xml | 12 ++++++ .../license/AbstractDownloadLicensesMojo.java | 42 ++++++++++++++++--- .../license/download/LicenseMatchers.java | 8 ++-- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index b49bc2c89..288504780 100644 --- a/pom.xml +++ b/pom.xml @@ -268,6 +268,18 @@ plexus-xml 3.0.0 + + org.codehaus.plexus + plexus-resources + 1.1.0 + + + + org.codehaus.plexus + plexus-container-default + 2.0.0 + provided + org.nuiton.processor diff --git a/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java index 0f558882c..d65d3e1bf 100644 --- a/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -50,6 +51,7 @@ import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Proxy; @@ -72,6 +74,10 @@ import org.codehaus.mojo.license.spdx.SpdxLicenseList; import org.codehaus.mojo.license.spdx.SpdxLicenseList.Attachments.ContentSanitizer; import org.codehaus.mojo.license.utils.FileUtil; +import org.codehaus.plexus.resource.ResourceManager; +import org.codehaus.plexus.resource.loader.FileResourceCreationException; +import org.codehaus.plexus.resource.loader.FileResourceLoader; +import org.codehaus.plexus.resource.loader.ResourceNotFoundException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -183,7 +189,7 @@ public abstract class AbstractDownloadLicensesMojo extends AbstractLicensesXmlMo * @since 1.0 */ @Parameter(property = "licensesConfigFile", defaultValue = "${project.basedir}/src/license/licenses.xml") - protected File licensesConfigFile; + protected String licensesConfigFile; // CHECKSTYLE_ON: LineLength /** @@ -758,7 +764,10 @@ public abstract class AbstractDownloadLicensesMojo extends AbstractLicensesXmlMo // ---------------------------------------------------------------------- // Plexus Components // ---------------------------------------------------------------------- + @Component + private ResourceManager locator; + private boolean locatorInitialized; // ---------------------------------------------------------------------- // Private Fields // ---------------------------------------------------------------------- @@ -785,6 +794,24 @@ protected MavenProject getProject() { protected abstract Map getDependencies(); + protected URL getResource(String pResource) { + try { + return getLocator().getResource(pResource).getURL(); + } catch (ResourceNotFoundException | IOException exception) { + LOG.debug("Could not find resource " + pResource); + return null; + } + } + + protected ResourceManager getLocator() { + if (!locatorInitialized) { + locator.addSearchPath( + FileResourceLoader.ID, getProject().getBasedir().getAbsolutePath()); + locatorInitialized = true; + } + return locator; + } + // ---------------------------------------------------------------------- // Mojo Implementation // ---------------------------------------------------------------------- @@ -807,7 +834,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { initDirectories(); - final LicenseMatchers matchers = LicenseMatchers.load(licensesConfigFile); + final LicenseMatchers matchers = LicenseMatchers.load(getResource(licensesConfigFile)); if (!forceDownload) { try { @@ -1143,9 +1170,14 @@ private void initDirectories() throws MojoExecutionException { /** {@inheritDoc} */ protected Path[] getAutodetectEolFiles() { - return new Path[] { - licensesConfigFile.toPath(), project.getBasedir().toPath().resolve("pom.xml") - }; + File resource; + try { + resource = getLocator().getResourceAsFile(licensesConfigFile).getAbsoluteFile(); + } catch (ResourceNotFoundException | FileResourceCreationException e) { + // Fallback on previous handling + resource = new File(licensesConfigFile); + } + return new Path[] {resource.toPath(), project.getBasedir().toPath().resolve("pom.xml")}; } private Proxy findActiveProxy() throws MojoExecutionException { diff --git a/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java b/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java index fca373043..49e51dba8 100644 --- a/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java +++ b/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java @@ -22,7 +22,7 @@ * #L% */ -import java.io.File; +import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -54,12 +54,12 @@ public static Builder builder() { * @return new {@link LicenseMatchers} configured from the given {@code licenseMatchersFile} * @throws MojoExecutionException */ - public static LicenseMatchers load(File licenseMatchersFile) throws MojoExecutionException { + public static LicenseMatchers load(URL licenseMatchersFile) throws MojoExecutionException { final List matchers = new ArrayList<>(); try { - if (licenseMatchersFile != null && licenseMatchersFile.exists()) { + if (licenseMatchersFile != null) { final List replacements = - LicenseSummaryReader.parseLicenseSummary(licenseMatchersFile); + LicenseSummaryReader.parseLicenseSummary(licenseMatchersFile.openStream()); for (ProjectLicenseInfo dependency : replacements) { matchers.add(DependencyMatcher.of(dependency)); From d7bb26603ae23183a3e57be3f6e66a756dc0f507 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Sat, 25 Jul 2020 13:48:28 +0200 Subject: [PATCH 09/10] Allow a list of licensesConfigFiles * licensesConfigFile is still supported --- src/it/download-licenses-configured/pom.xml | 5 ++- ....xml => licenses-config-no-download-1.xml} | 12 +---- .../license/licenses-config-no-download-2.xml | 31 +++++++++++++ .../license/AbstractDownloadLicensesMojo.java | 44 ++++++++++++------- .../AggregateDownloadLicensesMojo.java | 2 +- .../license/download/LicenseMatchers.java | 14 +++--- 6 files changed, 73 insertions(+), 35 deletions(-) rename src/it/download-licenses-configured/src/license/{licenses-config-no-download.xml => licenses-config-no-download-1.xml} (69%) create mode 100644 src/it/download-licenses-configured/src/license/licenses-config-no-download-2.xml diff --git a/src/it/download-licenses-configured/pom.xml b/src/it/download-licenses-configured/pom.xml index 6858e375d..c568c0e0c 100644 --- a/src/it/download-licenses-configured/pom.xml +++ b/src/it/download-licenses-configured/pom.xml @@ -96,7 +96,10 @@ download-licenses - ${basedir}/src/license/licenses-config-no-download.xml + + ${basedir}/src/license/licenses-config-no-download-1.xml + ${basedir}/src/license/licenses-config-no-download-2.xml + ${project.build.directory}/no-download/licenses ${project.build.directory}/no-download/licenses.xml true diff --git a/src/it/download-licenses-configured/src/license/licenses-config-no-download.xml b/src/it/download-licenses-configured/src/license/licenses-config-no-download-1.xml similarity index 69% rename from src/it/download-licenses-configured/src/license/licenses-config-no-download.xml rename to src/it/download-licenses-configured/src/license/licenses-config-no-download-1.xml index f38518e52..3f519dfa8 100644 --- a/src/it/download-licenses-configured/src/license/licenses-config-no-download.xml +++ b/src/it/download-licenses-configured/src/license/licenses-config-no-download-1.xml @@ -14,16 +14,6 @@ - - \Qaopalliance\E - \Qaopalliance\E - - - \QPublic Domain\E - - - - \Qasm\E \Qasm\E @@ -33,7 +23,7 @@ BSD 3-Clause ASM - https://gitlab.ow2.org/asm/asm/raw/ASM_3_1_MVN/LICENSE.txt + This will be overwritten diff --git a/src/it/download-licenses-configured/src/license/licenses-config-no-download-2.xml b/src/it/download-licenses-configured/src/license/licenses-config-no-download-2.xml new file mode 100644 index 000000000..b099ac4b5 --- /dev/null +++ b/src/it/download-licenses-configured/src/license/licenses-config-no-download-2.xml @@ -0,0 +1,31 @@ + + + + + \Qaopalliance\E + \Qaopalliance\E + + + \QPublic Domain\E + + + + + + \Qasm\E + \Qasm\E + + + BSD 3-Clause ASM + This will be overwritten + + + + + BSD 3-Clause ASM + https://gitlab.ow2.org/asm/asm/raw/ASM_3_1_MVN/LICENSE.txt + + + + + diff --git a/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java index d65d3e1bf..6f46566c0 100644 --- a/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AbstractDownloadLicensesMojo.java @@ -41,9 +41,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.TreeMap; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FileUtils; @@ -104,12 +106,17 @@ public abstract class AbstractDownloadLicensesMojo extends AbstractLicensesXmlMo // CHECKSTYLE_OFF: LineLength /** - * A file containing the license data (most notably license names and license URLs) missing in + * A list of files containing the license data (most notably license names and license URLs) missing in * {@code pom.xml} files of the dependencies. + * + * Since 2.1, this parameter is called licensesConfigFiles and supports a list of files, urls or resources. + * Before 2.1 this parameter was called licensesConfigFile and only supported a single file. + * The legacy parameter name is still supported. + * *

* Note that since 1.18, if you set {@link #errorRemedy} to {@code xmlOutput} the format of - * {@link #licensesErrorsFile} is the same as the one of {@link #licensesConfigFile}. So you can use - * {@link #licensesErrorsFile} as a base for {@link #licensesConfigFile}. + * {@link #licensesErrorsFile} is the same as the one of {@link #licensesConfigFiles}. So you can use + * {@link #licensesErrorsFile} as a base for {@link #licensesConfigFiles}. *

* Since 1.18, the format of the file is as follows: *

@@ -178,18 +185,21 @@ public abstract class AbstractDownloadLicensesMojo extends AbstractLicensesXmlMo
      * 

* Relationship to other parameters: *

    - *
  • License names and license URLs {@link #licensesConfigFile} is applied before + *
  • License names and license URLs {@link #licensesConfigFiles} is applied before * {@link #licenseUrlReplacements}
  • *
  • {@link #licenseUrlReplacements} are applied before {@link #licenseUrlFileNames}
  • *
  • {@link #licenseUrlFileNames} have higher precedence than {@code } elements in - * {@link #licensesConfigFile}
  • + * {@link #licensesConfigFiles} *
  • {@link #licenseUrlFileNames} are ignored when {@link #organizeLicensesByDependencies} is {@code true}
  • *
* * @since 1.0 */ - @Parameter(property = "licensesConfigFile", defaultValue = "${project.basedir}/src/license/licenses.xml") - protected String licensesConfigFile; + @Parameter( + property = "licensesConfigFiles", + alias = "licensesConfigFile", + defaultValue = "${project.basedir}/src/license/licenses.xml") + protected List licensesConfigFiles; // CHECKSTYLE_ON: LineLength /** @@ -369,7 +379,7 @@ public abstract class AbstractDownloadLicensesMojo extends AbstractLicensesXmlMo /** * If {@code true}, all encountered dependency license URLs are downloaded, no matter what is there in - * {@link #licensesConfigFile} and {@link #licensesOutputFile}; otherwise {@link #licensesConfigFile}, + * {@link #licensesConfigFiles} and {@link #licensesOutputFile}; otherwise {@link #licensesConfigFiles}, * {@link #licensesOutputFile} (eventually persisted from a previous build) and the content of * {@link #licensesOutputDirectory} are considered sources of valid information - i.e. only URLs that do not appear * to have been downloaded in the past will be downloaded. @@ -512,11 +522,11 @@ public abstract class AbstractDownloadLicensesMojo extends AbstractLicensesXmlMo * Relationship to other parameters: *
    *
  • Default URL replacements can be unlocked by setting {@link #useDefaultUrlReplacements} to {@code true}.
  • - *
  • License names and license URLs {@link #licensesConfigFile} is applied before + *
  • License names and license URLs {@link #licensesConfigFiles} is applied before * {@link #licenseUrlReplacements}
  • *
  • {@link #licenseUrlReplacements} are applied before {@link #licenseUrlFileNames}
  • *
  • {@link #licenseUrlFileNames} have higher precedence than {@code } elements in - * {@link #licensesConfigFile}
  • + * {@link #licensesConfigFiles} *
  • {@link #licenseUrlFileNames} are ignored when {@link #organizeLicensesByDependencies} is {@code true}
  • *
* @@ -584,11 +594,11 @@ public abstract class AbstractDownloadLicensesMojo extends AbstractLicensesXmlMo *

* Relationship to other parameters: *

    - *
  • License names and license URLs {@link #licensesConfigFile} is applied before + *
  • License names and license URLs {@link #licensesConfigFiles} is applied before * {@link #licenseUrlReplacements}
  • *
  • {@link #licenseUrlReplacements} are applied before {@link #licenseUrlFileNames}
  • *
  • {@link #licenseUrlFileNames} have higher precedence than {@code } elements in - * {@link #licensesConfigFile}
  • + * {@link #licensesConfigFiles} *
  • {@link #licenseUrlFileNames} are ignored when {@link #organizeLicensesByDependencies} is {@code true}
  • *
* @@ -834,7 +844,10 @@ public void execute() throws MojoExecutionException, MojoFailureException { initDirectories(); - final LicenseMatchers matchers = LicenseMatchers.load(getResource(licensesConfigFile)); + final LicenseMatchers matchers = LicenseMatchers.load(licensesConfigFiles.stream() + .map(this::getResource) + .filter(Objects::nonNull) + .collect(Collectors.toList())); if (!forceDownload) { try { @@ -1172,10 +1185,11 @@ private void initDirectories() throws MojoExecutionException { protected Path[] getAutodetectEolFiles() { File resource; try { - resource = getLocator().getResourceAsFile(licensesConfigFile).getAbsoluteFile(); + resource = + getLocator().getResourceAsFile(licensesConfigFiles.get(0)).getAbsoluteFile(); } catch (ResourceNotFoundException | FileResourceCreationException e) { // Fallback on previous handling - resource = new File(licensesConfigFile); + resource = new File(licensesConfigFiles.get(0)); } return new Path[] {resource.toPath(), project.getBasedir().toPath().resolve("pom.xml")}; } diff --git a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java index 39a47afc9..6eabb66e1 100644 --- a/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java +++ b/src/main/java/org/codehaus/mojo/license/AggregateDownloadLicensesMojo.java @@ -46,7 +46,7 @@ * If the license information (license name and license URL) is missing or otherwise broken in a dependency POM, this * mojo offers several fallback options: *
    - *
  • {@link AbstractDownloadLicensesMojo#licensesConfigFile}
  • + *
  • {@link AbstractDownloadLicensesMojo#licensesConfigFiles}
  • *
  • {@link AbstractDownloadLicensesMojo#errorRemedy}
  • *
  • {@link AbstractDownloadLicensesMojo#licenseUrlReplacements}
  • *
  • {@link AbstractDownloadLicensesMojo#licenseUrlFileNames}
  • diff --git a/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java b/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java index 49e51dba8..06a98183c 100644 --- a/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java +++ b/src/main/java/org/codehaus/mojo/license/download/LicenseMatchers.java @@ -50,23 +50,23 @@ public static Builder builder() { } /** - * @param licenseMatchersFile - * @return new {@link LicenseMatchers} configured from the given {@code licenseMatchersFile} + * @param licenseMatchersFiles + * @return new {@link LicenseMatchers} configured from the given {@code licenseMatchersFiles} * @throws MojoExecutionException */ - public static LicenseMatchers load(URL licenseMatchersFile) throws MojoExecutionException { + public static LicenseMatchers load(List licenseMatchersFiles) throws MojoExecutionException { final List matchers = new ArrayList<>(); - try { - if (licenseMatchersFile != null) { + for (URL licenseMatchersFile : licenseMatchersFiles) { + try { final List replacements = LicenseSummaryReader.parseLicenseSummary(licenseMatchersFile.openStream()); for (ProjectLicenseInfo dependency : replacements) { matchers.add(DependencyMatcher.of(dependency)); } + } catch (Exception e) { + throw new MojoExecutionException("Could not parse file " + licenseMatchersFile, e); } - } catch (Exception e) { - throw new MojoExecutionException("Could not parse licensesReplacementsFile " + licenseMatchersFile, e); } return new LicenseMatchers(matchers); } From 423b1fb75200d51d6c6b75e40f0f2d9f7c24cc52 Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Sun, 10 Dec 2023 16:41:38 +0100 Subject: [PATCH 10/10] Updated maven wrapper --- .mvn/wrapper/MavenWrapperDownloader.java | 110 ----------- .mvn/wrapper/maven-wrapper.jar | Bin 48335 -> 62547 bytes .mvn/wrapper/maven-wrapper.properties | 19 +- mvnw | 226 +++++++++++++---------- mvnw.cmd | 86 ++++++--- 5 files changed, 207 insertions(+), 234 deletions(-) delete mode 100755 .mvn/wrapper/MavenWrapperDownloader.java mode change 100755 => 100644 .mvn/wrapper/maven-wrapper.jar mode change 100755 => 100644 mvnw.cmd diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100755 index d475a89ce..000000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,110 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you 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. -*/ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = - "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: : " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar old mode 100755 new mode 100644 index a817247a6a026c5d3ff383cf7df71ada27f556cf..cb28b0e37c7d206feb564310fdeec0927af4123a GIT binary patch literal 62547 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 A?*IS* literal 48335 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 ?zV2?0&1BAa(0UwonYFZZi@#JeZyXo}X?Mh9} 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - # For Cygwin, ensure paths are in UNIX format before anything is touched if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + JAVA_HOME=$(cygpath --unix "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` + CLASSPATH=$(cygpath --path --unix "$CLASSPATH") fi # For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? + [ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] && + JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)" fi if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + javaExecutable="$(which javac)" + if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + readLink=$(which readlink) + if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + javaHome="$(dirname "\"$javaExecutable\"")" + javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac" else - javaExecutable="`readlink -f \"$javaExecutable\"`" + javaExecutable="$(readlink -f "\"$javaExecutable\"")" fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` + javaHome="$(dirname "\"$javaExecutable\"")" + javaHome=$(expr "$javaHome" : '\(.*\)/bin') JAVA_HOME="$javaHome" export JAVA_HOME fi @@ -146,7 +118,7 @@ if [ -z "$JAVACMD" ] ; then JAVACMD="$JAVA_HOME/bin/java" fi else - JAVACMD="`which java`" + JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)" fi fi @@ -160,12 +132,9 @@ if [ -z "$JAVA_HOME" ] ; then echo "Warning: JAVA_HOME environment variable is not set." fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { - if [ -z "$1" ] then echo "Path not specified to find_maven_basedir" @@ -181,76 +150,99 @@ find_maven_basedir() { fi # workaround for JBEAP-8937 (on Solaris 10/Sparc) if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + wdir=$(cd "$wdir/.." || exit 1; pwd) fi # end of workaround done - echo "${basedir}" + printf '%s' "$(cd "$basedir" || exit 1; pwd)" } # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + # Remove \r in case we run on Windows within Git Bash + # and check out the repository with auto CRLF management + # enabled. Otherwise, we may read lines that are delimited with + # \r\n and produce $'-Xarg\r' rather than -Xarg due to word + # splitting rules. + tr -s '\r\n' ' ' < "$1" fi } -BASE_DIR=`find_maven_basedir "$(pwd)"` +log() { + if [ "$MVNW_VERBOSE" = true ]; then + printf '%s\n' "$1" + fi +} + +BASE_DIR=$(find_maven_basedir "$(dirname "$0")") if [ -z "$BASE_DIR" ]; then exit 1; fi +MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR +log "$MAVEN_PROJECTBASEDIR" + ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. ########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" +if [ -r "$wrapperJarPath" ]; then + log "Found $wrapperJarPath" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + log "Couldn't find $wrapperJarPath, downloading it ..." + + if [ -n "$MVNW_REPOURL" ]; then + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + else + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" fi - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + while IFS="=" read -r key value; do + # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) + safeValue=$(echo "$value" | tr -d '\r') + case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;; esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" + done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" + log "Downloading from: $wrapperUrl" + + if $cygwin; then + wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath") fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" + log "Found wget ... using wget" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + else + wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" fi - wget "$jarUrl" -O "$wrapperJarPath" elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" + log "Found curl ... using curl" + [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + else + curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" fi - curl -o "$wrapperJarPath" "$jarUrl" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" + log "Falling back to using Java to download" + javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java" + javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaSource=$(cygpath --path --windows "$javaSource") + javaClass=$(cygpath --path --windows "$javaClass") fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") + if [ -e "$javaSource" ]; then + if [ ! -e "$javaClass" ]; then + log " - Compiling MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/javac" "$javaSource") fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + if [ -e "$javaClass" ]; then + log " - Running MavenWrapperDownloader.java ..." + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath" fi fi fi @@ -259,28 +251,58 @@ fi # End of extension ########################################################################################## -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR +# If specified, validate the SHA-256 sum of the Maven wrapper jar file +wrapperSha256Sum="" +while IFS="=" read -r key value; do + case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;; + esac +done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" +if [ -n "$wrapperSha256Sum" ]; then + wrapperSha256Result=false + if command -v sha256sum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + elif command -v shasum > /dev/null; then + if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then + wrapperSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." + echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties." + exit 1 + fi + if [ $wrapperSha256Result = false ]; then + echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2 + echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2 + echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2 + exit 1 + fi fi + MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" # For Cygwin, switch paths to Windows format before running java if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME") [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + CLASSPATH=$(cygpath --path --windows "$CLASSPATH") [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` + MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR") fi +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*" +export MAVEN_CMD_LINE_ARGS + WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +# shellcheck disable=SC2086 # safe args exec "$JAVACMD" \ $MAVEN_OPTS \ + $MAVEN_DEBUG_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd old mode 100755 new mode 100644 index adaa3c2ad..c4586b564 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -18,15 +18,14 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script +@REM Apache Maven Wrapper startup batch script, version 3.2.0 @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @REM @REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @@ -37,7 +36,7 @@ @echo off @REM set title of command window title %0 -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME @@ -46,8 +45,8 @@ if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") @REM Execute a user defined script before this one if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre @REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* +if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* :skipRcPre @setlocal @@ -120,24 +119,69 @@ SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.0/maven-wrapper-0.4.0.jar" -FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B ) @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central @REM This allows using the maven wrapper in projects that prohibit checking in binary data. if exist %WRAPPER_JAR% ( - echo Found %WRAPPER_JAR% + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) ) else ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" - echo Finished downloading %WRAPPER_JAR% + if not "%MVNW_REPOURL%" == "" ( + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %WRAPPER_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) ) @REM End of extension -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file +SET WRAPPER_SHA_256_SUM="" +FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B +) +IF NOT %WRAPPER_SHA_256_SUM%=="" ( + powershell -Command "&{"^ + "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ + "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ + " Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ + " Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ + " Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ + " exit 1;"^ + "}"^ + "}" + if ERRORLEVEL 1 goto error +) + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% ^ + %JVM_CONFIG_MAVEN_PROPS% ^ + %MAVEN_OPTS% ^ + %MAVEN_DEBUG_OPTS% ^ + -classpath %WRAPPER_JAR% ^ + "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ + %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end @@ -147,15 +191,15 @@ set ERROR_CODE=1 :end @endlocal & set ERROR_CODE=%ERROR_CODE% -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost @REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" +if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" :skipRcPost @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause +if "%MAVEN_BATCH_PAUSE%"=="on" pause -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% +if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% -exit /B %ERROR_CODE% +cmd /C exit /B %ERROR_CODE%