 ----
 Usage
 ----
 ----
 2010-07-05
 ----
~~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.

Usage

 Your project structure should look something like this:

+------+
.
 |-- src
 |   `-- main
 |       `-- csharp
 |           `-- NPanday
 |               `-- Plugins
 |                   `-- Test
 |                       `-- MyMojo.cs
 `-- pom.xml
+------+

 Now compile and install the module containing your plugin:

+----+
 mvn install
+----+

 Next generate the JavaBinding classes for the .NET Plugin.

+----+
 mvn org.apache.npanday.plugins:maven-mojo-generator-plugin:generate-bindings
+----+

 Your project structure will now look like this:

+------+
.
 |-- src
 |   `-- main
 |       |-- csharp
 |       |   `-- NPanday
 |       |       `-- Plugins
 |       |           `-- Test
 |       |                `-- MyMojo.cs
 |       `-- java
 |           `-- NPanday
 |               `-- Plugins
 |                   `-- Test
 |                       `-- MyMojo.java
 |-- pom.xml
 `-- pom-java.xml
+------+

~~ @todo (link is broken) For more information on how to create plugins in .NET see: {{{../net-plugins.html} .NET Plugins}}
