= Custom `main()`: A Camel Quarkus example
:cq-example-description: An example that shows how to start Camel from a custom `main()` method

{cq-description}

A custom `main()` method may be useful if you need to implement some custom logic that needs to be executed before
starting the Camel context. In this example we do some processing of the command line parameters.

TIP: IDEs typically allow for starting `main()` methods directly from an open editor. This may come in handy when
developing.

TIP: Check the https://camel.apache.org/camel-quarkus/latest/first-steps.html[Camel Quarkus User guide] for prerequisites
and other general information.

== Start in the Development mode

The `main()` method implemented in the `org.acme.timer.Main` requires two arguments: a greeting and a number how
many times should the greeting be printed in the log. So we need to pass these two via `-Dquarkus.args` so that the
dev mode does not start with an error:

[source,shell]
----
$ mvn clean compile quarkus:dev -Dquarkus.args='Hello 2'
----

The above command compiles the project, starts the application and lets the Quarkus tooling watch for changes in your
workspace. Any modifications in your project will automatically take effect in the running application.

TIP: Please refer to the Development mode section of
https://camel.apache.org/camel-quarkus/latest/first-steps.html#_development_mode[Camel Quarkus User guide] for more details.

Then look at the log output in the console. As we run the example in Quarkus Dev Mode, you can edit the source code and have live updates.
For example try to change `greeting = args[i++];` to `greeting = args[i++] + "!!!";` in the `main()`
method and you should see the application being recompiled, restarted and the greeting with three exclamation marks
should appear in the console.

=== Package and run the application

Once you are done with developing you may want to package and run the application.

TIP: Find more details about the JVM mode and Native mode in the Package and run section of
https://camel.apache.org/camel-quarkus/latest/first-steps.html#_package_and_run_the_application[Camel Quarkus User guide]

==== JVM mode

[source,shell]
----
$ mvn clean package
$ java -jar target/quarkus-app/quarkus-run.jar Hello 2
...
[example] (Camel (camel-6) thread #8 - timer://foo) Exchange[Body: Hello]
[example] (Camel (camel-6) thread #8 - timer://foo) Exchange[Body: Hello]
...
----

==== Native mode

IMPORTANT: Native mode requires having GraalVM and other tools installed. Please check the Prerequisites section
of https://camel.apache.org/camel-quarkus/latest/first-steps.html#_prerequisites[Camel Quarkus User guide].

To prepare a native executable using GraalVM, run the following command:

[source,shell]
----
$ mvn clean package -Pnative
$ ./target/*-runner Hello 2
...
[example] (Camel (camel-6) thread #8 - timer://foo) Exchange[Body: Hello]
[example] (Camel (camel-6) thread #8 - timer://foo) Exchange[Body: Hello]
...
----

== Feedback

Please report bugs and propose improvements via https://github.com/apache/camel-quarkus/issues[GitHub issues of Camel Quarkus] project.
