////
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You 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.
////
= Apache Geronimo Arthur

image:https://github.com/apache/geronimo-arthur/workflows/Github%20CI/badge.svg[Github Action Status]

A thin layer on top of Orace GraalVM to build native binaries from your Java softwares.

More on our website: https://geronimo.apache.org/arthur/.

== Build the project

[source,bash]
----
# if you don't have docker, skip integration-tests profile
mvn clean install -Pintegration-tests
----

TIP: for now the project uses lombok, ensure it is installed in your IDE if you need it.
