1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.eclipse.aether;
20
21 /**
22 * The keys and defaults for common configuration properties.
23 *
24 * @see RepositorySystemSession#getConfigProperties()
25 */
26 public final class ConfigurationProperties {
27
28 /**
29 * Prefix for all configurations. <em>For internal use only.</em>
30 *
31 * @since 2.0.0
32 */
33 public static final String PREFIX_AETHER = "aether.";
34
35 /**
36 * Prefix for repository system related configurations. <em>For internal use only.</em>
37 *
38 * @since 2.0.0
39 */
40 public static final String PREFIX_SYSTEM = PREFIX_AETHER + "system.";
41
42 /**
43 * Prefix for sync context related configurations. <em>For internal use only.</em>
44 *
45 * @since 2.0.0
46 */
47 public static final String PREFIX_SYNC_CONTEXT = PREFIX_AETHER + "syncContext.";
48
49 /**
50 * Prefix for connector related configurations. <em>For internal use only.</em>
51 *
52 * @since 2.0.0
53 */
54 public static final String PREFIX_CONNECTOR = PREFIX_AETHER + "connector.";
55
56 /**
57 * Prefix for layout related configurations. <em>For internal use only.</em>
58 *
59 * @since 2.0.0
60 */
61 public static final String PREFIX_LAYOUT = PREFIX_AETHER + "layout.";
62
63 /**
64 * Prefix for checksum related configurations. <em>For internal use only.</em>
65 *
66 * @since 2.0.0
67 */
68 public static final String PREFIX_CHECKSUMS = PREFIX_AETHER + "checksums.";
69
70 /**
71 * Prefix for local repository manager related configurations. <em>For internal use only.</em>
72 *
73 * @since 2.0.0
74 */
75 public static final String PREFIX_LRM = PREFIX_AETHER + "lrm.";
76
77 /**
78 * Prefix for generator related configurations. <em>For internal use only.</em>
79 *
80 * @since 2.0.0
81 */
82 public static final String PREFIX_GENERATOR = PREFIX_AETHER + "generator.";
83
84 /**
85 * Prefix for util related configurations. <em>For internal use only.</em>
86 *
87 * @since 2.0.10
88 */
89 public static final String PREFIX_UTIL = PREFIX_AETHER + "util.";
90
91 /**
92 * Prefix for installer related configurations. <em>For internal use only.</em>
93 *
94 * @since 2.0.25
95 */
96 public static final String PREFIX_INSTALLER = PREFIX_AETHER + "installer.";
97
98 /**
99 * Prefix for transport related configurations. <em>For internal use only.</em>
100 *
101 * @since 2.0.0
102 */
103 public static final String PREFIX_TRANSPORT = PREFIX_AETHER + "transport.";
104
105 /**
106 * Prefix for HTTP protocol related configurations. <em>For internal use only.</em>
107 *
108 * @since 2.0.0
109 */
110 public static final String PREFIX_TRANSPORT_HTTP = PREFIX_TRANSPORT + "http.";
111
112 /**
113 * Prefix for HTTPS protocol related configurations. <em>For internal use only.</em>
114 *
115 * @since 2.0.0
116 */
117 public static final String PREFIX_TRANSPORT_HTTPS = PREFIX_TRANSPORT + "https.";
118
119 /**
120 * The prefix for properties that control the priority of pluggable extensions like transporters. For example, for
121 * an extension with the fully qualified class name "org.eclipse.MyExtensionFactory", the configuration properties
122 * "aether.priority.org.eclipse.MyExtensionFactory", "aether.priority.MyExtensionFactory" and
123 * "aether.priority.MyExtension" will be consulted for the priority, in that order (obviously, the last key is only
124 * tried if the class name ends with "Factory"). The corresponding value is a float and the special value
125 * {@link Float#NaN} or "NaN" (case-sensitive) can be used to disable the extension.
126 */
127 public static final String PREFIX_PRIORITY = PREFIX_AETHER + "priority.";
128
129 /**
130 * A flag indicating whether the priorities of pluggable extensions are implicitly given by their iteration order
131 * such that the first extension has the highest priority. If set, an extension's built-in priority as well as any
132 * corresponding {@code aether.priority.*} configuration properties are ignored when searching for a suitable
133 * implementation among the available extensions. This priority mode is meant for cases where the application will
134 * present/inject extensions in the desired search order.
135 *
136 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
137 * @configurationType {@link java.lang.Boolean}
138 * @configurationDefaultValue {@link #DEFAULT_IMPLICIT_PRIORITIES}
139 * @configurationRepoIdSuffix No
140 */
141 public static final String IMPLICIT_PRIORITIES = PREFIX_PRIORITY + "implicit";
142
143 /**
144 * The default extension priority mode if {@link #IMPLICIT_PRIORITIES} isn't set.
145 */
146 public static final boolean DEFAULT_IMPLICIT_PRIORITIES = false;
147
148 /**
149 * A flag indicating whether the created ordered components should be cached in session.
150 *
151 * @since 2.0.0
152 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
153 * @configurationType {@link java.lang.Boolean}
154 * @configurationDefaultValue {@link #DEFAULT_CACHED_PRIORITIES}
155 * @configurationRepoIdSuffix No
156 */
157 public static final String CACHED_PRIORITIES = PREFIX_PRIORITY + "cached";
158
159 /**
160 * The default caching of priority components if {@link #CACHED_PRIORITIES} isn't set. Default value is {@code true}.
161 *
162 * @since 2.0.0
163 */
164 public static final boolean DEFAULT_CACHED_PRIORITIES = true;
165
166 /**
167 * The priority to use for a certain extension class. {@code <class>} can either be the fully qualified
168 * name or the simple name of a class. If the class name ends with Factory that suffix could optionally be left out.
169 * This configuration is used by {@code org.eclipse.aether.internal.impl.PrioritizedComponents} internal utility
170 * to sort classes by priority. This is reusable utility (so an extension can make use of it), but by default
171 * in "vanilla" Resolver following classes are sorted:
172 * <ul>
173 * <li>{@code org.eclipse.aether.spi.localrepo.LocalRepositoryManagerFactory}</li>
174 * <li>{@code org.eclipse.aether.spi.connector.RepositoryConnectorFactory}</li>
175 * <li>{@code org.eclipse.aether.spi.connector.layout.RepositoryLayoutFactory}</li>
176 * <li>{@code org.eclipse.aether.spi.connector.transport.TransporterFactory}</li>
177 * <li>{@code org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory}</li>
178 * <li>{@code org.eclipse.aether.spi.artifact.generator.ArtifactGeneratorFactory}</li>
179 * <li>{@code org.eclipse.aether.impl.MetadataGeneratorFactory}</li>
180 * </ul>
181 *
182 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
183 * @configurationType {@link java.lang.Float}
184 * @configurationRepoIdSuffix No
185 */
186 public static final String CLASS_PRIORITIES = PREFIX_PRIORITY + "<class>";
187
188 /**
189 * A flag indicating whether interaction with the user is allowed.
190 *
191 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
192 * @configurationType {@link java.lang.Boolean}
193 * @configurationDefaultValue {@link #DEFAULT_INTERACTIVE}
194 * @configurationRepoIdSuffix No
195 */
196 public static final String INTERACTIVE = PREFIX_AETHER + "interactive";
197
198 /**
199 * The default interactive mode if {@link #INTERACTIVE} isn't set.
200 */
201 public static final boolean DEFAULT_INTERACTIVE = false;
202
203 /**
204 * The user agent that repository connectors should report to servers.
205 *
206 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
207 * @configurationType {@link java.lang.String}
208 * @configurationDefaultValue {@link #DEFAULT_USER_AGENT}
209 * @configurationRepoIdSuffix No
210 */
211 public static final String USER_AGENT = PREFIX_TRANSPORT_HTTP + "userAgent";
212
213 /**
214 * The default user agent to use if {@link #USER_AGENT} isn't set.
215 */
216 public static final String DEFAULT_USER_AGENT = "Aether";
217
218 /**
219 * The maximum amount of time (in milliseconds) to wait for a successful connection to a remote server. Non-positive
220 * values indicate no timeout.
221 *
222 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
223 * @configurationType {@link java.lang.Integer}
224 * @configurationDefaultValue {@link #DEFAULT_CONNECT_TIMEOUT}
225 * @configurationRepoIdSuffix Yes
226 */
227 public static final String CONNECT_TIMEOUT = PREFIX_TRANSPORT_HTTP + "connectTimeout";
228
229 /**
230 * The default connect timeout to use if {@link #CONNECT_TIMEOUT} isn't set.
231 */
232 public static final int DEFAULT_CONNECT_TIMEOUT = 30 * 1000;
233
234 /**
235 * The maximum amount of time (in milliseconds) to wait for remaining data to arrive from a remote server. Note that
236 * this timeout does not restrict the overall duration of a request, it only restricts the duration of inactivity
237 * between consecutive data packets. Non-positive values indicate no timeout.
238 *
239 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
240 * @configurationType {@link java.lang.Integer}
241 * @configurationDefaultValue {@link #DEFAULT_REQUEST_TIMEOUT}
242 * @configurationRepoIdSuffix Yes
243 */
244 public static final String REQUEST_TIMEOUT = PREFIX_TRANSPORT_HTTP + "requestTimeout";
245
246 /**
247 * The default request timeout to use if {@link #REQUEST_TIMEOUT} isn't set.
248 */
249 public static final int DEFAULT_REQUEST_TIMEOUT = 1800 * 1000;
250
251 /**
252 * The request headers to use for HTTP-based repository connectors. The headers are specified using a
253 * {@code Map<String, String>}, mapping a header name to its value. Besides this general key, clients may also
254 * specify headers for a specific remote repository by appending the suffix {@code .<repoId>} to this key when
255 * storing the headers map. The repository-specific headers map is supposed to be complete, i.e. is not merged with
256 * the general headers map.
257 * <p>
258 * <strong>Security note:</strong> configured headers are attached to every request the transport sends for the
259 * repository and, depending on the transport implementation, may be re-sent when the repository responds with
260 * a redirect - including redirects that leave the repository origin. Avoid placing credentials (for example
261 * {@code Authorization}, cookies or private token headers) in this map where repository authentication can be
262 * used instead: repository authentication is negotiated per host. All shipped HTTP transports scope configured
263 * headers to the repository origin by default, controlled by {@link #HTTP_ORIGIN_SCOPED_HEADERS}.
264 *
265 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
266 * @configurationType {@link java.util.Map}
267 * @configurationRepoIdSuffix Yes
268 */
269 public static final String HTTP_HEADERS = PREFIX_TRANSPORT_HTTP + "headers";
270
271 /**
272 * The mode that controls how HTTP redirects are handled. By default, any redirect is followed, but this can be
273 * restricted to only redirects within the same authority or no redirects at all.
274 *
275 * @since 2.0.25
276 */
277 public enum RedirectMode {
278 /**
279 * No redirects allowed.
280 */
281 NONE,
282 /**
283 * Redirects only within same authority.
284 */
285 SAME_AUTHORITY,
286 /**
287 * Any redirect is followed.
288 */
289 ANY
290 }
291
292 /**
293 * Optionally restricts following HTTP redirects to either the same authority or not allowing any redirects at all.
294 * By default any redirect is followed.
295 * Blocked redirects lead to exceptions being thrown by the transport.
296 *
297 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
298 * @configurationType {@link ConfigurationProperties.RedirectMode}
299 * @configurationDefaultValue {@link #DEFAULT_REDIRECT_MODE}
300 * @configurationRepoIdSuffix Yes
301 * @since 2.0.25
302 * @see #HTTP_ORIGIN_SCOPED_HEADERS
303 * @see #HTTP_FOLLOW_INSECURE_REDIRECT
304 */
305 public static final String HTTP_REDIRECT_MODE = PREFIX_TRANSPORT_HTTP + "redirectMode";
306
307 /**
308 * Default value if {@link #HTTP_REDIRECT_MODE} is not set.
309 *
310 * @since 2.0.25
311 */
312 public static final RedirectMode DEFAULT_REDIRECT_MODE = RedirectMode.ANY;
313
314 /**
315 * If enabled (default), HTTP transports only send configured request headers and preemptively applied
316 * {@code Authorization} on requests targeting the repository origin.
317 *
318 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
319 * @configurationType {@link java.lang.Boolean}
320 * @configurationDefaultValue {@link #DEFAULT_HTTP_ORIGIN_SCOPED_HEADERS}
321 * @configurationRepoIdSuffix Yes
322 * @since 2.0.25
323 * @see #HTTP_REDIRECT_MODE
324 */
325 public static final String HTTP_ORIGIN_SCOPED_HEADERS = PREFIX_TRANSPORT_HTTP + "originScopedHeaders";
326
327 /**
328 * The default value for {@link #HTTP_ORIGIN_SCOPED_HEADERS}: {@code true}.
329 *
330 * @since 2.0.25
331 */
332 public static final boolean DEFAULT_HTTP_ORIGIN_SCOPED_HEADERS = true;
333
334 /**
335 * If enabled, HTTP transports follow redirects that downgrade the protocol from HTTPS to HTTP. Disabled by
336 * default because such a downgrade removes transport encryption from artifact and checksum bytes.
337 *
338 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
339 * @configurationType {@link java.lang.Boolean}
340 * @configurationDefaultValue {@link #DEFAULT_HTTP_FOLLOW_INSECURE_REDIRECT}
341 * @configurationRepoIdSuffix Yes
342 * @since 2.0.25
343 */
344 public static final String HTTP_FOLLOW_INSECURE_REDIRECT = PREFIX_TRANSPORT_HTTP + "followInsecureRedirect";
345
346 /**
347 * The default value for {@link #HTTP_FOLLOW_INSECURE_REDIRECT}: {@code false}.
348 *
349 * @since 2.0.25
350 */
351 public static final boolean DEFAULT_HTTP_FOLLOW_INSECURE_REDIRECT = false;
352
353 /**
354 * The encoding/charset to use when exchanging credentials with HTTP servers. Besides this general key, clients may
355 * also specify the encoding for a specific remote repository by appending the suffix {@code .<repoId>} to this key
356 * when storing the charset name.
357 *
358 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
359 * @configurationType {@link java.lang.String}
360 * @configurationDefaultValue {@link #DEFAULT_HTTP_CREDENTIAL_ENCODING}
361 * @configurationRepoIdSuffix Yes
362 */
363 public static final String HTTP_CREDENTIAL_ENCODING = PREFIX_TRANSPORT_HTTP + "credentialEncoding";
364
365 /**
366 * The default encoding/charset to use if {@link #HTTP_CREDENTIAL_ENCODING} isn't set.
367 */
368 public static final String DEFAULT_HTTP_CREDENTIAL_ENCODING = "ISO-8859-1";
369
370 /**
371 * The maximum number of times a request to a remote server should be retried in case of an error.
372 *
373 * @since 1.9.6
374 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
375 * @configurationType {@link java.lang.Integer}
376 * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_COUNT}
377 * @configurationRepoIdSuffix Yes
378 */
379 public static final String HTTP_RETRY_HANDLER_COUNT = PREFIX_TRANSPORT_HTTP + "retryHandler.count";
380
381 /**
382 * The default number of retries to use if {@link #HTTP_RETRY_HANDLER_COUNT} isn't set.
383 *
384 * @since 1.9.6
385 */
386 public static final int DEFAULT_HTTP_RETRY_HANDLER_COUNT = 3;
387
388 /**
389 * The initial delay in milliseconds for retried requests after receiving a server response with status
390 * "too many requests" (HTTP codes 429 and 503). Accepts long as milliseconds. This value is used if the remote server
391 * does not use {@code Retry-After} header, in which case the server value is obeyed.
392 * This delay is increased for every retry, up to {@link #HTTP_RETRY_HANDLER_INTERVAL_MAX}.
393 *
394 * @since 1.9.16
395 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
396 * @configurationType {@link java.lang.Long}
397 * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_INTERVAL}
398 * @configurationRepoIdSuffix Yes
399 */
400 public static final String HTTP_RETRY_HANDLER_INTERVAL = PREFIX_TRANSPORT_HTTP + "retryHandler.interval";
401
402 /**
403 * The default initial retry delay to use if {@link #HTTP_RETRY_HANDLER_INTERVAL} isn't set.
404 * Default value 5000ms.
405 *
406 * @since 1.9.16
407 */
408 public static final long DEFAULT_HTTP_RETRY_HANDLER_INTERVAL = 5000L;
409
410 /**
411 * The maximum delay in milliseconds for retried requests. Every delay is capped to this value.
412 * This is a security measure to avoid malicious servers from stalling the build for too long.
413 *
414 * @since 1.9.16
415 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
416 * @configurationType {@link java.lang.Long}
417 * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_INTERVAL_MAX}
418 * @configurationRepoIdSuffix Yes
419 */
420 public static final String HTTP_RETRY_HANDLER_INTERVAL_MAX = PREFIX_TRANSPORT_HTTP + "retryHandler.intervalMax";
421
422 /**
423 * The default retry delay maximum to use if {@link #HTTP_RETRY_HANDLER_INTERVAL_MAX} isn't set.
424 * Default value 5 minutes.
425 *
426 * @since 1.9.16
427 */
428 public static final long DEFAULT_HTTP_RETRY_HANDLER_INTERVAL_MAX = 300_000L;
429
430 /**
431 * The HTTP codes of remote server responses that should be handled as "too many requests"
432 * (examples: HTTP codes 429 and 503). Accepts comma separated list of HTTP response codes.
433 *
434 * @since 1.9.16
435 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
436 * @configurationType {@link java.lang.String}
437 * @configurationDefaultValue {@link #DEFAULT_HTTP_RETRY_HANDLER_SERVICE_UNAVAILABLE}
438 * @configurationRepoIdSuffix Yes
439 */
440 public static final String HTTP_RETRY_HANDLER_SERVICE_UNAVAILABLE =
441 PREFIX_TRANSPORT_HTTP + "retryHandler.serviceUnavailable";
442
443 /**
444 * The default HTTP codes of remote server responses that should be handled as "too many requests".
445 * Default value: "429,503".
446 *
447 * @since 1.9.16
448 */
449 public static final String DEFAULT_HTTP_RETRY_HANDLER_SERVICE_UNAVAILABLE = "429,503";
450
451 /**
452 * Should HTTP client use preemptive-authentication for all HTTP verbs (works only w/ BASIC). By default, is
453 * disabled, as it is considered less secure.
454 *
455 * @since 1.9.6
456 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
457 * @configurationType {@link java.lang.Boolean}
458 * @configurationDefaultValue {@link #DEFAULT_HTTP_PREEMPTIVE_AUTH}
459 * @configurationRepoIdSuffix Yes
460 */
461 public static final String HTTP_PREEMPTIVE_AUTH = PREFIX_TRANSPORT_HTTP + "preemptiveAuth";
462
463 /**
464 * The default value to use if {@link #HTTP_PREEMPTIVE_AUTH} isn't set (false).
465 *
466 * @since 1.9.6
467 */
468 public static final boolean DEFAULT_HTTP_PREEMPTIVE_AUTH = false;
469
470 /**
471 * Should HTTP client reuse connections (in other words, pool connections) or not?
472 *
473 * @since 1.9.8
474 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
475 * @configurationType {@link java.lang.Boolean}
476 * @configurationDefaultValue {@link #DEFAULT_HTTP_REUSE_CONNECTIONS}
477 * @configurationRepoIdSuffix Yes
478 */
479 public static final String HTTP_REUSE_CONNECTIONS = PREFIX_TRANSPORT_HTTP + "reuseConnections";
480
481 /**
482 * The default value to use if {@link #HTTP_REUSE_CONNECTIONS} isn't set (true).
483 *
484 * @since 1.9.8
485 */
486 public static final boolean DEFAULT_HTTP_REUSE_CONNECTIONS = true;
487
488 /**
489 * Total time to live in seconds for an HTTP connection, after that time, the connection will be dropped
490 * (no matter for how long it was idle).
491 *
492 * @since 1.9.8
493 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
494 * @configurationType {@link java.lang.Integer}
495 * @configurationDefaultValue {@link #DEFAULT_HTTP_CONNECTION_MAX_TTL}
496 * @configurationRepoIdSuffix Yes
497 */
498 public static final String HTTP_CONNECTION_MAX_TTL = PREFIX_TRANSPORT_HTTP + "connectionMaxTtl";
499
500 /**
501 * The default value to use if {@link #HTTP_CONNECTION_MAX_TTL} isn't set (300 seconds).
502 *
503 * @since 1.9.8
504 */
505 public static final int DEFAULT_HTTP_CONNECTION_MAX_TTL = 300;
506
507 /**
508 * The maximum concurrent connections per route HTTP client is allowed to use.
509 *
510 * @since 1.9.8
511 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
512 * @configurationType {@link java.lang.Integer}
513 * @configurationDefaultValue {@link #DEFAULT_HTTP_MAX_CONNECTIONS_PER_ROUTE}
514 * @configurationRepoIdSuffix Yes
515 */
516 public static final String HTTP_MAX_CONNECTIONS_PER_ROUTE = PREFIX_TRANSPORT_HTTP + "maxConnectionsPerRoute";
517
518 /**
519 * The default value to use if {@link #HTTP_MAX_CONNECTIONS_PER_ROUTE} isn't set (50 connections).
520 *
521 * @since 1.9.8
522 */
523 public static final int DEFAULT_HTTP_MAX_CONNECTIONS_PER_ROUTE = 50;
524
525 /**
526 * The local address (interface) to use with HTTP transport. Not all transport supports this option.
527 *
528 * @since 2.0.0
529 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
530 * @configurationType {@link java.lang.String}
531 * @configurationRepoIdSuffix Yes
532 */
533 public static final String HTTP_LOCAL_ADDRESS = PREFIX_TRANSPORT_HTTP + "localAddress";
534
535 /**
536 * Boolean flag should the HTTP transport support WebDAV remote. Not all transport support this option.
537 *
538 * @since 2.0.0 (moved out from maven-resolver-transport-http).
539 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
540 * @configurationType {@link java.lang.Boolean}
541 * @configurationDefaultValue {@link #DEFAULT_HTTP_SUPPORT_WEBDAV}
542 * @configurationRepoIdSuffix Yes
543 */
544 public static final String HTTP_SUPPORT_WEBDAV = PREFIX_TRANSPORT_HTTP + "supportWebDav";
545
546 /**
547 * Default value to use if {@link #HTTP_SUPPORT_WEBDAV} is not set: {@code false}.
548 *
549 * @since 2.0.0
550 */
551 public static final boolean DEFAULT_HTTP_SUPPORT_WEBDAV = false;
552
553 /**
554 * Boolean flag should the HTTP transport use preemptive-auth for PUT requests. Not all transport support this
555 * option.
556 *
557 * @since 2.0.0 (moved out from maven-resolver-transport-http).
558 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
559 * @configurationType {@link java.lang.Boolean}
560 * @configurationDefaultValue {@link #DEFAULT_HTTP_PREEMPTIVE_PUT_AUTH}
561 * @configurationRepoIdSuffix Yes
562 */
563 public static final String HTTP_PREEMPTIVE_PUT_AUTH = PREFIX_TRANSPORT_HTTP + "preemptivePutAuth";
564
565 /**
566 * Default value if {@link #HTTP_PREEMPTIVE_PUT_AUTH} is not set: {@code true}.
567 *
568 * @since 2.0.0
569 */
570 public static final boolean DEFAULT_HTTP_PREEMPTIVE_PUT_AUTH = true;
571
572 /**
573 * Boolean flag should the HTTP transport use expect-continue handshake for PUT requests. Not all transport support
574 * this option. This option may be needed for some broken HTTP servers. Default value corresponds to given
575 * transport default one (resolver does not override those), but if configuration IS given, it will replace
576 * given transport own default value.
577 *
578 * @since 1.9.17
579 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
580 * @configurationType {@link java.lang.Boolean}
581 * @configurationRepoIdSuffix Yes
582 */
583 public static final String HTTP_EXPECT_CONTINUE = PREFIX_TRANSPORT_HTTP + "expectContinue";
584
585 /**
586 * The mode that sets HTTPS transport "security mode": to ignore any SSL errors (certificate validity checks,
587 * hostname verification). The default value is {@link #HTTPS_SECURITY_MODE_DEFAULT}.
588 *
589 * @see #HTTPS_SECURITY_MODE_DEFAULT
590 * @see #HTTPS_SECURITY_MODE_INSECURE
591 * @since 1.9.6
592 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
593 * @configurationType {@link java.lang.String}
594 * @configurationDefaultValue {@link #HTTPS_SECURITY_MODE_DEFAULT}
595 * @configurationRepoIdSuffix Yes
596 */
597 public static final String HTTPS_SECURITY_MODE = PREFIX_TRANSPORT_HTTPS + "securityMode";
598
599 /**
600 * The default HTTPS security mode.
601 *
602 * @since 1.9.6
603 */
604 public static final String HTTPS_SECURITY_MODE_DEFAULT = "default";
605
606 /**
607 * The insecure HTTPS security mode (certificate validation, hostname verification are all ignored).
608 *
609 * @since 1.9.6
610 */
611 public static final String HTTPS_SECURITY_MODE_INSECURE = "insecure";
612
613 /**
614 * HTTP protocol version to use for the HTTP transport.
615 *
616 * @since 2.0.21
617 */
618 public enum HttpVersion {
619 /**
620 * The default HTTP version supported by the respective transporter (the most recent stable one, usually HTTP/2)
621 */
622 DEFAULT,
623 /** HTTP/1.1. */
624 HTTP_1_1,
625 /** HTTP/2. */
626 HTTP_2,
627 /** HTTP/3. */
628 HTTP_3,
629 /**
630 * The maximum HTTP version supported by the respective transporter (may be unstable).
631 */
632 MAXIMUM;
633 }
634
635 /**
636 * The maximum and preferred HTTP version. Some transporters transparently fall back to lower versions if remote server does not
637 * support the requested version, while other may just simply fail the request.
638 * Value must be a {@link HttpVersion} enum value or its String representation.
639 *
640 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
641 * @configurationType {@link ConfigurationProperties.HttpVersion}
642 * @configurationDefaultValue {@link #DEFAULT_HTTP_VERSION}
643 * @configurationRepoIdSuffix Yes
644 * @since 2.0.21
645 */
646 public static final String HTTP_VERSION = PREFIX_TRANSPORT_HTTP + "version";
647
648 /**
649 * Default value if {@link #HTTP_VERSION} is not set.
650 *
651 * @since 2.0.21
652 */
653 public static final HttpVersion DEFAULT_HTTP_VERSION = HttpVersion.DEFAULT;
654
655 /**
656 * A flag indicating which visitor should be used to "flatten" the dependency graph into list. In Maven 4
657 * the default is new "levelOrder", while Maven 3 used "preOrder". This property accepts values
658 * "preOrder", "postOrder" and "levelOrder".
659 *
660 * @see #REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_PREORDER
661 * @see #REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_POSTORDER
662 * @see #REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_LEVELORDER
663 * @since 2.0.0
664 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
665 * @configurationType {@link java.lang.String}
666 * @configurationDefaultValue {@link #DEFAULT_REPOSITORY_SYSTEM_DEPENDENCY_VISITOR}
667 * @configurationRepoIdSuffix No
668 */
669 public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR = PREFIX_SYSTEM + "dependencyVisitor";
670
671 /**
672 * The visitor strategy "preOrder".
673 *
674 * @since 2.0.0
675 */
676 public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_PREORDER = "preOrder";
677
678 /**
679 * The visitor strategy "postOrder". This was the only one supported in Resolver 1.x and is hence the
680 * default as well.
681 *
682 * @since 2.0.0
683 */
684 public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_POSTORDER = "postOrder";
685
686 /**
687 * The visitor strategy "levelOrder".
688 *
689 * @since 2.0.0
690 */
691 public static final String REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_LEVELORDER = "levelOrder";
692
693 /**
694 * The default visitor strategy.
695 *
696 * @since 2.0.12
697 */
698 public static final String DEFAULT_REPOSITORY_SYSTEM_DEPENDENCY_VISITOR =
699 REPOSITORY_SYSTEM_DEPENDENCY_VISITOR_LEVELORDER;
700
701 /**
702 * <b>Experimental:</b> Configuration for system-wide "repository key" function.
703 * Accepted and recommended values: "nid" (default), "nid_hurl" and "ngurk", while "simple" is Maven 3 legacy,
704 * technically equivalent to "nid". For complete description see enum
705 * {@code org.eclipse.aether.util.repository.RepositoryIdHelper.RepositoryKeyType} in utils. <em>Warning:</em>
706 * repository key function affects Resolver fundamentally and may have unexpected results! Only change this
707 * if you know what you are doing!
708 *
709 * @since 2.0.14
710 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
711 * @configurationType {@link java.lang.String}
712 * @configurationDefaultValue {@link #DEFAULT_REPOSITORY_SYSTEM_REPOSITORY_KEY_FUNCTION}
713 */
714 public static final String REPOSITORY_SYSTEM_REPOSITORY_KEY_FUNCTION = PREFIX_SYSTEM + "repositoryKeyFunction";
715
716 /**
717 * Default value if {@link #REPOSITORY_SYSTEM_REPOSITORY_KEY_FUNCTION} is not set.
718 *
719 * @since 2.0.14
720 */
721 public static final String DEFAULT_REPOSITORY_SYSTEM_REPOSITORY_KEY_FUNCTION = "nid";
722
723 /**
724 * Repository key function used for the provenance tracking entries that this local repository manager
725 * writes and reads. With an ID-only key, a repository declared in an untrusted (for example, transitively
726 * resolved) POM under the same ID as a trusted repository would be tracked as the same origin, potentially
727 * poisoning a shared local repository. The default is therefore the URL-qualified {@code "nid_hurl"}
728 * function.
729 * <p>
730 * This function is scoped to tracking entries, path composition, and split local repository prefixes.
731 * Repository identity used for aggregation and mirror merging continues to follow the system-wide key
732 * function ({@link #REPOSITORY_SYSTEM_REPOSITORY_KEY_FUNCTION}), whose default is unchanged.
733 * If the system-wide function is explicitly configured, tracking follows it (setting it to {@code "nid"}
734 * restores the legacy ID-only behaviour); this property, when set, overrides both.
735 * <p>
736 * Tracking entries written under a different function than the active one never match a lookup and never
737 * enable the untracked-file fallback: affected artifacts are treated as locally unavailable and
738 * re-fetched (with checksum validation) once.
739 *
740 * @since 2.0.23
741 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
742 * @configurationType {@link java.lang.String}
743 * @configurationDefaultValue {@link #DEFAULT_REPOSITORY_TRACKING_REPOSITORY_KEY_FUNCTION}
744 */
745 public static final String REPOSITORY_TRACKING_REPOSITORY_KEY_FUNCTION =
746 PREFIX_SYSTEM + "trackingRepositoryKeyFunction";
747
748 /**
749 * Default value if {@link #REPOSITORY_TRACKING_REPOSITORY_KEY_FUNCTION} is not set.
750 *
751 * @since 2.0.23
752 */
753 public static final String DEFAULT_REPOSITORY_TRACKING_REPOSITORY_KEY_FUNCTION = "nid_hurl";
754
755 /**
756 * A flag indicating whether version scheme cache statistics should be printed on JVM shutdown.
757 * This is useful for analyzing cache performance and effectiveness in development and testing scenarios.
758 *
759 * @since 2.0.10
760 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
761 * @configurationType {@link java.lang.Boolean}
762 * @configurationDefaultValue {@link #DEFAULT_VERSION_SCHEME_CACHE_DEBUG}
763 * @configurationRepoIdSuffix No
764 */
765 public static final String VERSION_SCHEME_CACHE_DEBUG = PREFIX_UTIL + "versionScheme.cacheDebug";
766
767 /**
768 * The default value for version scheme cache debug if {@link #VERSION_SCHEME_CACHE_DEBUG} isn't set.
769 *
770 * @since 2.0.10
771 */
772 public static final boolean DEFAULT_VERSION_SCHEME_CACHE_DEBUG = false;
773
774 /**
775 * Boolean flag should the HTTP transport send HTTP <pre>Accept</pre> header to signal that it supports RFC 9457
776 * error messages. Some servers have issues with handling the HTTP Accept headers. Known servers not supporting it
777 * is for example Staging REST endpoint of Sonatype Nexus 2.
778 * This configuration is only about sending (or not sending) HTTP header with content of
779 * <pre>Accept: application/problem+json</pre> that may be required by some servers to trigger error reporting
780 * using RFC 9457.
781 *
782 * @since 2.0.19
783 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
784 * @configurationType {@link java.lang.Boolean}
785 * @configurationDefaultValue {@link #DEFAULT_HTTP_SEND_RFC9457_ACCEPT}
786 * @configurationRepoIdSuffix Yes
787 */
788 public static final String HTTP_SEND_RFC9457_ACCEPT = PREFIX_TRANSPORT_HTTP + "sendRfc9457Accept";
789
790 /**
791 * Default value to use if {@link #HTTP_SEND_RFC9457_ACCEPT} is not set: {@code true}.
792 *
793 * @since 2.0.19
794 */
795 public static final boolean DEFAULT_HTTP_SEND_RFC9457_ACCEPT = true;
796
797 /**
798 * A flag indicating whether artifact installation should use hard links instead of copying files. When enabled,
799 * the installer creates a hard link from the source artifact (build output) to its destination in the local
800 * repository, avoiding a full file copy and saving disk I/O and space for large JARs.
801 * <p>
802 * Hard links require that the source and target paths reside on the <strong>same filesystem volume</strong>.
803 * When they do not (e.g. {@code ~/.m2} is on a separate mount, or a custom in-memory filesystem such as
804 * Jimfs is used for testing), the JVM throws {@link java.lang.UnsupportedOperationException},
805 * {@link IllegalArgumentException} (provider mismatch), or {@link java.io.IOException} (cross-device),
806 * and the installer automatically falls back to a regular file copy, so the build is never broken.
807 * <p>
808 * <strong>Note:</strong> hard links share an inode. Any tool that overwrites the build output file
809 * <em>in-place</em> (rather than via an atomic rename) would silently corrupt the cached artifact.
810 * Standard Maven build tooling always replaces output via rename, so this is generally safe. Set this
811 * property to {@code false} if your environment performs in-place writes to build output files.
812 *
813 * @since 2.0.25
814 * @configurationSource {@link RepositorySystemSession#getConfigProperties()}
815 * @configurationType {@link java.lang.Boolean}
816 * @configurationDefaultValue {@link #DEFAULT_INSTALLER_HARD_LINK}
817 * @configurationRepoIdSuffix No
818 */
819 public static final String INSTALLER_HARD_LINK = PREFIX_INSTALLER + "hardLink";
820
821 /**
822 * The default value for {@link #INSTALLER_HARD_LINK}: {@code true}.
823 *
824 * @since 2.0.25
825 */
826 public static final boolean DEFAULT_INSTALLER_HARD_LINK = true;
827
828 private ConfigurationProperties() {
829 // hide constructor
830 }
831 }