//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

=== Maven wrapper service

When you install the Apache Karaf Cave Server, it starts a Maven service wrapper.

It means that all artifacts are available using a Maven structure (groupId/artifactId/version/artifactId-version[-classifier].type).

It allows you to use your Cave repository directly using mvn URL in Karaf, and using Maven itself: Cave acts as a
complete Maven repository.

For instance, we have the following Cave repository:

----
karaf@root()> cave:repositories
Name          | Location
----------------------------------------------------------------
my-repository | /opt/apache-karaf-4.0.0/data/cave/my-repository
----

You can access the corresponding Maven repository using:

----
http://localhost:8181/cave/maven
----

[NOTE]
====
The port 8181 is the default one of the Apache Karaf HTTP service.
====

You can see that the URL follows the format:

----
http://[cave_server_hostname]:[http_service_port]/cave/maven/
----

For instance, if a Cave repository contains the commons-lang 2.6 artifact, it's accessible using:

----
http://localhost:8181/cave/maven/commons-lang/commons-lang/2.6/commons-lang-2.6.jar
----
