= Camel K Modeline

Integration files can contain modeline hooks that allow to customize the way integrations are executed via command line.
For example:

.Hello.java
[source,java]
----
// camel-k: dependency=mvn:org.my:application:1.0 // <1>

import org.apache.camel.builder.RouteBuilder;

public class Hello extends RouteBuilder {
  @Override
  public void configure() throws Exception {

      from("timer:java?period=1000")
        .bean(org.my.BusinessLogic) // <2>
        .log("${body}");

  }
}
----
<1> Modeline import of Maven library
<2> Usage of a business logic class from the external library

When the integration code above is executed using the `kamel run` CLI command, the modeline options declared in the file are appended to
the list of arguments that are passed to the command.

The `kamel` CLI will alert you, printing the full command in the shell:

[source,console]
----
$ kamel run Hello.java
Modeline options have been loaded from source files
Full command: kamel run Hello.java --dependency mvn:org.my:application:1.0
----

Multiple options can be specified for an integration.
For example, the following modeline options enables 3scale and limits the integration container memory:

.ThreeScaleRest.java
[source,java]
----
// camel-k: trait=3scale.enabled=true trait=container.limit-memory=256Mi // <1>

import org.apache.camel.builder.RouteBuilder;

public class ThreeScaleRest extends RouteBuilder {

  @Override
  public void configure() throws Exception {
      rest().get("/")
        .route()
        .setBody().constant("Hello");
  }
}
----
<1> Enables both the _container_ and _3scale_ traits, to expose the route via 3scale and limit the container memory.

All options that are available for the `kamel run` command can be specified as modeline options.
The following is a partial list of useful options:

.Useful Modeline Options
[cols="1m,2v"]
|===
|Option | Description

|build-property
|Add a build time property or properties file (syntax: _[my-key=my-value\|file:/path/to/my-conf.properties]_

|config
|Add a runtime configuration from a Configmap, Secret or file (syntax: _[configmap\|secret\|file]:name[/key]_, where name represents the local file path or the configmap/secret name and key optionally represents the configmap/secret key to be filtered)

|dependency
|An external library that should be included, e.g. for Maven dependencies `dependency=mvn:org.my:app:1.0`

|env
|Set an environment variable in the integration container, e.g. `env=MY_VAR=my-value`

|label
|Add a label to the integration pod, e.g., `label=my.company=hello`

|name
|The integration name

|open-api
|Add an OpenAPI v2 spec (file path)

|profile
|Trait profile used for deployment

|property
|Add a runtime property or properties file (syntax: _[my-key=my-value\|file:/path/to/my-conf.properties]_)

|resource
|Add a runtime resource from a Configmap, Secret or file (syntax: _[configmap\|secret\|file]:name[/key][@path]_, where name represents the local file path or the configmap/secret name, key optionally represents the configmap/secret key to be filtered and path represents the destination path)

|trait
|Configure a trait, e.g. `trait=service.enabled=false`

|===
