//
// 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.
//

=== Using the karaf-maven-plugin

The Karaf Maven plugin allows you:

* to work with Karaf features: verify and validate a features descriptor, add features bundle into a repository, create a KAR archive from a features descriptor, etc.
* to create Karaf commands help: it generates help from Karaf commands
* to modify Karaf instances and create distributions

See https://github.com/apache/karaf/blob/master/examples/karaf-maven-example/README.md for details.

==== Packaging

The most generally useful features of the karaf-maven-plugin are exposed as packagings.  To use the packagings the pom or an ancestor must configure the karaf-maven-plugin with extensions:

----
    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.karaf.tooling</groupId>
                    <artifactId>karaf-maven-plugin</artifactId>
                    <version>${project.version}</version>
                    <extensions>true</extensions>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
----

Then specify the packaging in your project as usual, e.g.

----
    <packaging>kar</packaging>
----

|===
|Packaging |Description

|feature
|The feature packaging verifies a features.xml descriptor using the `karaf:verify` goal.

|kar
|The kar packaging generates a features.xml descriptor using the `karaf:features-generate-descriptor` and then packages a kar using the `karaf:features-create-kar` goal.

|karaf-assembly
|Assembles a Karaf server based on the features descriptors and kar files listed as Maven dependencies.
|===

==== Commands goals

The `karaf-maven-plugin` is able to generate documentation for Karaf commands

===== `karaf:commands-generate-help`

The `karaf:commands-generate-help` goal generates documentation containing Karaf commands help.

It looks for Karaf commands in the current project class loader and generates the help as displayed with the `--help`
option in the Karaf shell console.

====== Example

The example below generates help for the commands in the current project:

----
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.karaf.tooling</groupId>
        <artifactId>karaf-maven-plugin</artifactId>
        <version>${project.version}</version>

        <executions>
          <execution>
            <id>document-commands</id>
            <phase>generate-resources</phase>
            <goals>
              <goal>commands-generate-help</goal>
            </goals>
            <configuration>
              <targetFolder>${project.build.directory}/docbook/sources</targetFolder>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
----

====== Parameters

|===
|Name |Type |Description

|`targetFolder`
|`File`
|The directory where the documentation output files are to be generated. Default value: ${project.build.directory}/docbkx/sources

|`format`
|`String`
|The output format (docbx, asciidoc, or conf) of the commands documentation. Default value: docbx

|`classLoader`
|`String`
|The class loader to use in loading the commands. Default value: ${project}
|===

==== Features and kar goals

[NOTE]
====
You should use the features or kar packaging instead of these individual goals.
====

The `karaf-maven-plugin` provides several goals to help you create and verify features XML descriptors as well as leverage your features to create a custom Karaf distribution.

===== `karaf:features-generate-descriptor`

The `karaf:features-generate-descriptor` goal generates a features XML file based on the Maven dependencies.
By default, it will follow Maven transitive dependencies, stopping when it encounters bundles already present in features that are Maven dependencies.

A record of the dependency tree search can be found in target/history/treeListing.txt.

You can track dependency changes and warn or fail on change.

====== Configuration

Specify the packaging as a top level element

----
<packaging>feature</packaging>
----

You can supply a feature descriptor to extend in `src/main/feature/feature.xml`.

|===
|Parameter Name |Type |Description

|aggregateFeatures
|boolean (false)
|Specifies processing of feature repositories that are (transitive) Maven dependencies.
If false, all features in these repositories become dependencies of the generated feature.
If true, all features in these repositories are copied into the generated feature repository.

|startLevel
|int
|The start level for the bundles determined from Maven dependencies.
This can be overridden by specifying the bundle in the source feature.xml with the desired startlevel.

|includeTransitiveDependency
|boolean (true)
|Whether to follow Maven transitive dependencies.

|checkDependencyChange
|boolean (false)
|Whether to record dependencies in `src/main/history/dependencies.xml` for change tracking.

|warnOnDependencyChange
|boolean (false)
|whether to fail on changed dependencies (false, default) or warn in the build output (true).

