= Configure Maven

== Maven Settings

The Maven settings, used by the Camel K operator, can be provided in a ConfigMap or a Secret.

The `kubectl` CLI provides convenient commands, to create a ConfigMap or a Secret from a file, e.g.:

[source,console]
----
$ kubectl create configmap maven-settings --from-file=settings.xml
----

The created ConfigMap or Secret can then be referenced in the IntegrationPlatform resource, from the `spec.build.maven.settings` field, e.g.:

[source,yaml]
----
apiVersion: camel.apache.org/v1
kind: IntegrationPlatform
metadata:
  name: camel-k
spec:
  build:
    maven:
      settings:
        configMapKeyRef:
          key: settings.xml
          name: maven-settings
----

The IntegrationPlatform resource can be edited directly, to reference the ConfigMap or the Secret that contains the Maven settings, e.g.:

[source,console]
----
$ kubectl edit ip camel-k
----

Alternatively, the Kamel CLI provides the `--maven-settings` option, with the `install` command, that can be used to configure the Maven settings at installation time, e.g.:

[source,console]
----
$ kamel install --maven-settings=configmap|secret:name[/key]
----

In case you only want to configure remote repositories, you can use the `--maven-repository` option, that automatically generates a `settings.xml` file and relieves from creating a ConfigMap or Secret, e.g.:

[source,console]
----
$ kamel install --maven-repository <repository_url>
----

NOTE: Check the <<ca-certificates>> section, if these remote repositories require custom CA certificates.

Extra attributes can be appended to the `repository_url`, using the `@` separator.
The following attributes are supported:

.Maven Repository Attributes
[cols="1m,1,2"]
|===
|Name |Type |Description

| @id
| string
| Sets the repository `id`

| @name
| string
| Sets the repository `name`

| @snapshots
| flag
| Turns `snapshots.enabled` to `true`

| @noreleases
| flag
| Turns `snapshots.enabled` to `false`

| @checksumpolicy
| string
| Sets the repository `checksumPolicy`

| @mirrorOf
| string
| Declares the repository as a mirror of the repositories with matching ids

|===

For example, running the following command:

[source,console]
----
$ kamel install --maven-repository https://repository.apache.org/content/groups/snapshots-group@id=apache@snapshots@noreleases
----

Results in generating the following `settings.xml` file:

[source,xml]
----
<repositories>
  <repository>
    <id>apache</id>
    <url>http://repository.apache.org/content/groups/snapshots-group</url>
    <snapshots>
      <enabled>true</enabled>
    </snapshots>
    <releases>
      <enabled>false</enabled>
    </releases>
  </repository>
</repositories>
----

WARNING: The `--maven-settings` and `--maven-repository` options are mutually exclusive.

You can find more information in the https://maven.apache.org/guides/introduction/introduction-to-repositories.html[Introduction to Repositories] from the Maven documentation.

[[ca-certificates]]
== CA Certificates

The CA certificates, used by the Maven commands to connect to the remote Maven repositories, can be provided in a Secret.

The `kubectl` CLI provides a convenient command, to create a Secret from a file, e.g.:

[source,console]
----
$ kubectl create secret generic maven-ca-certs --from-file=ca.crt
----

The Secret can contain X.509 certificates, and PKCS#7 formatted certificate chains.
A JKS formatted keystore is automatically created to store the CA certificate(s), and configured to be used as a trusted certificate(s) by the Maven commands.
The root CA certificates are also imported into the created keystore.

The created Secret can then be referenced in the IntegrationPlatform resource, from the `spec.build.maven.caSecret` field, e.g.:
[source,yaml]
----
apiVersion: camel.apache.org/v1
kind: IntegrationPlatform
metadata:
  name: camel-k
spec:
  build:
    maven:
      caSecret:
        key: tls.crt
        name: tls-secret
----

Alternatively, the Kamel CLI provides the `--maven-ca-secret` option, with the `install` command, that can be used to configure the Maven CA Secret at installation time, e.g.:

[source,console]
----
$ kamel install --maven-ca-secret <secret_name>/<secret_key>
----
