This is an automated email from the ASF dual-hosted git repository. cstamas pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-wrapper.git
The following commit(s) were added to refs/heads/master by this push: new 038d300 [MWRAPPER-141] Use distribution type of existing Maven Wrapper by default (#141) 038d300 is described below commit 038d30032326d766ba4863ae76cf5333d5a9fab8 Author: Nils Breunese <n...@breun.nl> AuthorDate: Tue May 21 14:58:17 2024 +0200 [MWRAPPER-141] Use distribution type of existing Maven Wrapper by default (#141) Uses `distributionType` from `.mvn/wrapper/maven-wrapper.properties` by default, when present. --- https://issues.apache.org/jira/browse/MWRAPPER-141 --- .../.mvn/wrapper/maven-wrapper.properties | 19 ++++++ .../upgrade_with_existing_type/invoker.properties | 19 ++++++ .../it/projects/upgrade_with_existing_type/pom.xml | 66 +++++++++++++++++++++ .../upgrade_with_existing_type/verify.groovy | 37 ++++++++++++ .../apache/maven/plugins/wrapper/WrapperMojo.java | 67 ++++++++++++++++++---- maven-wrapper-plugin/src/site/markdown/usage.md | 14 +++-- 6 files changed, 205 insertions(+), 17 deletions(-) diff --git a/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/.mvn/wrapper/maven-wrapper.properties b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..3ba4302 --- /dev/null +++ b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# 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 +# +# https://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. +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.5/apache-maven-3.9.5-bin.zip +distributionType=bin +wrapperVersion=3.3.1 \ No newline at end of file diff --git a/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/invoker.properties b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/invoker.properties new file mode 100644 index 0000000..faac648 --- /dev/null +++ b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/invoker.properties @@ -0,0 +1,19 @@ +# 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. + +invoker.goals.1 = ${project.groupId}:${project.artifactId}:${project.version}:wrapper -Dmaven=3.9.6 +invoker.goals.2 = exec:exec diff --git a/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/pom.xml b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/pom.xml new file mode 100644 index 0000000..cbec1de --- /dev/null +++ b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/pom.xml @@ -0,0 +1,66 @@ +<?xml version='1.0' encoding='UTF-8'?> + +<!-- +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. +--> + +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.maven.plugins.it.wrapper</groupId> + <artifactId>extension</artifactId> + <version>1.0.0-SNAPSHOT</version> + <packaging>pom</packaging> + + <properties> + <cmd></cmd> + </properties> + + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>3.0.0</version> + <configuration> + <executable>mvnw${cmd}</executable> + <arguments> + <argument>-v</argument> + </arguments> + <environmentVariables> + <MVNW_VERBOSE>true</MVNW_VERBOSE> + </environmentVariables> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + + <profiles> + <profile> + <id>windows</id> + <activation> + <os><family>windows</family></os> + </activation> + <properties> + <cmd>.cmd</cmd> + </properties> + </profile> + </profiles> +</project> \ No newline at end of file diff --git a/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/verify.groovy b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/verify.groovy new file mode 100644 index 0000000..1eeca65 --- /dev/null +++ b/maven-wrapper-plugin/src/it/projects/upgrade_with_existing_type/verify.groovy @@ -0,0 +1,37 @@ + +/* + * 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. + */ + +assert new File(basedir,'mvnw').exists() +assert new File(basedir,'mvnw.cmd').exists() +assert new File(basedir,'.mvn/wrapper/maven-wrapper.jar').exists() + +wrapperProperties = new File(basedir,'.mvn/wrapper/maven-wrapper.properties') +assert wrapperProperties.exists() + +Properties props = new Properties() +wrapperProperties.withInputStream { + props.load(it) +} + +// Assert that distribution type from previous Maven Wrapper is retained, without it being explicitly set via '-Dtype=' +assert props.distributionType.equals("bin") + +// Assert that distribution URL was updated to version specified via '-Dmaven=' +assert props.distributionUrl.endsWith("/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip") diff --git a/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java b/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java index 91bae30..4b0650f 100644 --- a/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java +++ b/maven-wrapper-plugin/src/main/java/org/apache/maven/plugins/wrapper/WrapperMojo.java @@ -36,7 +36,6 @@ import org.apache.maven.Maven; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; 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.Mojo; import org.apache.maven.plugins.annotations.Parameter; @@ -84,7 +83,10 @@ public class WrapperMojo extends AbstractMojo { private String mvndVersion; /** + * The Maven Wrapper distribution type. + * <p> * Options are: + * * <dl> * <dt>script</dt> * <dd>only mvnw scripts</dd> @@ -95,11 +97,16 @@ public class WrapperMojo extends AbstractMojo { * <dt>only-script (default)</dt> * <dd>the new lite implementation of mvnw/mvnw.cmd scripts downloads the maven directly and skips maven-wrapper.jar - since 3.2.0</dd> * </dl> - * Value will be used as classifier of the downloaded file + * + * If {@code -Dtype={type}} is not explicitly provided, then {@code distributionType} from + * {@code .mvn/wrapper/maven-wrapper.properties} is used, if it exists. + * Otherwise, {@code only-script} is used as the default distribution type. + * <p> + * This value will be used as the classifier of the downloaded file. * * @since 3.0.0 */ - @Parameter(defaultValue = "only-script", property = "type") + @Parameter(property = "type") private String distributionType; /** @@ -159,6 +166,16 @@ public class WrapperMojo extends AbstractMojo { private static final String WRAPPER_DISTRIBUTION_EXTENSION = "zip"; + private static final String WRAPPER_DIR = ".mvn/wrapper"; + + private static final String WRAPPER_PROPERTIES_FILENAME = "maven-wrapper.properties"; + + private static final String DISTRIBUTION_TYPE_PROPERTY_NAME = "distributionType"; + + private static final String TYPE_ONLY_SCRIPT = "only-script"; + + private static final String DEFAULT_DISTRIBUTION_TYPE = TYPE_ONLY_SCRIPT; + // COMPONENTS @Inject @@ -168,27 +185,53 @@ public class WrapperMojo extends AbstractMojo { private Map<String, UnArchiver> unarchivers; @Override - public void execute() throws MojoExecutionException, MojoFailureException { - if (mvndVersion != null && mvndVersion.length() > 0 && !"only-script".equals(distributionType)) { + public void execute() throws MojoExecutionException { + final Path baseDir = Paths.get(session.getRequest().getBaseDirectory()); + final Path wrapperDir = baseDir.resolve(WRAPPER_DIR); + + if (distributionType == null) { + distributionType = determineDistributionType(wrapperDir); + } + + if (mvndVersion != null && mvndVersion.length() > 0 && !TYPE_ONLY_SCRIPT.equals(distributionType)) { throw new MojoExecutionException("maven-wrapper with type=" + distributionType - + " cannot work with mvnd, please set type to 'only-script'."); + + " cannot work with mvnd, please set type to '" + TYPE_ONLY_SCRIPT + "'."); } - Path baseDir = Paths.get(session.getRequest().getBaseDirectory()); mavenVersion = getVersion(mavenVersion, Maven.class, "org.apache.maven/maven-core"); String wrapperVersion = getVersion(null, this.getClass(), "org.apache.maven.plugins/maven-wrapper-plugin"); final Artifact artifact = downloadWrapperDistribution(wrapperVersion); - final Path wrapperDir = createDirectories(baseDir.resolve(".mvn/wrapper")); + createDirectories(wrapperDir); cleanup(wrapperDir); unpack(artifact, baseDir); replaceProperties(wrapperVersion, wrapperDir); } - private Path createDirectories(Path dir) throws MojoExecutionException { + private String determineDistributionType(final Path wrapperDir) { + final String typeFromMavenWrapperProperties = distributionTypeFromExistingMavenWrapperProperties(wrapperDir); + if (typeFromMavenWrapperProperties != null) { + return typeFromMavenWrapperProperties; + } + + return DEFAULT_DISTRIBUTION_TYPE; + } + + private String distributionTypeFromExistingMavenWrapperProperties(final Path wrapperDir) { + final Path mavenWrapperProperties = wrapperDir.resolve(WRAPPER_PROPERTIES_FILENAME); + try (InputStream inputStream = Files.newInputStream(mavenWrapperProperties)) { + Properties properties = new Properties(); + properties.load(inputStream); + return properties.getProperty(DISTRIBUTION_TYPE_PROPERTY_NAME); + } catch (IOException e) { + return null; + } + } + + private void createDirectories(Path dir) throws MojoExecutionException { try { - return Files.createDirectories(dir); + Files.createDirectories(dir); } catch (IOException ioe) { throw new MojoExecutionException(ioe.getMessage(), ioe); } @@ -288,12 +331,12 @@ public class WrapperMojo extends AbstractMojo { try (BufferedWriter out = Files.newBufferedWriter(wrapperPropertiesFile, StandardCharsets.UTF_8)) { out.append(String.format(Locale.ROOT, license)); out.append("wrapperVersion=" + wrapperVersion + System.lineSeparator()); - out.append("distributionType=" + distributionType + System.lineSeparator()); + out.append(DISTRIBUTION_TYPE_PROPERTY_NAME + "=" + distributionType + System.lineSeparator()); out.append("distributionUrl=" + distributionUrl + System.lineSeparator()); if (distributionSha256Sum != null) { out.append("distributionSha256Sum=" + distributionSha256Sum + System.lineSeparator()); } - if (!distributionType.equals("only-script")) { + if (!distributionType.equals(TYPE_ONLY_SCRIPT)) { out.append("wrapperUrl=" + wrapperUrl + System.lineSeparator()); } if (wrapperSha256Sum != null) { diff --git a/maven-wrapper-plugin/src/site/markdown/usage.md b/maven-wrapper-plugin/src/site/markdown/usage.md index 3c22bca..4bba716 100644 --- a/maven-wrapper-plugin/src/site/markdown/usage.md +++ b/maven-wrapper-plugin/src/site/markdown/usage.md @@ -32,9 +32,9 @@ The scripts work like this: Apache Maven Wrapper Distribution Types ----- -There are 4 types available: +There are 4 distribution types available: -- **only-script** _(default)_: the lite implementation of `mvnw`/`mvnw.cmd` scripts will download the maven directly via wget or curl on *nix, or PowerShell on Windows, +- **only-script** _(default for new installations)_: the lite implementation of `mvnw`/`mvnw.cmd` scripts will download the maven directly via wget or curl on *nix, or PowerShell on Windows, then exec/call the original `mvn`/`mvn.cmd` scripts of the downloaded maven distribution. This type does not use `maven-wrapper.jar` nor `MavenWrapperDownloader.java`, only the wrapper scripts are required. @@ -46,13 +46,17 @@ The downside is that the project will contain a binary file in the source contro - **source**: Since Maven already requires Java to run, why not compile and run a classfile to download the maven-wrapper jar? This type comes with a `.mvn/wrapper/MavenWrapperDownloader.java` which will be compiled and executed on the fly. -The type can be specified with `mvn wrapper:wrapper -Dtype=x`, where x is any of the types listed above. +The type can be specified with `mvn wrapper:wrapper -Dtype={type}`, where `{type}` is any of the types listed above. + +When `wrapper:wrapper` is run in a Maven module which contains a `.mvn/wrapper/maven-wrapper.properties` file, then the distribution type of the existing Maven Wrapper is used for the execution of the goal. +This allows updating Maven Wrapper, without unintentionally changing the distribution type for an existing project. +You can still use `-Dtype={type}` to change the distribution type for an existing installation. Maven Version ------------- By default the plugin will assume the same version as the Maven runtime (calling `mvn -v`). But you can pick a different version. -Either call `mvn wrapper:wrapper -Dmaven=x`, where x is any valid Apache Maven Release, see https://search.maven.org/artifact/org.apache.maven/apache-maven -Another option is adjust the `distributionUrl` in `.mvn/wrapper/maven-wrapper.properties` +You can call `mvn wrapper:wrapper -Dmaven=x`, where `x` is any valid Apache Maven Release (see [Maven Central](https://central.sonatype.com/artifact/org.apache.maven/apache-maven/versions)). +Another option is to adjust the `distributionUrl` in `.mvn/wrapper/maven-wrapper.properties`. Debugging ---------