From f65d0ac76a04e0be9153caff5828ca00dc9d15ac Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Sat, 12 Oct 2024 22:07:07 +0200 Subject: [PATCH] [MRESOLVER-602][MRESOLVER-603] Expose redirect config for apache transport (#581) The Apache transport `maxRedirects` and `followRedirects` exposed. Also return some missing config doco. But all this exposed another issue with doco generator, so fixed that as well, that in turn, required more (mostly Javadoc) fixes. And sorry for "overloading" this PR with unrelated (mostly side or Javadoc) related fixes, as doco generator fixes made me run site, that on other hand revealed that master site is not buildable :cry: --- https://issues.apache.org/jira/browse/MRESOLVER-602 https://issues.apache.org/jira/browse/MRESOLVER-603 --- .../aether/ConfigurationProperties.java | 26 +++- .../org/eclipse/aether/artifact/Artifact.java | 2 +- .../aether/tools/CollectConfiguration.java | 36 ++++- .../transport/apache/ApacheTransporter.java | 19 +++ .../ApacheTransporterConfigurationKeys.java | 26 ++++ .../transport/jdk/JdkTransporterFactory.java | 3 +- .../graph/manager/DependencyManagerUtils.java | 2 +- src/site/markdown/configuration.md | 139 +++++++++--------- 8 files changed, 178 insertions(+), 75 deletions(-) diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/ConfigurationProperties.java b/maven-resolver-api/src/main/java/org/eclipse/aether/ConfigurationProperties.java index 806f220a4..0179733ae 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/ConfigurationProperties.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/ConfigurationProperties.java @@ -142,6 +142,28 @@ public final class ConfigurationProperties { */ public static final String CACHED_PRIORITIES = PREFIX_PRIORITY + "cached"; + /** + * The priority to use for a certain extension class. {@code <class>} can either be the fully qualified + * name or the simple name of a class. If the class name ends with Factory that suffix could optionally be left out. + * This configuration is used by {@code org.eclipse.aether.internal.impl.PrioritizedComponents} internal utility + * to sort classes by priority. This is reusable utility (so an extension can make use of it), but by default + * in "vanilla" Resolver following classes are sorted: + * + * + * @configurationSource {@link RepositorySystemSession#getConfigProperties()} + * @configurationType {@link java.lang.Float} + * @configurationRepoIdSuffix No + */ + public static final String CLASS_PRIORITIES = PREFIX_PRIORITY + ""; + /** * The default caching of priority components if {@link #CACHED_PRIORITIES} isn't set. Default value is {@code true}. * @@ -215,7 +237,7 @@ public final class ConfigurationProperties { /** * The request headers to use for HTTP-based repository connectors. The headers are specified using a * {@code Map}, mapping a header name to its value. Besides this general key, clients may also - * specify headers for a specific remote repository by appending the suffix {@code .} to this key when + * specify headers for a specific remote repository by appending the suffix {@code .<repoId>} to this key when * storing the headers map. The repository-specific headers map is supposed to be complete, i.e. is not merged with * the general headers map. * @@ -227,7 +249,7 @@ public final class ConfigurationProperties { /** * The encoding/charset to use when exchanging credentials with HTTP servers. Besides this general key, clients may - * also specify the encoding for a specific remote repository by appending the suffix {@code .} to this key + * also specify the encoding for a specific remote repository by appending the suffix {@code .<repoId>} to this key * when storing the charset name. * * @configurationSource {@link RepositorySystemSession#getConfigProperties()} diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/artifact/Artifact.java b/maven-resolver-api/src/main/java/org/eclipse/aether/artifact/Artifact.java index 40cd72599..d51210496 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/artifact/Artifact.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/artifact/Artifact.java @@ -52,7 +52,7 @@ public interface Artifact { * "1.0-SNAPSHOT", the artifact's version depends on the state of the artifact. Artifacts that have been resolved or * deployed will usually have the meta version expanded. * This may also return version ranges like "[1.0,2.0)". The exact syntax for (meta) versions and version ranges - * depends on the underlying provider (encapsulated in {@link RepositorySystem}). + * depends on the underlying provider (encapsulated in {@link org.eclipse.aether.RepositorySystem}). * * @return The version, never {@code null}. */ diff --git a/maven-resolver-tools/src/main/java/org/eclipse/aether/tools/CollectConfiguration.java b/maven-resolver-tools/src/main/java/org/eclipse/aether/tools/CollectConfiguration.java index 0cb75142a..746e17cdf 100644 --- a/maven-resolver-tools/src/main/java/org/eclipse/aether/tools/CollectConfiguration.java +++ b/maven-resolver-tools/src/main/java/org/eclipse/aether/tools/CollectConfiguration.java @@ -39,6 +39,7 @@ import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader; import org.jboss.forge.roaster.Roaster; +import org.jboss.forge.roaster.model.JavaDoc; import org.jboss.forge.roaster.model.JavaDocCapable; import org.jboss.forge.roaster.model.JavaDocTag; import org.jboss.forge.roaster.model.JavaType; @@ -96,7 +97,7 @@ public static void main(String[] args) throws Exception { key, defValue, fqName, - f.getJavaDoc().getText(), + cleanseJavadoc(f), nvl(getSince(f), ""), getConfigurationSource(f), configurationType, @@ -125,6 +126,39 @@ public static void main(String[] args) throws Exception { } } + private static String cleanseJavadoc(FieldSource javaClassSource) { + JavaDoc> javaDoc = javaClassSource.getJavaDoc(); + String[] text = javaDoc.getFullText().split("\n"); + StringBuilder result = new StringBuilder(); + for (String line : text) { + if (!line.startsWith("@") && !line.trim().isEmpty()) { + result.append(line); + } + } + return cleanseTags(result.toString()); + } + + private static String cleanseTags(String text) { + // {@code XXX} ->
XXX
+ // {@link XXX} -> ??? pre for now + Pattern pattern = Pattern.compile("(\\{@\\w\\w\\w\\w (.+?)})"); + Matcher matcher = pattern.matcher(text); + if (!matcher.find()) { + return text; + } + int prevEnd = 0; + StringBuilder result = new StringBuilder(); + do { + result.append(text, prevEnd, matcher.start(1)); + result.append(""); + result.append(matcher.group(2)); + result.append(""); + prevEnd = matcher.end(1); + } while (matcher.find()); + result.append(text, prevEnd, text.length()); + return result.toString(); + } + private static JavaType parse(Path path) { try { return Roaster.parse(path.toFile()); diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java index f9392139e..cb54e4676 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporter.java @@ -79,6 +79,7 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.client.LaxRedirectStrategy; import org.apache.http.impl.client.StandardHttpRequestRetryHandler; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; @@ -105,10 +106,14 @@ import static java.util.Objects.requireNonNull; import static org.eclipse.aether.spi.connector.transport.http.HttpConstants.CONTENT_RANGE_PATTERN; +import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.CONFIG_PROP_FOLLOW_REDIRECTS; import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.CONFIG_PROP_HTTP_RETRY_HANDLER_NAME; import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.CONFIG_PROP_HTTP_RETRY_HANDLER_REQUEST_SENT_ENABLED; +import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.CONFIG_PROP_MAX_REDIRECTS; import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.CONFIG_PROP_USE_SYSTEM_PROPERTIES; +import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.DEFAULT_FOLLOW_REDIRECTS; import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.DEFAULT_HTTP_RETRY_HANDLER_REQUEST_SENT_ENABLED; +import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.DEFAULT_MAX_REDIRECTS; import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.DEFAULT_USE_SYSTEM_PROPERTIES; import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.HTTP_RETRY_HANDLER_NAME_DEFAULT; import static org.eclipse.aether.transport.apache.ApacheTransporterConfigurationKeys.HTTP_RETRY_HANDLER_NAME_STANDARD; @@ -261,6 +266,16 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo DEFAULT_HTTP_RETRY_HANDLER_REQUEST_SENT_ENABLED, CONFIG_PROP_HTTP_RETRY_HANDLER_REQUEST_SENT_ENABLED + "." + repository.getId(), CONFIG_PROP_HTTP_RETRY_HANDLER_REQUEST_SENT_ENABLED); + int maxRedirects = ConfigUtils.getInteger( + session, + DEFAULT_MAX_REDIRECTS, + CONFIG_PROP_MAX_REDIRECTS + "." + repository.getId(), + CONFIG_PROP_MAX_REDIRECTS); + boolean followRedirects = ConfigUtils.getBoolean( + session, + DEFAULT_FOLLOW_REDIRECTS, + CONFIG_PROP_FOLLOW_REDIRECTS + "." + repository.getId(), + CONFIG_PROP_FOLLOW_REDIRECTS); String userAgent = ConfigUtils.getString( session, ConfigurationProperties.DEFAULT_USER_AGENT, ConfigurationProperties.USER_AGENT); @@ -275,6 +290,9 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo SocketConfig socketConfig = SocketConfig.custom().setSoTimeout(requestTimeout).build(); RequestConfig requestConfig = RequestConfig.custom() + .setMaxRedirects(maxRedirects) + .setRedirectsEnabled(followRedirects) + .setRelativeRedirectsAllowed(followRedirects) .setConnectTimeout(connectTimeout) .setConnectionRequestTimeout(connectTimeout) .setLocalAddress(getHttpLocalAddress(session, repository)) @@ -306,6 +324,7 @@ final class ApacheTransporter extends AbstractTransporter implements HttpTranspo HttpClientBuilder builder = HttpClientBuilder.create() .setUserAgent(userAgent) + .setRedirectStrategy(LaxRedirectStrategy.INSTANCE) .setDefaultSocketConfig(socketConfig) .setDefaultRequestConfig(requestConfig) .setServiceUnavailableRetryStrategy(serviceUnavailableRetryStrategy) diff --git a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterConfigurationKeys.java b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterConfigurationKeys.java index 67fb5be4f..9948e6cbf 100644 --- a/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterConfigurationKeys.java +++ b/maven-resolver-transport-apache/src/main/java/org/eclipse/aether/transport/apache/ApacheTransporterConfigurationKeys.java @@ -95,4 +95,30 @@ private ApacheTransporterConfigurationKeys() {} * @configurationType {@link java.lang.String} */ public static final String CONFIG_PROP_PROTOCOLS = CONFIG_PROPS_PREFIX + "https.protocols"; + + /** + * If enabled, Apache HttpClient will follow HTTP redirects. + * + * @configurationSource {@link RepositorySystemSession#getConfigProperties()} + * @configurationType {@link Boolean} + * @configurationDefaultValue {@link #DEFAULT_FOLLOW_REDIRECTS} + * @configurationRepoIdSuffix Yes + * @since 2.0.2 + */ + public static final String CONFIG_PROP_FOLLOW_REDIRECTS = CONFIG_PROPS_PREFIX + "followRedirects"; + + public static final boolean DEFAULT_FOLLOW_REDIRECTS = true; + + /** + * The max redirect count to follow. + * + * @configurationSource {@link RepositorySystemSession#getConfigProperties()} + * @configurationType {@link java.lang.Integer} + * @configurationDefaultValue {@link #DEFAULT_MAX_REDIRECTS} + * @configurationRepoIdSuffix Yes + * @since 2.0.2 + */ + public static final String CONFIG_PROP_MAX_REDIRECTS = CONFIG_PROPS_PREFIX + "maxRedirects"; + + public static final int DEFAULT_MAX_REDIRECTS = 5; } diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java index 7641163c2..dcea7ce8b 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk-8/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporterFactory.java @@ -47,8 +47,7 @@ public final class JdkTransporterFactory implements HttpTransporterFactory { private float priority = 10.0f; @Inject - public JdkTransporterFactory( - ChecksumExtractor checksumExtractor, PathProcessor pathProcessor, JdkRFC9457Reporter rfc9457Reporter) { + public JdkTransporterFactory(ChecksumExtractor checksumExtractor, PathProcessor pathProcessor) { // this is to equalize all Java version constructors to be same, so Supplier could work across all versions } diff --git a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DependencyManagerUtils.java b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DependencyManagerUtils.java index 5b29be054..c110624da 100644 --- a/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DependencyManagerUtils.java +++ b/maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/manager/DependencyManagerUtils.java @@ -35,7 +35,7 @@ public final class DependencyManagerUtils { * The key in the repository session's {@link org.eclipse.aether.RepositorySystemSession#getConfigProperties() * configuration properties} used to store a {@link Boolean} flag controlling the verbose mode for dependency * management. If enabled, the original attributes of a dependency before its update due to dependency management - * will be recorded * in the node's {@link DependencyNode#getData() custom data} when building a dependency graph. + * will be recorded in the node's {@link DependencyNode#getData() custom data} when building a dependency graph. * * @configurationSource {@link RepositorySystemSession#getConfigProperties()} * @configurationType {@link java.lang.Boolean} diff --git a/src/site/markdown/configuration.md b/src/site/markdown/configuration.md index 48abf66df..5ffc45674 100644 --- a/src/site/markdown/configuration.md +++ b/src/site/markdown/configuration.md @@ -34,14 +34,14 @@ under the License. | 7. | `"aether.artifactResolver.snapshotNormalization"` | `Boolean` | Configuration to enable "snapshot normalization", downloaded snapshots from remote with timestamped file names will have file names converted back to baseVersion. It replaces the timestamped snapshot file name with a filename containing the SNAPSHOT qualifier only. This only affects resolving/retrieving artifacts but not uploading those. | `true` | | No | Session Configuration | | 8. | `"aether.chainedLocalRepository.ignoreTailAvailability"` | `Boolean` | When using chained local repository, should be the artifact availability ignored in tail. | `true` | 1.9.2 | No | Session Configuration | | 9. | `"aether.checksums.omitChecksumsForExtensions"` | `String` | Comma-separated list of extensions with leading dot (example ".asc") that should have checksums omitted. These are applied to sub-artifacts only. Note: to achieve 1.7.x aether.checksums.forSignature=true behaviour, pass empty string as value for this property. | `".asc,.sigstore"` | | No | Session Configuration | -| 10. | `"aether.conflictResolver.verbose"` | `Object` | The key in the repository session's used to store a flag controlling the transformer's verbose mode. Accepted values are Boolean types, String type (where "true" would be interpreted as ) or Verbosity enum instances. | `"NONE"` | | No | Session Configuration | +| 10. | `"aether.conflictResolver.verbose"` | `Object` | The key in the repository session's org.eclipse.aether.RepositorySystemSession#getConfigProperties() configuration properties used to store a Boolean flag controlling the transformer's verbose mode. Accepted values are Boolean types, String type (where "true" would be interpreted as true ) or Verbosity enum instances. | `"NONE"` | | No | Session Configuration | | 11. | `"aether.connector.basic.downstreamThreads"` | `Integer` | Number of threads in basic connector for downloading. | `5` | 2.0.0 | Yes | Session Configuration | | 12. | `"aether.connector.basic.parallelPut"` | `Boolean` | Enables or disables parallel PUT processing (parallel deploys) on basic connector globally or per remote repository. When disabled, connector behaves exactly as in Maven 3.8.x did: GETs are parallel while PUTs are sequential. | `true` | 1.9.5 | Yes | Session Configuration | | 13. | `"aether.connector.basic.persistedChecksums"` | `Boolean` | Flag indicating whether checksums which are retrieved during checksum validation should be persisted in the local repository next to the file they provide the checksum for. | `true` | 0.9.0.M4 | No | Session Configuration | | 14. | `"aether.connector.basic.smartChecksums"` | `Boolean` | Flag indicating that instead of comparing the external checksum fetched from the remote repo with the calculated one, it should try to extract the reference checksum from the actual artifact response headers This only works for HTTP transports. | `true` | 0.9.0.M3 | No | Session Configuration | | 15. | `"aether.connector.basic.threads"` | `Integer` | Number of threads in basic connector for uploading/downloading. Observed only if some of the upstream or downstream threads are not set. (Deprecated) | `5` | 0.9.0.M4 | No | Session Configuration | | 16. | `"aether.connector.basic.upstreamThreads"` | `Integer` | Number of threads in basic connector for uploading. | `5` | 2.0.0 | Yes | Session Configuration | -| 17. | `"aether.dependencyCollector.bf.skipper"` | `Boolean` | The key in the repository session's used to store a flag controlling the resolver's skip mode. | `true` | 1.8.0 | No | Session Configuration | +| 17. | `"aether.dependencyCollector.bf.skipper"` | `Boolean` | The key in the repository session's RepositorySystemSession#getConfigProperties() configuration properties used to store a Boolean flag controlling the resolver's skip mode. | `true` | 1.8.0 | No | Session Configuration | | 18. | `"aether.dependencyCollector.bf.threads"` | `Integer` | The count of threads to be used when collecting POMs in parallel. | `5` | 1.9.0 | No | Session Configuration | | 19. | `"aether.dependencyCollector.impl"` | `String` | The name of the dependency collector implementation to use: depth-first (original) named "df", and breadth-first (new in 1.8.0) named "bf". Both collectors produce equivalent results, but they may differ performance wise, depending on project being applied to. Our experience shows that existing "df" is well suited for smaller to medium size projects, while "bf" may perform better on huge projects with many dependencies. Experiment (and come back to us!) to figure out which one suits you the better. | `"bf"` | 1.8.0 | No | Session Configuration | | 20. | `"aether.dependencyCollector.maxCycles"` | `Integer` | Only up to the given amount cyclic dependencies are emitted. | `10` | 1.8.0 | No | Session Configuration | @@ -52,14 +52,14 @@ under the License. | 25. | `"aether.dependencyCollector.pool.descriptor"` | `String` | Flag controlling interning data pool type used by dependency collector for ArtifactDescriptor (POM) instances, matters for heap consumption. By default, uses “weak” references (consume less heap). Using “hard” will make it much more memory aggressive and possibly faster (system and Java dependent). Supported values: "hard", "weak". | `"hard"` | 1.9.5 | No | Session Configuration | | 26. | `"aether.dependencyCollector.pool.internArtifactDescriptorDependencies"` | `Boolean` | Flag controlling interning artifact descriptor dependencies. | `false` | 1.9.22 | No | Session Configuration | | 27. | `"aether.dependencyCollector.pool.internArtifactDescriptorManagedDependencies"` | `Boolean` | Flag controlling interning artifact descriptor managed dependencies. | `true` | 1.9.22 | No | Session Configuration | -| 28. | `"aether.dependencyManager.verbose"` | `Boolean` | The key in the repository session's used to store a flag controlling the verbose mode for dependency management. If enabled, the original attributes of a dependency before its update due to dependency management will be recorded * in the node's when building a dependency graph. | `false` | | No | Session Configuration | +| 28. | `"aether.dependencyManager.verbose"` | `Boolean` | The key in the repository session's org.eclipse.aether.RepositorySystemSession#getConfigProperties() configuration properties used to store a Boolean flag controlling the verbose mode for dependency management. If enabled, the original attributes of a dependency before its update due to dependency management will be recorded in the node's DependencyNode#getData() custom data when building a dependency graph. | `false` | | No | Session Configuration | | 29. | `"aether.generator.gpg.agentSocketLocations"` | `String` | The GnuPG agent socket(s) to try. Comma separated list of socket paths. If relative, will be resolved from user home directory. | `".gnupg/S.gpg-agent"` | 2.0.0 | No | Session Configuration | | 30. | `"aether.generator.gpg.enabled"` | `Boolean` | Whether GnuPG signer is enabled. | `false` | 2.0.0 | No | Session Configuration | | 31. | `"aether.generator.gpg.keyFilePath"` | `String` | The path to the OpenPGP transferable secret key file. If relative, is resolved from local repository root. | `"maven-signing-key.key"` | 2.0.0 | No | Session Configuration | | 32. | `"aether.generator.gpg.keyFingerprint"` | `String` | The PGP Key fingerprint as hex string (40 characters long), optional. If not set, first secret key found will be used. | - | 2.0.0 | No | Session Configuration | | 33. | `"aether.generator.gpg.useAgent"` | `Boolean` | Whether GnuPG agent should be used. | `true` | 2.0.0 | No | Session Configuration | | 34. | `"aether.generator.sigstore.enabled"` | `Boolean` | Whether Sigstore signer is enabled. | `false` | 2.0.2 | No | Session Configuration | -| 35. | `"aether.generator.sigstore.publicStaging"` | `Boolean` | Whether Sigstore should use public staging instead of public default . | `false` | 2.0.2 | No | Session Configuration | +| 35. | `"aether.generator.sigstore.publicStaging"` | `Boolean` | Whether Sigstore should use public staging sigstage.dev instead of public default sigstore.dev . | `false` | 2.0.2 | No | Session Configuration | | 36. | `"aether.interactive"` | `Boolean` | A flag indicating whether interaction with the user is allowed. | `false` | | No | Session Configuration | | 37. | `"aether.layout.maven2.checksumAlgorithms"` | `String` | Comma-separated list of checksum algorithms with which checksums are validated (downloaded) and generated (uploaded) with this layout. Resolver by default supports following algorithms: MD5, SHA-1, SHA-256 and SHA-512. New algorithms can be added by implementing ChecksumAlgorithmFactory component. | `"SHA-1,MD5"` | 1.8.0 | Yes | Session Configuration | | 38. | `"aether.lrm.enhanced.localPrefix"` | `String` | The prefix to use for locally installed artifacts. | `"installed"` | 1.8.1 | No | Session Configuration | @@ -75,8 +75,8 @@ under the License. | 48. | `"aether.metadataResolver.threads"` | `Integer` | Number of threads to use in parallel for resolving metadata. | `4` | 0.9.0.M4 | No | Session Configuration | | 49. | `"aether.named.diagnostic.enabled"` | `Boolean` | System property key to enable locking diagnostic collection. | `false` | 1.9.11 | No | Java System Properties | | 50. | `"aether.named.file-lock.attempts"` | `Integer` | Tweak: on Windows, the presence of StandardOpenOption#DELETE_ON_CLOSE causes concurrency issues. This flag allows to implement similar fix as referenced JDK bug report: retry and hope the best. Default value is 5 attempts (will retry 4 times). | `5` | 1.7.3 | No | Java System Properties | -| 51. | `"aether.named.file-lock.deleteLockFiles"` | `Boolean` | Tweak: on Windows, the presence of StandardOpenOption#DELETE_ON_CLOSE causes concurrency issues. This flag allows to have it removed from effective flags, at the cost that lockfile directory becomes crowded with 0 byte sized lock files that are never cleaned up. Default value is on non-Windows OS. See JDK-8252883 for Windows related bug. Users on Windows can still force "delete on close" by explicitly setting this property to . | `true` | 1.7.3 | No | Java System Properties | -| 52. | `"aether.named.file-lock.sleepMillis"` | `Long` | Tweak: When used, the amount of milliseconds to sleep between subsequent retries. Default value is 50 milliseconds. | `50` | 1.7.3 | No | Java System Properties | +| 51. | `"aether.named.file-lock.deleteLockFiles"` | `Boolean` | Tweak: on Windows, the presence of StandardOpenOption#DELETE_ON_CLOSE causes concurrency issues. This flag allows to have it removed from effective flags, at the cost that lockfile directory becomes crowded with 0 byte sized lock files that are never cleaned up. Default value is true on non-Windows OS. See JDK-8252883 for Windows related bug. Users on Windows can still force "delete on close" by explicitly setting this property to true . | `true` | 1.7.3 | No | Java System Properties | +| 52. | `"aether.named.file-lock.sleepMillis"` | `Long` | Tweak: When #SYSTEM_PROP_ATTEMPTS used, the amount of milliseconds to sleep between subsequent retries. Default value is 50 milliseconds. | `50` | 1.7.3 | No | Java System Properties | | 53. | `"aether.named.ipc.debug"` | `Boolean` | Should the IPC server log debug messages? (i.e. for testing purposes) | `false` | 2.0.1 | No | Java System Properties | | 54. | `"aether.named.ipc.family"` | `String` | IPC socket family to use. | `"unix"` | 2.0.1 | No | Java System Properties | | 55. | `"aether.named.ipc.idleTimeout"` | `Integer` | IPC idle timeout in seconds. If there is no IPC request during idle time, it will stop. | `60` | 2.0.1 | No | Java System Properties | @@ -85,68 +85,71 @@ under the License. | 58. | `"aether.named.ipc.nonative"` | `Boolean` | Should the IPC server not use native executable? | `true` | 2.0.1 | No | Java System Properties | | 59. | `"aether.offline.hosts"` | `String` | Comma-separated list of hosts which are supposed to be resolved offline. | - | | No | Session Configuration | | 60. | `"aether.offline.protocols"` | `String` | Comma-separated list of protocols which are supposed to be resolved offline. | - | | No | Session Configuration | -| 61. | `"aether.priority.cached"` | `Boolean` | A flag indicating whether the created ordered components should be cached in session. | `true` | 2.0.0 | No | Session Configuration | -| 62. | `"aether.priority.implicit"` | `Boolean` | A flag indicating whether the priorities of pluggable extensions are implicitly given by their iteration order such that the first extension has the highest priority. If set, an extension's built-in priority as well as any corresponding configuration properties are ignored when searching for a suitable implementation among the available extensions. This priority mode is meant for cases where the application will present/inject extensions in the desired search order. | `false` | | No | Session Configuration | -| 63. | `"aether.remoteRepositoryFilter.groupId"` | `Boolean` | Is filter enabled? | `false` | 1.9.0 | No | Session Configuration | -| 64. | `"aether.remoteRepositoryFilter.groupId.basedir"` | `String` | The basedir where to store filter files. If path is relative, it is resolved from local repository root. | `".remoteRepositoryFilters"` | 1.9.0 | No | Session Configuration | -| 65. | `"aether.remoteRepositoryFilter.groupId.record"` | `Boolean` | Should filter go into "record" mode (and collect encountered artifacts)? | `false` | 1.9.0 | No | Session Configuration | -| 66. | `"aether.remoteRepositoryFilter.prefixes"` | `Boolean` | Is filter enabled? | `false` | 1.9.0 | No | Session Configuration | -| 67. | `"aether.remoteRepositoryFilter.prefixes.basedir"` | `String` | The basedir where to store filter files. If path is relative, it is resolved from local repository root. | `".remoteRepositoryFilters"` | 1.9.0 | No | Session Configuration | -| 68. | `"aether.snapshotFilter"` | `Boolean` | The key in the repository session's used to store a flag whether this filter should be forced to ban snapshots. By default, snapshots are only filtered if the root artifact is not a snapshot. | `false` | | No | Session Configuration | -| 69. | `"aether.syncContext.named.basedir.locksDir"` | `String` | The location of the directory toi use for locks. If relative path, it is resolved from the local repository root. | `".locks"` | 1.9.0 | No | Session Configuration | -| 70. | `"aether.syncContext.named.discriminating.discriminator"` | `String` | Configuration property to pass in discriminator, if needed. If not present, it is auto-calculated. | - | 1.7.0 | No | Session Configuration | -| 71. | `"aether.syncContext.named.discriminating.hostname"` | `String` | Configuration property to pass in hostname, if needed. If not present, hostname as reported by system will be used. | - | 1.7.0 | No | Session Configuration | -| 72. | `"aether.syncContext.named.factory"` | `String` | Name of the lock factory to use in session. | `"file-lock"` | 1.9.1 | No | Session Configuration | -| 73. | `"aether.syncContext.named.hashing.depth"` | `Integer` | The depth how many levels should adapter create. Acceptable values are 0-4 (inclusive). | `2` | 1.9.0 | No | Session Configuration | -| 74. | `"aether.syncContext.named.nameMapper"` | `String` | Name of the name mapper to use in session. Out of the box supported ones are "static", "gav", "file-gav", "file-hgav", "file-static" and "discriminating". | `"file-gav"` | 1.9.1 | No | Session Configuration | -| 75. | `"aether.syncContext.named.redisson.address"` | `String` | Address of the Redis instance. Optional. | `"redis://localhost:6379"` | 2.0.0 | No | Java System Properties | -| 76. | `"aether.syncContext.named.redisson.configFile"` | `String` | Path to a Redisson configuration file in YAML format. Read official documentation for details. | - | 1.7.0 | No | Java System Properties | -| 77. | `"aether.syncContext.named.retry"` | `Integer` | The amount of retries on time-out. | `1` | 1.7.0 | No | Session Configuration | -| 78. | `"aether.syncContext.named.retry.wait"` | `Long` | The amount of milliseconds to wait between retries on time-out. | `200l` | 1.7.0 | No | Session Configuration | -| 79. | `"aether.syncContext.named.time"` | `Long` | The maximum of time amount to be blocked to obtain lock. | `30l` | 1.7.0 | No | Session Configuration | -| 80. | `"aether.syncContext.named.time.unit"` | `String` | The unit of maximum time amount to be blocked to obtain lock. Use TimeUnit enum names. | `"SECONDS"` | 1.7.0 | No | Session Configuration | -| 81. | `"aether.system.dependencyVisitor"` | `String` | A flag indicating which visitor should be used to "flatten" the dependency graph into list. Default is same as in older resolver versions "preOrder", while it can accept values like "postOrder" and "levelOrder". | `"preOrder"` | 2.0.0 | No | Session Configuration | -| 82. | `"aether.transport.apache.https.cipherSuites"` | `String` | Comma-separated list of Cipher Suites which are enabled for HTTPS connections. | - | 2.0.0 | No | Session Configuration | -| 83. | `"aether.transport.apache.https.protocols"` | `String` | Comma-separated list of Protocols which are enabled for HTTPS connections. | - | 2.0.0 | No | Session Configuration | -| 84. | `"aether.transport.apache.retryHandler.name"` | `String` | The name of retryHandler, supported values are “standard”, that obeys RFC-2616, regarding idempotent methods, and “default” that considers requests w/o payload as idempotent. | `"standard"` | 2.0.0 | Yes | Session Configuration | -| 85. | `"aether.transport.apache.retryHandler.requestSentEnabled"` | `Boolean` | Set to true if it is acceptable to retry non-idempotent requests, that have been sent. | `false` | 2.0.0 | Yes | Session Configuration | -| 86. | `"aether.transport.apache.useSystemProperties"` | `Boolean` | If enabled, underlying Apache HttpClient will use system properties as well to configure itself (typically used to set up HTTP Proxy via Java system properties). See HttpClientBuilder for used properties. This mode is not recommended, better use documented ways of configuration instead. | `false` | 2.0.0 | Yes | Session Configuration | -| 87. | `"aether.transport.classpath.loader"` | `ClassLoader` | The key in the repository session's used to store a from which resources should be retrieved. If unspecified, the of the current thread will be used. | - | | No | Session Configuration | -| 88. | `"aether.transport.http.connectTimeout"` | `Integer` | The maximum amount of time (in milliseconds) to wait for a successful connection to a remote server. Non-positive values indicate no timeout. | `10000` | | Yes | Session Configuration | -| 89. | `"aether.transport.http.connectionMaxTtl"` | `Integer` | Total time to live in seconds for an HTTP connection, after that time, the connection will be dropped (no matter for how long it was idle). | `300` | 1.9.8 | Yes | Session Configuration | -| 90. | `"aether.transport.http.credentialEncoding"` | `String` | The encoding/charset to use when exchanging credentials with HTTP servers. Besides this general key, clients may also specify the encoding for a specific remote repository by appending the suffix to this key when storing the charset name. | `"ISO-8859-1"` | | Yes | Session Configuration | -| 91. | `"aether.transport.http.expectContinue"` | `Boolean` | Boolean flag should the HTTP transport use expect-continue handshake for PUT requests. Not all transport support this option. This option may be needed for some broken HTTP servers. Default value corresponds to given transport default one (resolver does not override those), but if configuration IS given, it will replace given transport own default value. | - | 1.9.17 | Yes | Session Configuration | -| 92. | `"aether.transport.http.headers"` | `java.util.Map` | The request headers to use for HTTP-based repository connectors. The headers are specified using a , mapping a header name to its value. Besides this general key, clients may also specify headers for a specific remote repository by appending the suffix to this key when storing the headers map. The repository-specific headers map is supposed to be complete, i.e. is not merged with the general headers map. | - | | Yes | Session Configuration | -| 93. | `"aether.transport.http.localAddress"` | `String` | The local address (interface) to use with HTTP transport. Not all transport supports this option. | - | 2.0.0 | Yes | Session Configuration | -| 94. | `"aether.transport.http.maxConnectionsPerRoute"` | `Integer` | The maximum concurrent connections per route HTTP client is allowed to use. | `50` | 1.9.8 | Yes | Session Configuration | -| 95. | `"aether.transport.http.preemptiveAuth"` | `Boolean` | Should HTTP client use preemptive-authentication for all HTTP verbs (works only w/ BASIC). By default, is disabled, as it is considered less secure. | `false` | 1.9.6 | Yes | Session Configuration | -| 96. | `"aether.transport.http.preemptivePutAuth"` | `Boolean` | Boolean flag should the HTTP transport use preemptive-auth for PUT requests. Not all transport support this option. | `true` | 2.0.0 (moved out from maven-resolver-transport-http). | Yes | Session Configuration | -| 97. | `"aether.transport.http.requestTimeout"` | `Integer` | The maximum amount of time (in milliseconds) to wait for remaining data to arrive from a remote server. Note that this timeout does not restrict the overall duration of a request, it only restricts the duration of inactivity between consecutive data packets. Non-positive values indicate no timeout. | `1800000` | | Yes | Session Configuration | -| 98. | `"aether.transport.http.retryHandler.count"` | `Integer` | The maximum number of times a request to a remote server should be retried in case of an error. | `3` | 1.9.6 | Yes | Session Configuration | -| 99. | `"aether.transport.http.retryHandler.interval"` | `Long` | The initial retry interval in millis of request to a remote server should be waited in case of "too many requests" (HTTP codes 429 and 503). Accepts long as milliseconds. This value is used if remote server does not use header, in which case Server value is obeyed. | `5000l` | 1.9.16 | Yes | Session Configuration | -| 100. | `"aether.transport.http.retryHandler.intervalMax"` | `Long` | The maximum retry interval in millis of request to a remote server above which the request should be aborted instead. In theory, a malicious server could tell Maven "come back after 100 years" that would stall the build for some. Using this parameter Maven will fail the request instead, if interval is above this value. | `300000l` | 1.9.16 | Yes | Session Configuration | -| 101. | `"aether.transport.http.retryHandler.serviceUnavailable"` | `String` | The HTTP codes of remote server responses that should be handled as "too many requests" (examples: HTTP codes 429 and 503). Accepts comma separated list of HTTP response codes. | `"429,503"` | 1.9.16 | Yes | Session Configuration | -| 102. | `"aether.transport.http.reuseConnections"` | `Boolean` | Should HTTP client reuse connections (in other words, pool connections) or not? | `true` | 1.9.8 | Yes | Session Configuration | -| 103. | `"aether.transport.http.supportWebDav"` | `Boolean` | Boolean flag should the HTTP transport support WebDAV remote. Not all transport support this option. | `false` | 2.0.0 (moved out from maven-resolver-transport-http). | Yes | Session Configuration | -| 104. | `"aether.transport.http.userAgent"` | `String` | The user agent that repository connectors should report to servers. | `"Aether"` | | No | Session Configuration | -| 105. | `"aether.transport.https.securityMode"` | `String` | The mode that sets HTTPS transport "security mode": to ignore any SSL errors (certificate validity checks, hostname verification). The default value is . | `"default"` | 1.9.6 | Yes | Session Configuration | -| 106. | `"aether.transport.jdk.httpVersion"` | `String` | Use string representation of HttpClient version enum "HTTP_2" or "HTTP_1_1" to set default HTTP protocol to use. | `"HTTP_2"` | 2.0.0 | Yes | Session Configuration | -| 107. | `"aether.transport.jdk.maxConcurrentRequests"` | `Integer` | The hard limit of maximum concurrent requests JDK transport can do. This is a workaround for the fact, that in HTTP/2 mode, JDK HttpClient initializes this value to Integer.MAX_VALUE (!) and lowers it on first response from the remote server (but it may be too late). See JDK bug JDK-8225647 for details. | `100` | 2.0.0 | Yes | Session Configuration | -| 108. | `"aether.transport.jetty.followRedirects"` | `Boolean` | If enabled, Jetty client will follow HTTP redirects. | `true` | 2.0.1 | Yes | Session Configuration | -| 109. | `"aether.transport.jetty.maxRedirects"` | `Integer` | The max redirect count to follow. | `5` | 2.0.1 | Yes | Session Configuration | -| 110. | `"aether.transport.minio.fixedBucketName"` | `String` | The fixed bucket name to use. | `"maven"` | 2.0.2 | Yes | Session Configuration | -| 111. | `"aether.transport.minio.objectNameMapper"` | `String` | Object name mapper to use. | `"fixedBucket"` | 2.0.2 | Yes | Session Configuration | -| 112. | `"aether.transport.wagon.config"` | `Object` | The configuration to use for the Wagon provider. | - | | Yes | Session Configuration | -| 113. | `"aether.transport.wagon.perms.dirMode"` | `String` | Octal numerical notation of permissions to set for newly created directories. Only considered by certain Wagon providers. | - | | Yes | Session Configuration | -| 114. | `"aether.transport.wagon.perms.fileMode"` | `String` | Octal numerical notation of permissions to set for newly created files. Only considered by certain Wagon providers. | - | | Yes | Session Configuration | -| 115. | `"aether.transport.wagon.perms.group"` | `String` | Group which should own newly created directories/files. Only considered by certain Wagon providers. | - | | Yes | Session Configuration | -| 116. | `"aether.trustedChecksumsSource.sparseDirectory"` | `Boolean` | Is checksum source enabled? | `false` | 1.9.0 | No | Session Configuration | -| 117. | `"aether.trustedChecksumsSource.sparseDirectory.basedir"` | `String` | The basedir where checksums are. If relative, is resolved from local repository root. | `".checksums"` | 1.9.0 | No | Session Configuration | -| 118. | `"aether.trustedChecksumsSource.sparseDirectory.originAware"` | `Boolean` | Is source origin aware? | `true` | 1.9.0 | No | Session Configuration | -| 119. | `"aether.trustedChecksumsSource.summaryFile"` | `Boolean` | Is checksum source enabled? | `false` | 1.9.0 | No | Session Configuration | -| 120. | `"aether.trustedChecksumsSource.summaryFile.basedir"` | `String` | The basedir where checksums are. If relative, is resolved from local repository root. | `".checksums"` | 1.9.0 | No | Session Configuration | -| 121. | `"aether.trustedChecksumsSource.summaryFile.originAware"` | `Boolean` | Is source origin aware? | `true` | 1.9.0 | No | Session Configuration | -| 122. | `"aether.updateCheckManager.sessionState"` | `String` | Manages the session state, i.e. influences if the same download requests to artifacts/metadata will happen multiple times within the same RepositorySystemSession. If "enabled" will enable the session state. If "bypass" will enable bypassing (i.e. store all artifact ids/metadata ids which have been updates but not evaluating those). All other values lead to disabling the session state completely. | `"enabled"` | | No | Session Configuration | +| 61. | `"aether.priority."` | `Float` | The priority to use for a certain extension class. <class> can either be the fully qualified name or the simple name of a class. If the class name ends with Factory that suffix could optionally be left out. This configuration is used by org.eclipse.aether.internal.impl.PrioritizedComponents internal utility to sort classes by priority. This is reusable utility (so an extension can make use of it), but by default in "vanilla" Resolver following classes are sorted:
  • org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory
  • org.eclipse.aether.spi.connector.RepositoryConnectorFactory
  • org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory
  • org.eclipse.aether.spi.connector.transport.TransporterFactory
  • org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory
  • org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory
  • org.eclipse.aether.impl.MetadataGeneratorFactory
| - | | No | Session Configuration | +| 62. | `"aether.priority.cached"` | `Boolean` | A flag indicating whether the created ordered components should be cached in session. | `true` | 2.0.0 | No | Session Configuration | +| 63. | `"aether.priority.implicit"` | `Boolean` | A flag indicating whether the priorities of pluggable extensions are implicitly given by their iteration order such that the first extension has the highest priority. If set, an extension's built-in priority as well as any corresponding aether.priority.* configuration properties are ignored when searching for a suitable implementation among the available extensions. This priority mode is meant for cases where the application will present/inject extensions in the desired search order. | `false` | | No | Session Configuration | +| 64. | `"aether.remoteRepositoryFilter.groupId"` | `Boolean` | Is filter enabled? | `false` | 1.9.0 | No | Session Configuration | +| 65. | `"aether.remoteRepositoryFilter.groupId.basedir"` | `String` | The basedir where to store filter files. If path is relative, it is resolved from local repository root. | `".remoteRepositoryFilters"` | 1.9.0 | No | Session Configuration | +| 66. | `"aether.remoteRepositoryFilter.groupId.record"` | `Boolean` | Should filter go into "record" mode (and collect encountered artifacts)? | `false` | 1.9.0 | No | Session Configuration | +| 67. | `"aether.remoteRepositoryFilter.prefixes"` | `Boolean` | Is filter enabled? | `false` | 1.9.0 | No | Session Configuration | +| 68. | `"aether.remoteRepositoryFilter.prefixes.basedir"` | `String` | The basedir where to store filter files. If path is relative, it is resolved from local repository root. | `".remoteRepositoryFilters"` | 1.9.0 | No | Session Configuration | +| 69. | `"aether.snapshotFilter"` | `Boolean` | The key in the repository session's RepositorySystemSession#getConfigProperties() configurationproperties used to store a Boolean flag whether this filter should be forced to ban snapshots. By default, snapshots are only filtered if the root artifact is not a snapshot. | `false` | | No | Session Configuration | +| 70. | `"aether.syncContext.named.basedir.locksDir"` | `String` | The location of the directory toi use for locks. If relative path, it is resolved from the local repository root. | `".locks"` | 1.9.0 | No | Session Configuration | +| 71. | `"aether.syncContext.named.discriminating.discriminator"` | `String` | Configuration property to pass in discriminator, if needed. If not present, it is auto-calculated. | - | 1.7.0 | No | Session Configuration | +| 72. | `"aether.syncContext.named.discriminating.hostname"` | `String` | Configuration property to pass in hostname, if needed. If not present, hostname as reported by system will be used. | - | 1.7.0 | No | Session Configuration | +| 73. | `"aether.syncContext.named.factory"` | `String` | Name of the lock factory to use in session. | `"file-lock"` | 1.9.1 | No | Session Configuration | +| 74. | `"aether.syncContext.named.hashing.depth"` | `Integer` | The depth how many levels should adapter create. Acceptable values are 0-4 (inclusive). | `2` | 1.9.0 | No | Session Configuration | +| 75. | `"aether.syncContext.named.nameMapper"` | `String` | Name of the name mapper to use in session. Out of the box supported ones are "static", "gav", "file-gav", "file-hgav", "file-static" and "discriminating". | `"file-gav"` | 1.9.1 | No | Session Configuration | +| 76. | `"aether.syncContext.named.redisson.address"` | `String` | Address of the Redis instance. Optional. | `"redis://localhost:6379"` | 2.0.0 | No | Java System Properties | +| 77. | `"aether.syncContext.named.redisson.configFile"` | `String` | Path to a Redisson configuration file in YAML format. Read official documentation for details. | - | 1.7.0 | No | Java System Properties | +| 78. | `"aether.syncContext.named.retry"` | `Integer` | The amount of retries on time-out. | `1` | 1.7.0 | No | Session Configuration | +| 79. | `"aether.syncContext.named.retry.wait"` | `Long` | The amount of milliseconds to wait between retries on time-out. | `200l` | 1.7.0 | No | Session Configuration | +| 80. | `"aether.syncContext.named.time"` | `Long` | The maximum of time amount to be blocked to obtain lock. | `30l` | 1.7.0 | No | Session Configuration | +| 81. | `"aether.syncContext.named.time.unit"` | `String` | The unit of maximum time amount to be blocked to obtain lock. Use TimeUnit enum names. | `"SECONDS"` | 1.7.0 | No | Session Configuration | +| 82. | `"aether.system.dependencyVisitor"` | `String` | A flag indicating which visitor should be used to "flatten" the dependency graph into list. Default is same as in older resolver versions "preOrder", while it can accept values like "postOrder" and "levelOrder". | `"preOrder"` | 2.0.0 | No | Session Configuration | +| 83. | `"aether.transport.apache.followRedirects"` | `Boolean` | If enabled, Apache HttpClient will follow HTTP redirects. | `true` | 2.0.2 | Yes | Session Configuration | +| 84. | `"aether.transport.apache.https.cipherSuites"` | `String` | Comma-separated list of Cipher Suites which are enabled for HTTPS connections. | - | 2.0.0 | No | Session Configuration | +| 85. | `"aether.transport.apache.https.protocols"` | `String` | Comma-separated list of Protocols which are enabled for HTTPS connections. | - | 2.0.0 | No | Session Configuration | +| 86. | `"aether.transport.apache.maxRedirects"` | `Integer` | The max redirect count to follow. | `5` | 2.0.2 | Yes | Session Configuration | +| 87. | `"aether.transport.apache.retryHandler.name"` | `String` | The name of retryHandler, supported values are “standard”, that obeys RFC-2616, regarding idempotent methods, and “default” that considers requests w/o payload as idempotent. | `"standard"` | 2.0.0 | Yes | Session Configuration | +| 88. | `"aether.transport.apache.retryHandler.requestSentEnabled"` | `Boolean` | Set to true if it is acceptable to retry non-idempotent requests, that have been sent. | `false` | 2.0.0 | Yes | Session Configuration | +| 89. | `"aether.transport.apache.useSystemProperties"` | `Boolean` | If enabled, underlying Apache HttpClient will use system properties as well to configure itself (typically used to set up HTTP Proxy via Java system properties). See HttpClientBuilder for used properties. This mode is not recommended, better use documented ways of configuration instead. | `false` | 2.0.0 | Yes | Session Configuration | +| 90. | `"aether.transport.classpath.loader"` | `ClassLoader` | The key in the repository session's RepositorySystemSession#getConfigProperties() configurationproperties used to store a ClassLoader from which resources should be retrieved. If unspecified, the Thread#getContextClassLoader() context class loader of the current thread will be used. | - | | No | Session Configuration | +| 91. | `"aether.transport.http.connectTimeout"` | `Integer` | The maximum amount of time (in milliseconds) to wait for a successful connection to a remote server. Non-positive values indicate no timeout. | `10000` | | Yes | Session Configuration | +| 92. | `"aether.transport.http.connectionMaxTtl"` | `Integer` | Total time to live in seconds for an HTTP connection, after that time, the connection will be dropped (no matter for how long it was idle). | `300` | 1.9.8 | Yes | Session Configuration | +| 93. | `"aether.transport.http.credentialEncoding"` | `String` | The encoding/charset to use when exchanging credentials with HTTP servers. Besides this general key, clients may also specify the encoding for a specific remote repository by appending the suffix .<repoId> to this key when storing the charset name. | `"ISO-8859-1"` | | Yes | Session Configuration | +| 94. | `"aether.transport.http.expectContinue"` | `Boolean` | Boolean flag should the HTTP transport use expect-continue handshake for PUT requests. Not all transport support this option. This option may be needed for some broken HTTP servers. Default value corresponds to given transport default one (resolver does not override those), but if configuration IS given, it will replace given transport own default value. | - | 1.9.17 | Yes | Session Configuration | +| 95. | `"aether.transport.http.headers"` | `java.util.Map` | The request headers to use for HTTP-based repository connectors. The headers are specified using a Map , mapping a header name to its value. Besides this general key, clients may also specify headers for a specific remote repository by appending the suffix .<repoId> to this key when storing the headers map. The repository-specific headers map is supposed to be complete, i.e. is not merged with the general headers map. | - | | Yes | Session Configuration | +| 96. | `"aether.transport.http.localAddress"` | `String` | The local address (interface) to use with HTTP transport. Not all transport supports this option. | - | 2.0.0 | Yes | Session Configuration | +| 97. | `"aether.transport.http.maxConnectionsPerRoute"` | `Integer` | The maximum concurrent connections per route HTTP client is allowed to use. | `50` | 1.9.8 | Yes | Session Configuration | +| 98. | `"aether.transport.http.preemptiveAuth"` | `Boolean` | Should HTTP client use preemptive-authentication for all HTTP verbs (works only w/ BASIC). By default, is disabled, as it is considered less secure. | `false` | 1.9.6 | Yes | Session Configuration | +| 99. | `"aether.transport.http.preemptivePutAuth"` | `Boolean` | Boolean flag should the HTTP transport use preemptive-auth for PUT requests. Not all transport support this option. | `true` | 2.0.0 (moved out from maven-resolver-transport-http). | Yes | Session Configuration | +| 100. | `"aether.transport.http.requestTimeout"` | `Integer` | The maximum amount of time (in milliseconds) to wait for remaining data to arrive from a remote server. Note that this timeout does not restrict the overall duration of a request, it only restricts the duration of inactivity between consecutive data packets. Non-positive values indicate no timeout. | `1800000` | | Yes | Session Configuration | +| 101. | `"aether.transport.http.retryHandler.count"` | `Integer` | The maximum number of times a request to a remote server should be retried in case of an error. | `3` | 1.9.6 | Yes | Session Configuration | +| 102. | `"aether.transport.http.retryHandler.interval"` | `Long` | The initial retry interval in millis of request to a remote server should be waited in case of "too many requests" (HTTP codes 429 and 503). Accepts long as milliseconds. This value is used if remote server does not use Retry-After header, in which case Server value is obeyed. | `5000l` | 1.9.16 | Yes | Session Configuration | +| 103. | `"aether.transport.http.retryHandler.intervalMax"` | `Long` | The maximum retry interval in millis of request to a remote server above which the request should be aborted instead. In theory, a malicious server could tell Maven "come back after 100 years" that would stall the build for some. Using this parameter Maven will fail the request instead, if interval is above this value. | `300000l` | 1.9.16 | Yes | Session Configuration | +| 104. | `"aether.transport.http.retryHandler.serviceUnavailable"` | `String` | The HTTP codes of remote server responses that should be handled as "too many requests" (examples: HTTP codes 429 and 503). Accepts comma separated list of HTTP response codes. | `"429,503"` | 1.9.16 | Yes | Session Configuration | +| 105. | `"aether.transport.http.reuseConnections"` | `Boolean` | Should HTTP client reuse connections (in other words, pool connections) or not? | `true` | 1.9.8 | Yes | Session Configuration | +| 106. | `"aether.transport.http.supportWebDav"` | `Boolean` | Boolean flag should the HTTP transport support WebDAV remote. Not all transport support this option. | `false` | 2.0.0 (moved out from maven-resolver-transport-http). | Yes | Session Configuration | +| 107. | `"aether.transport.http.userAgent"` | `String` | The user agent that repository connectors should report to servers. | `"Aether"` | | No | Session Configuration | +| 108. | `"aether.transport.https.securityMode"` | `String` | The mode that sets HTTPS transport "security mode": to ignore any SSL errors (certificate validity checks, hostname verification). The default value is #HTTPS_SECURITY_MODE_DEFAULT . | `"default"` | 1.9.6 | Yes | Session Configuration | +| 109. | `"aether.transport.jdk.httpVersion"` | `String` | Use string representation of HttpClient version enum "HTTP_2" or "HTTP_1_1" to set default HTTP protocol to use. | `"HTTP_2"` | 2.0.0 | Yes | Session Configuration | +| 110. | `"aether.transport.jdk.maxConcurrentRequests"` | `Integer` | The hard limit of maximum concurrent requests JDK transport can do. This is a workaround for the fact, that in HTTP/2 mode, JDK HttpClient initializes this value to Integer.MAX_VALUE (!) and lowers it on first response from the remote server (but it may be too late). See JDK bug JDK-8225647 for details. | `100` | 2.0.0 | Yes | Session Configuration | +| 111. | `"aether.transport.jetty.followRedirects"` | `Boolean` | If enabled, Jetty client will follow HTTP redirects. | `true` | 2.0.1 | Yes | Session Configuration | +| 112. | `"aether.transport.jetty.maxRedirects"` | `Integer` | The max redirect count to follow. | `5` | 2.0.1 | Yes | Session Configuration | +| 113. | `"aether.transport.minio.fixedBucketName"` | `String` | The fixed bucket name to use. | `"maven"` | 2.0.2 | Yes | Session Configuration | +| 114. | `"aether.transport.minio.objectNameMapper"` | `String` | Object name mapper to use. | `"fixedBucket"` | 2.0.2 | Yes | Session Configuration | +| 115. | `"aether.transport.wagon.config"` | `Object` | The configuration to use for the Wagon provider. | - | | Yes | Session Configuration | +| 116. | `"aether.transport.wagon.perms.dirMode"` | `String` | Octal numerical notation of permissions to set for newly created directories. Only considered by certain Wagon providers. | - | | Yes | Session Configuration | +| 117. | `"aether.transport.wagon.perms.fileMode"` | `String` | Octal numerical notation of permissions to set for newly created files. Only considered by certain Wagon providers. | - | | Yes | Session Configuration | +| 118. | `"aether.transport.wagon.perms.group"` | `String` | Group which should own newly created directories/files. Only considered by certain Wagon providers. | - | | Yes | Session Configuration | +| 119. | `"aether.trustedChecksumsSource.sparseDirectory"` | `Boolean` | Is checksum source enabled? | `false` | 1.9.0 | No | Session Configuration | +| 120. | `"aether.trustedChecksumsSource.sparseDirectory.basedir"` | `String` | The basedir where checksums are. If relative, is resolved from local repository root. | `".checksums"` | 1.9.0 | No | Session Configuration | +| 121. | `"aether.trustedChecksumsSource.sparseDirectory.originAware"` | `Boolean` | Is source origin aware? | `true` | 1.9.0 | No | Session Configuration | +| 122. | `"aether.trustedChecksumsSource.summaryFile"` | `Boolean` | Is checksum source enabled? | `false` | 1.9.0 | No | Session Configuration | +| 123. | `"aether.trustedChecksumsSource.summaryFile.basedir"` | `String` | The basedir where checksums are. If relative, is resolved from local repository root. | `".checksums"` | 1.9.0 | No | Session Configuration | +| 124. | `"aether.trustedChecksumsSource.summaryFile.originAware"` | `Boolean` | Is source origin aware? | `true` | 1.9.0 | No | Session Configuration | +| 125. | `"aether.updateCheckManager.sessionState"` | `String` | Manages the session state, i.e. influences if the same download requests to artifacts/metadata will happen multiple times within the same RepositorySystemSession. If "enabled" will enable the session state. If "bypass" will enable bypassing (i.e. store all artifact ids/metadata ids which have been updates but not evaluating those). All other values lead to disabling the session state completely. | `"enabled"` | | No | Session Configuration | All properties which have `yes` in the column `Supports Repo ID Suffix` can be optionally configured specifically for a repository id. In that case the configuration property needs to be suffixed with a period followed by the repository id of the repository to configure, e.g. `aether.connector.http.headers.central` for repository with id `central`.