|logDependencyChanges
|boolean (false)
|If true, added and removed dependencies are shown in `target/history`.

|overwriteChangedDependencies
|boolean (false)
|If true, the `src/main/history/dependencies.xml` file will be overwritten if it has changed.

|markRuntimeScopeAsDependency
|boolean (true)
|Whether to mark dependencies' in the `runtime` scope with `dependency="true"`.

|markTransitiveAsDependency
|boolean (false)
|Whether to mark transitive dependencies' with `dependency="true"`.
|If true, the `src/main/history/dependencies.xml` file will be overwritten if it has changed.
|===

====== Example

----
<project>
...
  <packaging>feature</packaging>
  <dependencies>
    <dependency>
      <groupId>org.apache</groupId>
      <artifactId>bundle1</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.karaf.tooling</groupId>
        <artifactId>karaf-maven-plugin</artifactId>
        <version>${project.version}</version>
        <extensions>true</extensions>
        <configuration>
          <enableGeneration>true</enableGeneration>
        </configuration>
        <executions>
          <execution>
            <id>generate-features-file</id>
            <phase>generate-resources</phase>
            <goals>
              <goal>features-generate-descriptor</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
----

===== `karaf:verify`

Except in unusual circumstances, use the `<packaging>feature</packaging>` to run this goal.

The `karaf:verify` goal verifies and validates a features XML descriptor by checking if all the required imports
for the bundles defined in the features can be matched to a provided export.

By default, the plugin tries to add the Karaf core features (standard and enterprise) in the repositories set.
It means that it's not required to explicitly define the Karaf features descriptor in the repository section of
your features descriptor.

====== Example

The example below validates the features defined in the `target/features.xml` by checking all the imports and exports.
It reads the definition for the packages that are exported by the system bundle from the `src/main/resources/config.properties` file.

----
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.karaf.tooling</groupId>
        <artifactId>karaf-maven-plugin</artifactId>
        <configuration>
        </configuration>
        <executions>
          <execution>
            <id>verify</id>
            <phase>process-resources</phase>
            <goals>
              <goal>verify</goal>
            </goals>
            <configuration>
              <descriptors>
                <descriptor>mvn:org.apache.karaf.features/framework/4.0.4/xml/features</descriptor>
                <descriptor>file:${project.build.directory}/feature/feature.xml</descriptor>
              </descriptors>
              <distribution>org.apache.karaf.features:framework</distribution>
              <javase>1.8</javase>
              <framework>
                <feature>framework</feature>
              </framework>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
----

====== Parameters

|===
|Name |Type |Description

|`descriptors`
|`String[]`
|The list of features XML repositories to use for the verify

|`features`
|`String[]`
|The list of features to verify. If not specified, all features in the descriptors will be verified.

|`framework`
|`String[]`
|The features providing the Karaf framework (optional)

|`javase`
|`String`
|The Java version to use for the verify

|===

===== `karaf:features-add-to-repository`

Consider using the karaf-assembly packaging which makes it easy to assemble a custom distribution in one step instead
of this individual goal.

The `karaf:features-add-to-repository` goal adds all the required bundles for a given set of features into directory.
You can use this goal to create a `/system` directory for building your own Karaf-based distribution.

By default, the Karaf core features descriptors (standard and enterprise) are automatically included in the descriptors set.

====== Example

The example below copies the bundles for the `spring` and `war` features defined in the Karaf features XML descriptor
into the `target/features-repo` directory.

----
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.karaf.tooling</groupId>
        <artifactId>karaf-maven-plugin</artifactId>
        <version>${project.version}</version>

        <executions>
          <execution>
            <id>features-add-to-repo</id>
            <phase>generate-resources</phase>
            <goals>
              <goal>features-add-to-repository</goal>
            </goals>
            <configuration>
              <descriptors>
                <descriptor>mvn:org.apache.karaf.features/standard/4.0.0/xml/features</descriptor>
                <descriptor>mvn:my.groupid/my.artifactid/1.0.0/xml/features</descriptor>
              </descriptors>
              <features>
                <feature>spring</feature>
                <feature>war</feature>
                <feature>my</feature>
              </features>
              <repository>target/features-repo</repository>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
