= Apache Winegrower Maven Plugin

Apache Winegrower Maven plugin provides the elementary tasks to develop and package your application depending your need.

Here is how to declare it:

[source,xml]
----
<plugin>
  <groupId>org.apache.winegrower</groupId>
  <artifactId>winegrower-maven-plugin</artifactId>
  <version>${winegrower.version}</version>
</plugin>
----

== Start a dev instance (a.k.a. `Pour`)

Apache Winegrower Maven plugin allows to start an instance very easily thanks to `pour` command:

[source,sh]
----
mvn winegrower:pour
----

=== Configuration

[cols="e,m,m,m,a",headers]
|===
|Name|Type|Property|Default|Description
|dependencyScopes|Collection<String>|winegrower.dependencyScopes|provided,compile,system,runtime|which scopes to includes to build the deployment classloader.
|jarFilter|String|winegrower.jarFilter|-|custom `Predicate<String>` implementation to use as jar filter in the `Ripener.Configuration`.
|manifestContributors|Collection<String>|winegrower.manifestContributors|-|All manifets contributors to use for the `Ripener.Configuration`.
|scanningExcludes|Collection<String>|winegrower.scanningExcludes|-|All exclusions to use for the `Ripener.Configuration`.
|scanningIncludes|Collection<String>|winegrower.scanningIncludes|-|All inclusions to use for the `Ripener.Configuration`.
|workDir|File|winegrower.workDir|${project.build.directory}/winegrower/workdir|the `Ripener.Configuration` work directory.
|systemVariables|Map<String, String>|winegrower.systemVariables|${project.build.directory}/winegrower/workdir|System properties set before the instance start and resetted after the shutdown.
|waitOnSystemIn|boolean|winegrower.waitOnSystemIn|${project.build.directory}/winegrower/workdir|should the mojo wait you enter any character to exist, it is useful to disable it if you use the Karaf shell which reads `System.in` as well.
|===

=== Example

[source,xml]
----
<plugin>
  <groupId>org.apache.winegrower</groupId>
  <artifactId>winegrower-maven-plugin</artifactId>
  <version>${winegrower.version}</version>
  <configuration>
    <systemVariables>
      <karaf.startLocalConsole>true</karaf.startLocalConsole>
    </systemVariables>
    <waitOnSystemIn>false</waitOnSystemIn> <!-- cause of the shell -->
  </configuration>
</plugin>
----

== Create a fatjar

Creating a fatjar is a common need. For OSGi it becomes quite an issue
since you need to keep each `MANIFEST.MF` as it since some values can't become plural.
This is the main blocker making the `maven-shade-plugin` and `maven-assembly-plugin` quite helpless
on that task.

To solve that, Winegrower provides a `fatjar` goal which will generate an index of each shaded jars
and keep their manifests as it and the runtime knows how to read them back.

[source,sh]
----
mvn winegrower:fatjar
----

=== Configuration

[cols="e,m,m,m,a",headers]
|===
|Name|Type|Property|Default|Description
|attach|boolean|winegrower.attach|true|should the built jar be attached (installed)
|buildArtifact|File|winegrower.buildArtifact|${project.build.directory}/${project.build.finalName}.${project.packaging}.|Path of the project artifact if any.
|classifier|String|winegrower.classifier|fatjar|The classifier to use if the produced artifact is attached.
|includeScopes|Collection<String>|winegrower.includeScopes|provided,compile,runtime|The scopes included in the produced artifact.
|output|File|winegrower.output|${project.build.directory}/${project.artifactId}-fatjar.jar|Where the fatjar is produced.
|excludeArtifacts|String|winegrower.excludeArtifacts|-|either artifactId or groupId:artifactId of the artifacts to ignore.
|skipIfNoActivator|boolean|winegrower.skipIfNoActivator|false|Should artifacts without an activator be skipped in the indexation.
|===

== Create a distribution

Since Winegrower does not require an OSGi runtime anymore, it also provide a `distribution` goal
which will bundle your application as a standard java application with a `lib/` folder
and scripts in `bin` to start/stop the application.

The scripts are highly inspired from Apache Tomcat ones so if you are familiar with this server
you shouldn't be lost.

[source,sh]
----
mvn winegrower:distribution
----

Then once the distributino unzipped you can start using:

[source,sh]
----
./bin/wingrower.sh run
----

=== Configuration

[cols="e,m,m,m,a",headers]
|===
|Name|Type|Property|Default|Description
|attach|boolean|winegrower.attach|true|should the built distributions be attached (installed)
|buildArtifact|File|winegrower.buildArtifact|${project.build.directory}/${project.build.finalName}.${project.packaging}.|Path of the project artifact if any.
|classifier|String|winegrower.classifier|fatjar-%s.|The classifier to use if the produced artifact is attached. Note it is a pattern (`String.format`) taking the format as parameter.
|includeScopes|Collection<String>|winegrower.includeScopes|provided,compile,runtime|The scopes included in the produced artifact.
|conf|String|winegrower.conf|src/main/winegrower/conf|Path synchronized with the distribution conf folder.
|bin|String|winegrower.bin|src/main/winegrower/bin|Path synchronized with the distribution bin folder.
|formats|Collection<String>|winegrower.formats|zip|Distribution formats, `zip` and `tar.gz` are supported.
|keepExplodedFolder|boolean|winegrower.keepExplodedFolder|false|Should the distribution work directory be kept in the build directory.
|libs|Collection<String>|winegrower.libs|-|List of maven coordinates (`group:artifact:version[?transitive]`) to include in the distribution even if not visible as dependency.
|main|String|winegrower.main|org.apache.winegrower.Ripener|The main to run when starting the distribution.
|skipArchiveRootFolder|boolean|winegrower.skipArchiveRootFolder|false|Should the distribution keep a root folder.
|workDir|File|winegrower.workDir|${project.build.directory}/${project.artifactId}-distribution|Where the distribution is built during the build.
|===

== Generate Winegrower metadata

When you build a Fatjar, Winegrower uses metadata to respect the jar bundle modularity.
It can be neat to generate these metadata without generating a fatjar - for GraalVM for example.
To do that, you can use `metadata` mojo.

[source,sh]
----
mvn winegrower:metadata
----

=== Configuration

[cols="e,m,m,m,a",headers]
|===
|Name|Type|Property|Default|Description
|buildArtifact|File|winegrower.buildArtifact|${project.build.directory}/${project.build.finalName}.${project.packaging}.|Path of the project artifact if any.
|includeScopes|Collection<String>|winegrower.includeScopes|provided,compile,runtime|The scopes included in the produced artifact.
|output|File|winegrower.metadata.output|${project.build.outputDirectory}|Where to dump metadata.
|namingPattern|String|winegrower.metadata.namingPattern|WINEGROWER-INF/%s.properties|Naming pattern for each metadata - relative to output directory.
|excludeArtifacts|String|winegrower.excludeArtifacts|-|either artifactId or groupId:artifactId of the artifacts to ignore.
|skipIfNoActivator|boolean|winegrower.skipIfNoActivator|false|Should artifacts without an activator be skipped in the indexation.
|===

== From Winegrower no-manifest deployment to OSGi deployments

Winegrower supports some custom API not requiring a full OSGi packaging
and in particular a valid OSGi `META-INF/MANIFEST.MF`. This is typically the case
if you are using `@Header`.

If you want to enable this feature you can either register the activator
manually or we recommand you to use bnd or bundle plugins to do that.
