diff --git a/maven-resolver-named-locks-redisson/src/site/markdown/index.md.vm b/maven-resolver-named-locks-redisson/src/site/markdown/index.md.vm
index 951d4e5a4..2cb6accbc 100644
--- a/maven-resolver-named-locks-redisson/src/site/markdown/index.md.vm
+++ b/maven-resolver-named-locks-redisson/src/site/markdown/index.md.vm
@@ -46,27 +46,32 @@ To use this implementation within your project, depending on how you integrate,
${esc.hash}${esc.hash} Installation/Testing
+#set( $jacksonVersion = "2.13.3" )
+#set( $jbossMarshallingVersion = "2.0.11.Final" )
+#set( $nettyVersion = "4.1.79.Final" )
+#set( $snakeyamlVersion = "1.30" )
+
- Create the directory `${maven.home}/lib/ext/redisson/`.
- Modify `${maven.home}/bin/m2.conf` by adding `load ${maven.home}/lib/ext/redisson/*.jar`
right after the `${maven.conf}/logging` line.
- Copy the following dependencies from Maven Central to `${maven.home}/lib/ext/redisson/`:
├── ${project.artifactId}-${project.version}.jar
- ├── jackson-annotations-2.12.1.jar
- ├── jackson-core-2.12.1.jar
- ├── jackson-databind-2.12.1.jar
- ├── jackson-dataformat-yaml-2.12.1.jar
- ├── jboss-marshalling-2.0.11.Final.jar
- ├── jboss-marshalling-river-2.0.11.Final.jar
- ├── netty-buffer-4.1.65.Final.jar
- ├── netty-codec-4.1.65.Final.jar
- ├── netty-codec-dns-4.1.65.Final.jar
- ├── netty-common-4.1.65.Final.jar
- ├── netty-handler-4.1.65.Final.jar
- ├── netty-resolver-4.1.65.Final.jar
- ├── netty-resolver-dns-4.1.65.Final.jar
- ├── netty-transport-4.1.65.Final.jar
- ├── redisson-3.15.6.jar
- └── snakeyaml-1.27.jar
+ ├── redisson-${redissonVersion}.jar
+ ├── jackson-annotations-${jacksonVersion}.jar
+ ├── jackson-core-${jacksonVersion}.jar
+ ├── jackson-databind-${jacksonVersion}.jar
+ ├── jackson-dataformat-yaml-${jacksonVersion}.jar
+ ├── jboss-marshalling-${jbossMarshallingVersion}.jar
+ ├── jboss-marshalling-river-${jbossMarshallingVersion}.jar
+ ├── netty-buffer-${nettyVersion}.jar
+ ├── netty-codec-${nettyVersion}.jar
+ ├── netty-codec-dns-${nettyVersion}.jar
+ ├── netty-common-${nettyVersion}.jar
+ ├── netty-handler-${nettyVersion}.jar
+ ├── netty-resolver-${nettyVersion}.jar
+ ├── netty-resolver-dns-${nettyVersion}.jar
+ ├── netty-transport-${nettyVersion}.jar
+ └── snakeyaml-${snakeyamlVersion}.jar
- Start your Redis instance on `localhost` or configure a remote instance with `${maven.conf}/maven-resolver-redisson.yaml`.
- Now start a multithreaded Maven build on your project.
diff --git a/maven-resolver-named-locks/pom.xml b/maven-resolver-named-locks/pom.xml
index 4515e5093..9d745dbed 100644
--- a/maven-resolver-named-locks/pom.xml
+++ b/maven-resolver-named-locks/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-named-locks
diff --git a/maven-resolver-named-locks/src/site/markdown/index.md.vm b/maven-resolver-named-locks/src/site/markdown/index.md.vm
index 0d8d40166..24ed4760b 100644
--- a/maven-resolver-named-locks/src/site/markdown/index.md.vm
+++ b/maven-resolver-named-locks/src/site/markdown/index.md.vm
@@ -23,28 +23,41 @@ Named locks are essentially locks that are assigned to some given (opaque) ID. I
resources that each can have unique ID assigned (i.e., file with an absolute path, some entities with unique ID),
then you can use named locks to make sure they are being protected from concurrent read and write actions.
-Named locks provide support classes for implementations, and provide out of the box seven named lock implementations and three name mappers.
+Named locks provide support classes for implementations, and provide out of the box several lock and name mapper implementations.
-Out of the box, "local" (local to JVM) named lock implementations are the following:
+Following implementations are "local" (local to JVM) named lock implementations:
- `rwlock-local` implemented in `org.eclipse.aether.named.providers.LocalReadWriteLockNamedLockFactory` that uses
JVM `java.util.concurrent.locks.ReentrantReadWriteLock`.
- `semaphore-local` implemented in `org.eclipse.aether.named.providers.LocalSemaphoreNamedLockFactory` that uses
JVM `java.util.concurrent.Semaphore`.
+- `noop` implemented in `org.eclipse.aether.named.providers.NoopNamedLockFactory` that uses no locking.
+
+Note about "local" locks: they are in-JVM, in a way, they properly coordinate in case of multithreaded access from
+same JVM, but do not cover accesses across multiple processes and/or multiple hosts access.
+In other words, local named locks are only suited within one JVM with a multithreaded access.
+
+Following named lock implementations use underlying file system advisory file locking:
+
- `file-lock` implemented in `org.eclipse.aether.named.providers.FileLockNamedLockFactory` that uses
JVM `java.nio.channels.FileLock`.
-- `noop` implemented in `org.eclipse.aether.named.providers.NoopNamedLockFactory` that uses no locking.
-Out of the box, "distributed" named lock implementations are the following (separate modules which require additional dependencies):
+The `file-lock` implementation uses file system advisory file locking, hence, concurrently running Maven processes
+set up to use `file-lock` implementation can safely share one local repository. This is almost certain on
+local file systems across all operating systems. In case of NFS mounts, file advisory locking MAY work if NFSv4+
+used with complete setup (with all the necessary services like `RPC` and `portmapper` needed to implement NFS advisory
+file locking, check your NFS and/or OS manuals for details). In short: if your (local or remote) FS correctly support
+and implements advisory locking, it should work. Local FS usually does, while with NFS your mileage may vary.
+
+Finally, "distributed" named lock implementations are the following (separate modules which require additional dependencies and remote services):
- `rwlock-redisson` implemented in `org.eclipse.aether.named.redisson.RedissonReadWriteLockNamedLockFactory`.
- `semaphore-redisson` implemented in `org.eclipse.aether.named.redisson.RedissonSemaphoreNamedLockFactory`.
- `semaphore-hazelcast-client` implemented in `org.eclipse.aether.named.hazelcast.HazelcastClientCPSemaphoreNamedLockFactory`.
- `semaphore-hazelcast` implemented in `org.eclipse.aether.named.hazelcast.HazelcastCPSemaphoreNamedLockFactory`.
-Local named locks are only suited within one JVM with a multithreaded build.
-Sharing a local repository between multiple Maven processes (i.e., on a busy CI server) requires a distributed named lock!
-
+Sharing a local repository between multiple hosts (i.e., on a busy CI server) may be best done with one of distributed named lock,
+if NFS locking is not working for you.
The aforementioned (opaque) IDs need to be mapped from artifacts and metadata.
@@ -54,3 +67,5 @@ Out of the box, name mapper implementations are the following:
- `gav` implemented in `org.eclipse.aether.internal.impl.synccontext.named.GAVNameMapper`.
- `discriminating` implemented in `org.eclipse.aether.internal.impl.synccontext.named.DiscriminatingNameMapper`.
- `file-gav` implemented in `org.eclipse.aether.internal.impl.synccontext.named.FileGAVNameMapper`.
+
+Note: the `file-gav` name mapper MUST be used with `file-lock` named locking, no other mapper will work with it.
diff --git a/maven-resolver-spi/pom.xml b/maven-resolver-spi/pom.xml
index 702644d50..2aaa49a51 100644
--- a/maven-resolver-spi/pom.xml
+++ b/maven-resolver-spi/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-spi
diff --git a/maven-resolver-test-util/pom.xml b/maven-resolver-test-util/pom.xml
index 1b38528b5..67e8eadce 100644
--- a/maven-resolver-test-util/pom.xml
+++ b/maven-resolver-test-util/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-test-util
diff --git a/maven-resolver-transport-classpath/pom.xml b/maven-resolver-transport-classpath/pom.xml
index f91e490cd..2f0e403a4 100644
--- a/maven-resolver-transport-classpath/pom.xml
+++ b/maven-resolver-transport-classpath/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-transport-classpath
diff --git a/maven-resolver-transport-file/pom.xml b/maven-resolver-transport-file/pom.xml
index 8a28dd736..f93357e66 100644
--- a/maven-resolver-transport-file/pom.xml
+++ b/maven-resolver-transport-file/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-transport-file
diff --git a/maven-resolver-transport-http/pom.xml b/maven-resolver-transport-http/pom.xml
index a0e11ba75..697eb7bae 100644
--- a/maven-resolver-transport-http/pom.xml
+++ b/maven-resolver-transport-http/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-transport-http
diff --git a/maven-resolver-transport-wagon/pom.xml b/maven-resolver-transport-wagon/pom.xml
index d2479bf64..4a597c1d9 100644
--- a/maven-resolver-transport-wagon/pom.xml
+++ b/maven-resolver-transport-wagon/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-transport-wagon
diff --git a/maven-resolver-util/pom.xml b/maven-resolver-util/pom.xml
index a3d0c64e0..7da1b3d16 100644
--- a/maven-resolver-util/pom.xml
+++ b/maven-resolver-util/pom.xml
@@ -25,7 +25,7 @@
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
maven-resolver-util
diff --git a/pom.xml b/pom.xml
index 27f530d71..c32785853 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,13 +25,13 @@
org.apache.maven
maven-parent
- 36
+ 37
org.apache.maven.resolver
maven-resolver
- 1.8.2-SNAPSHOT
+ 1.8.3-SNAPSHOT
pom
Maven Artifact Resolver
@@ -59,7 +59,7 @@
Jenkins
- https://ci-builds.apache.org/job/Maven/job/maven-box/job/maven-resolver/
+ https://ci-maven.apache.org/job/Maven/job/maven-box/job/maven-resolver/
@@ -79,7 +79,7 @@
30.1-jre
1.0.1
1.7.36
- 2022-06-10T15:27:07Z
+ 2022-07-25T16:26:16Z
@@ -381,7 +381,6 @@
org.apache.maven.plugins
maven-surefire-plugin
- 3.0.0-M6
-Xmx128m
${surefire.redirectTestOutputToFile}
@@ -393,7 +392,6 @@
org.apache.maven.plugins
maven-failsafe-plugin
- 3.0.0-M6
false
-Xmx128m
@@ -433,14 +431,14 @@
src/test/resources/**/*.ini
src/test/resources/**/*.txt
src/test/resources/ssl/*-store
- .travis.yml
+ .gitattributes
biz.aQute.bnd
bnd-maven-plugin
- 6.2.0
+ 6.3.1
bnd-process
diff --git a/src/site/markdown/local-repository.md b/src/site/markdown/local-repository.md
index 9ee50e2d0..3554c3962 100644
--- a/src/site/markdown/local-repository.md
+++ b/src/site/markdown/local-repository.md
@@ -25,30 +25,16 @@ remote, but also to store the artifacts locally installed (locally built and
installed, to be more precise). Both of these artifacts were stored in bulk
in the local repository.
+## Implementations
+
Local repository implementations implement the `LocalRepositoryManager` (LRM)
interface, and Resolver out of the box provides two implementations for it:
-"simple" and "enhanced".
-
-## Simple LRM
+"enhanced" used at runtime and "simple" meant to be used in tests and alike
+scenarios (is not meant for production use).
-Simple is a fully functional LRM implementation, but is used
-mainly in tests, it is not recommended in production environments.
-
-To manually instantiate a simple LRM, one needs to invoke following code:
+### Enhanced LRM
-```java
-LocalRepositoryManager simple = new SimpleLocalRepositoryManagerFactory()
- .newInstance( session, new LocalRepository( baseDir ) );
-```
-
-Note: This code snippet above instantiates a component, that is not
-recommended way to use it, as it should be rather injected whenever possible.
-This example above is merely a showcase how to obtain LRM implementation
-in unit tests.
-
-## Enhanced LRM
-
-Enhanced LRM on the other hand is enhanced with several extra
+Enhanced LRM is enhanced with several extra
features, one most notable is scoping cached content by its origin and context:
if you downloaded an artifact A1 from repository R1
and later initiate build that requires same artifact A1, but repository R1
@@ -58,7 +44,7 @@ Those two, originating from two different repositories may not be the same thing
This is meant to protect users from "bad practice" (artifact coordinates are
unique in ideal world).
-### Split Local Repository
+#### Split Local Repository
Latest addition to the enhanced LRM is *split* feature. By default, split
feature is **not enabled**, enhanced LRM behaves as it behaved in all
@@ -75,7 +61,7 @@ The split feature is implemented by the `LocalPathPrefixComposer` interface,
that adds different "prefixes" for the locally stored artifacts, based on
their context.
-#### Note About Release And Snapshot Differentiation
+##### Note About Release And Snapshot Differentiation
The prefix composer is able to differentiate between release and snapshot
versioned artifacts, and this is clear-cut: Maven Artifacts are either
@@ -99,7 +85,7 @@ The GAV level metadata gets differentiated based on version it carries, so
they may end up in releases or snapshots, depending on their value of
`metadata/version` field.
-#### Use Cases
+##### Use Cases
Most direct use case is simpler local repository eviction. One can delete all
locally built artifacts without deleting the cached ones, hence, no
@@ -139,7 +125,7 @@ $ mvn ... -Daether.enhancedLocalRepository.split \
For complete reference of enhanced LRM configuration possibilities, refer to
[configuration page](configuration.html).
-#### Split Repository Considerations
+##### Split Repository Considerations
**Word of warning**: on every change of "split" parameters, user must be aware
of the consequences. For example, if one change all aspects of split
@@ -149,7 +135,7 @@ is unchanged! Simply put, as all prefixes will be "new", the composed paths will
point to potentially non-existing locations, hence, resolver will consider
it as a "new" local repository in every aspect.
-#### Implementing Custom Split Strategy
+##### Implementing Custom Split Strategy
To implement custom split strategy, one needs to create a component of
type `LocalPathPrefixComposerFactory` and override the default component
@@ -160,3 +146,37 @@ class that provides all the defaults.
The factory should create a stateless instance of a composer
configured from passed in session, that will be used with the enhanced LRM
throughout the session.
+
+### Simple LRM
+
+Simple is a fully functional LRM implementation, but is used
+mainly in tests, it is not recommended in production environments.
+
+To manually instantiate a simple LRM, one needs to invoke following code:
+
+```java
+LocalRepositoryManager simple = new SimpleLocalRepositoryManagerFactory()
+ .newInstance( session, new LocalRepository( baseDir ) );
+```
+
+Note: This code snippet above instantiates a component, that is not
+recommended way to use it, as it should be rather injected whenever possible.
+This example above is merely a showcase how to obtain LRM implementation
+in unit tests.
+
+## Shared Access to Local Repository
+
+In case of shared (multi-threaded, multi-process or even multi host) access
+to local repository, coordination is a must, as local repository is hosted
+on file system, and each thread may read and write concurrently into it,
+causing other threads or processes to get incomplete or partially written data.
+
+Hence, since Resolver 1.7.x version, there is a pluggable API called "Named Locks"
+available, providing out of the box lock implementations for cases like:
+
+* multi-threaded, in JVM locking (the default)
+* multi-process locking using file system advisory locking
+* multi-host locking using Hazelcast or Redisson (needs Hazelcast or Redisson cluster)
+
+For details see [Named Locks module](maven-resolver-named-locks/).
+
diff --git a/src/site/markdown/maven-3.8.x.md b/src/site/markdown/maven-3.8.x.md
index aae9ada80..1b9286967 100644
--- a/src/site/markdown/maven-3.8.x.md
+++ b/src/site/markdown/maven-3.8.x.md
@@ -23,5 +23,7 @@ factory has been implemented. Both are not compatible with Maven 3.8.x anymore w
Java 7 to run. Maven 3.8.x will continue to use version 1.6.x which you will find
[here](/resolver-archives/resolver-1.6.3/).
This also means that you cannot make use of the features provided by version 1.7.0 and later.
-If you require the changes in this version, but must use Maven 3.8.x, you can build an adapted version
-of Maven from the branch [`maven-3.8.x-maven-resolver-1.7.x`](https://github.com/apache/maven/tree/maven-3.8.x-resolver-1.7.x) and use as if you would use Maven 4.
+If you require the changes from this version, but must use Maven 3.8.x, you can build yourself an adapted version
+of Maven from the branch [`maven-3.8.x-resolver-1.8.x`](https://github.com/apache/maven/tree/maven-3.8.x-resolver-1.8.x)
+with Java 8 requirement or use signed binaries and source from the [dev dist area](https://dist.apache.org/repos/dist/dev/maven/maven-3/3.8.x-resolver-1.8.x/)
+and use it as if you would use Maven 3.9.x.