----

====== Parameters

|===
|Name |Type |Description

|`descriptors`
|`String[]`
|List of features XML descriptors where the features are defined

|`features`
|`String[]`
|List of features that bundles should be copied to the repository directory

|`repository`
|`File`
|The directory where the bundles will be copied by the plugin goal

|`timestampedSnapshot`
|`boolean`
|For SNAPSHOT artifacts, if false we use the base version (foo-1.0-SNAPSHOT), else we use the timestamped version (foo-1.0-2019xxxx). Default value: false
|===

===== `karaf:create-kar`

[NOTE]
====
Except in unusual circumstances, use the `<packaging>kar</packaging>` to run this goal.
====

The `karaf:kar` goal assembles a KAR archive from a features XML descriptor file, normally generated in the same project
with the `karaf:features-generate-descriptor` goal.

There are two important directories in a kar:

* `repository/`  contains a Maven structured repository of artifacts to be copied into the Karaf repository.
The features descriptor and all the bundles mentioned in it are installed in this directory.
* `resources/` contains other resources to be copied over the Karaf installation.

Everything in `target/classes` is copied into the kar.
Therefore resources you want installed into Karaf need to be in e.g. `src/main/resources/resources`.
This choice is so other resources such as legal files from the maven-remote-resources-plugin can be included under
META-INF in the kar, without getting installed into Karaf.

====== Example

----
<project>
...
  <packaging>kar</packaging>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.karaf.tooling</groupId>
        <artifactId>karaf-maven-plugin</artifactId>
        <version>${project.version}</version>
        <extensions>true</extensions>
        <!-- There is no useful configuration for the kar mojo. The features-generate-descriptor mojo configuration may be useful -->
      </plugin>
    </plugins>
  </build>
</project>
----

===== `karaf:install-kar`

==== Instances and distributions goals

The `karaf-maven-plugin` helps you to build custom Karaf distributions or archives existing Karaf instances:

===== `karaf:assembly`

[NOTE]
====
This goal is run as part of the karaf-assembly packaging.
====

The `karaf:assembly` goal creates a Karaf instance (assembly) filesystem using the Maven dependencies and a provided configuration.

====== Example

----
    ...
    <packaging>karaf-assembly</packaging>
    ...
    <dependencies>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>framework</artifactId>
            <type>kar</type>
        </dependency>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>standard</artifactId>
            <classifier>features</classifier>
            <type>xml</type>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <finalName>${project.artifactId}</finalName>
                    <installedBundles>
                        <installedBundle>${additional.bundle}</installedBundle>
                    </installedBundles>
                    <bootFeatures>
                        <feature>bundle</feature>
                        <feature>config</feature>
                        <feature>diagnostic</feature>
                        <feature>feature</feature>
                        <feature>jaas</feature>
                        <feature>shell</feature>
                        <feature>log</feature>
                        <feature>management</feature>
                        <feature>package</feature>
                        <feature>shell-compat</feature>
                        <feature>ssh</feature>
                        <feature>system</feature>
                        <feature>wrap</feature>
                    </bootFeatures>
                </configuration>
            </plugin>
        </plugins>
    </build>
----

By default, the generated Karaf instance is a dynamic distribution (it's started with default set of resources and then you can deploy new applications in this instance).

It's also possible to generate a Karaf instance as a static distribution (kind of immutable):

----
    <dependencies>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>static</artifactId>
            <type>kar</type>
        </dependency>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>standard</artifactId>
            <classifier>features</classifier>
            <type>xml</type>
        </dependency>
        <dependency>
            <groupId>org.apache.karaf.services</groupId>
            <artifactId>org.apache.karaf.services.staticcm</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <startupFeatures>
                        <startupFeature>static-framework</startupFeature>
                        <startupFeature>scr</startupFeature>
                        <startupFeature>http-whiteboard</startupFeature>
                    </startupFeatures>
                    <framework>static</framework>
                    <useReferenceUrls>true</useReferenceUrls>
                    <environment>static</environment>
                </configuration>
            </plugin>
        </plugins>
    </build>
----

====== Parameters

|===
|Name |Type |Description

|`sourceDirectory`
|`File`
| Base directory used to overwrite resources in generated assembly after the build (resource directory). Default value: ${project.basedir}/src/main/resources/assembly

|`workDirectory`
|`File`
|Base directory used to copy the resources during the build (working directory). Default value: ${project.build.directory}/assembly

|`featuresProcessing`
|`File`
|Optional location for custom features processing XML configuration (`etc/org.apache.karaf.features.cfg`). Default value: null

|`installAllFeaturesByDefault`
|`Boolean`
|For given stage (startup, boot, install) if there are no stage-specific features and profiles, all features from stage-specific repositories will be used. Default value: true

|`environment`
|`String`
|An environment identifier that may be used to select different variant of PID configuration file, e.g., `org.ops4j.pax.url.mvn.cfg#docker`. Default value: null

|`defaultStartLevel`
|`int`
|Default start level for bundles in features that don't specify it. Default value: 30

|`startupRepositories`
|`List<String>`
|List of compile-scope features XML files to be used in startup stage (etc/startup.properties).

|`bootRepositories`
|`List<String>`
|List of runtime-scope features XML files to be used in boot stage (etc/org.apache.karaf.features.cfg)

|`installedRepositories`
|`List<String>`
|List of provided-scope features XML files to be used in install stage

|`blacklistedRepositories`
|`List<String>`
|List of blacklisted repository URIs. Blacklisted URI may use globs and version ranges.

|`startupFeatures`
|`List<String>`
|List of features from compile-scope features XML files and KARs to be installed into system repo and listed in etc/startup.properties.

|`bootFeatures`
|`List<String>`
|List of features from runtime-scope features XML files and KARs to be installed into system repo and listed in featuresBoot property in etc/org.apache.karaf.features.cfg

|`installedFeatures`
|`List<String>`
|List of features from provided-scope features XML files and KARs to be installed into system repo and not mentioned elsewhere.

|`blacklistedFeatures`
|`List<String>`
|List of feature blacklisting clauses. Each clause is in one of the formats (feature-name, feature-name;range=version-or-range, feature-name/version-or-range

|`startupBundles`
|`List<String>`
|List of compile-scope bundles added to etc/startup.properties

|`bootBundles`
|`List<String>`
|List of runtime-scope bundles wrapped in special feature added to featuresBoot property in etc/org.apache.karaf.features.cfg

|`installedBundles`
|`List<String>`
|List of provided-scope bundles added to system repo

|`blacklistedBundles`
|`List<String>`
|List of blacklisted bundle URIs. Blacklisted URI may use globs and version ranges.

|`profilesUris`
|`List<String>`
|List of profile URIs to use

|`startupProfiles`
|`List<String>`
|List of profiles names to load from configured `profilesUris` and use as startup profiles.

|`bootProfiles`
|`List<String>`
|List of profiles names to load from configured `profilesUris` and use as boot profiles.

|`installedProfiles`
|`List<String>`
|List of profiles names to load from configured `profilesUris` and use as installed profiles.

|`blacklistedProfiles`
|`List<String>`
|List of blacklisted profile names (possibly using `*` glob).

|`writeProfiles`
|`boolean`
|When assembly custom distribution, we can include generated and added profiles in the distribution itself, in `${karaf.etc}/profiles` directory. Default value: false

|`generateConsistencyReport`
|`String`
|When assembly custom distribution, we can also generate an XML/XSLT report with the summary of bundles. This parameter specifies target directory, to which `bundle-report.xml` and `bundle-report-full.xml` (along with XSLT stylesheet) will be written.

|`consistencyReportProjectName`
|`String`
|When generating consistency report, we can specify project name. Default value: Apache Karaf

|`consistencyReportProjectVersion`
|`String`
|When generating consistency report, we can specify project version. Default value: ${project.version}
|===

===== `karaf:archive`

[NOTE]
====
This goal is run as part of the karaf-assembly packaging.
====

The `karaf:archive` goal packages a Karaf instance archive from a given assembled instance.

Both tar.gz and zip formats are generated in the destination folder.

====== Example

The example below create archives for the given Karaf instance:

----
<project>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.karaf.tooling</groupId>
        <artifactId>karaf-maven-plugin</artifactId>
        <version>${project.version}</version>
          <executions>
            <execution>
              <id>generate</id>
              <phase>package</phase>
              <goals>
                <goal>archive</goal>
              </goals>
              <configuration>
                <destDir>${project.build.directory}</destDir>
                <targetServerDirectory>${project.build.directory}/assembly</targetServerDirectory>
                <targetFile>${project.file}</targetFile>
              </configuration>
            </execution>
          </executions>
        </plugin>
    </plugins>
  </build>
</project>
----

====== Parameters

|===
|Name |Type |Description

|`destDir`
|`File`
| The target directory of the project. Default value: ${project.build.directory}

|`targetServerDirectory`
|`File`
|The location of the server repository. Default value: ${project.build.directory}/assembly

|`pathPrefix`
|`String`
|Path prefix of files in the created archive. Default value: ${project.artifactId}-${project.version}

|`usePathPrefix`
|`boolean`
|Use a path prefix of files in the created archive. Default value: false

|`targetFile`
|`File`
|The target file to set as the project's artifact. Default value: ${project.artifactId}-${project.version}

|`archiveZip`
|`Boolean`
|Switches creation of *.zip artifact on or off. Default value: true

|`archiveTarGz`
|`Boolean`
|Switches creation of *.tar.gz artifact on or off. Default value: true

|`attach`
|`boolean`
|Whether to attach the resulting assembly to the project as an artifact. Default value: true

|`classifier`
|`String`
|If supplied, the classifier for the artifact when attached.

|`useSymLinks`
|`boolean`
|Use symbolic links in tar.gz or zip archives. Symbolic links are not very well supported by windows Platform. At least, is does not work on WinXP + NTFS, so do not include them for now. Default value: false
|===

==== Run, client, deploy goals

These goals allows you to run Karaf via Maven or interact with a running instance.

===== `karaf:run`

`karaf:run` goal runs a Karaf instance from Maven.

It can use the current project if it's a bundle to directly deploy the project artifact in the running Karaf instance.

====== Example

----
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>run</id>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <karafDistribution>mvn:org.apache.karaf/apache-karaf/4.2.4/zip</karafDistribution>
                            <keepRunning>false</keepRunning>
                            <deployProjectArtifact>false</deployProjectArtifact>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
----

====== Parameters

|===
|Name |Type |Description

|`karafDirectory`
|`File`
|Directory containing Karaf container base directory. Default value: ${project.build.directory}/karaf

|`karafDistribution`
|`File`
|Location where to download the Karaf distribution. Default value: mvn:org.apache.karaf/apache-karaf/LATEST/zip

|`deployProjectArtifact`
|`boolean`
|Define if the project artifact should be deployed in the started container or not. Default value: true

|`featureRepositories`
|`String[]`
|A list of URLs referencing feature repositories that will be added to the karaf instance started by this goal.

|`featuresToInstall`
|`String`
|Comma-separated list of features to install.

|`keepRunning`
|`boolean`
|Define if the Karaf container keep running or stop just after the goal execution. Default value: true

|`startSsh`
|`boolean`
|Define if the Karaf embedded sshd should be started or not. Default value: false
|===

===== `karaf:client`

The `karaf:client` interacts with a running Karaf instance directly from Maven via SSH.

====== Example

----
<execution>
    <id>client</id>
    <goals>
        <goal>client</goal>
    <goals>
    <configuration>
        <commands>
            <command>
                <rank>1</rank>
                <command>feature:install foo</command>
            </command>
        </commands>
    </configuration>
</execution>
----

====== Parameters

|===
|Name |Type |Description

|`port`
|`int`
|SSH port of the running Karaf instance. Default value: 8101

|`host`
|`String`
|Hostname or IP address of the running Karaf instance. Default value: localhost

|`user`
|`String`
|The username to connect to the running Karaf instance. Default value: karaf

|`password`
|`String`
|The password to connect to the running Karaf instance. Default value: karaf

|`keyFile`
|`File`
|The key file to use to connect to the running Karaf instance.

|`attempts`
|`int`
|The number of attempts to connect to the running Karaf instance. Default value: 0

|`delay`
|`int`
|The delay (in second) to wait before trying to connect to the Karaf instance. Default value: 2

|`commands`
|`List<CommandDescriptor>`
|The list of the commands to execute on the running Karaf instance.

|`scripts`
|`List<ScriptDescriptor>`
|The list of the scripts to execute on the running Karaf instance.

|`skip`
|`boolean`
|Skip or not the execution of the client goal execution. Default value: false
|===

===== `karaf:deploy`

The `karaf:deploy` goal allows you to deploy bundles on a running Karaf instance (via SSH or JMX).

===== Example

----
<execution>
    <id>deploy</id>
    <goals>
        <goal>deploy</goal>
    <goals>
    <configuration>
        <useProjectArtifact>true</useProjectArtifact>
    </configuration>
</execution>
----

===== Parameters

|===
|Name |Type |Description

|`port`
|`int`
|SSH port of the running Karaf instance. Default value: 8101

|`host`
|`String`
|Hostname or IP address of the running Karaf instance. Default value: localhost

|`user`
|`String`
|The username to connect to the running Karaf instance. Default value: karaf

|`password`
|`String`
|The password to connect to the running Karaf instance. Default value: karaf

|`keyFile`
|`File`
|The key file to use to connect to the running Karaf instance.

|`attempts`
|`int`
|The number of attempts to connect to the running Karaf instance. Default value: 0

|`delay`
|`int`
|The delay (in second) to wait before trying to connect to the Karaf instance. Default value: 2

|`instance`
|`String`
|Name of the Karaf instance. Default value: karaf-root

|`useSsh`
|`boolean`
| Define if the deployment is done via SSH or via JMX. Default value: false

|`useProjectArtifact`
|`boolean`
|Define if deploy uses the current Maven project artifact (in the case of the project is a bundle project). Default value: true

|`artifactLocations`
|`List<String>`
|The list of bundle locations (mvn, http, file, ... URLs) to deploy.
|===

==== Dockerfile, Docker

The Karaf Maven plugin is also able to generate Dockerfile and eventually interact with a local Docker daemon.

===== Dockerfile

The `karaf:dockerfile` goal creates a ready to use Dockerfile for a given Karaf distribution/assembly.

====== Example

----
<execution>
    <id>dockerfile</id>
    <goals>
        <goal>dockerfile</goal>
    </goals>
</execution>
----

====== Parameters

|===
|Name |Type |Description

|`destDir`
|`File`
|The directory where the Dockerfile is generated. Default value: ${project.build.directory}

|`assembly`
|`File`
|The directory containing the Karaf assembly (as generated by `karaf:assembly`). Default value: ${project.build.directory}/assembly
|===

===== Docker

The `karaf:docker` goal interacts directly with a local Docker daemon (via the command line) to directly create a Docker image with your Karaf assembly.

[NOTE]
====
This goal requires a local Docker daemon and runs only on Unix. The `docker` command has to be in the `PATH`.
====

====== Example

----
<execution>
    <id>docker</id>
    <goals>
        <goal>docker</docker>
    </goals>
</execution>
----

====== Parameters

|===
|Name |Type |Description

|`location`
|`File`
|The directory containing the Dockerfile (can be generated by `karaf:dockerfile`). Default value: ${project.build.directory}

|`imageName`
|`String`
|The name of the generated Docker image. Default value: karaf
|===
