<!--
    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.
-->
 
 
#Navigation Top
 [&lt;&lt;Back to the Netbeans Users Guide](./usingNetbeans.html)
 or
 [On to the configuration entries overview&gt;&gt;](./configentries.html)
 
#Appendix: Setup Steps
## Short setup overview
 This section is only a checklist of things to do at the setup for details follow the explanations
 in the [page](./installation.html)
 
 
 Manual setup
<ul>
   <li>Check if your installation environment is setup</li>
   <li>Download the appropriate meta bundle and place it in WEB-INF/lib</li>
   <li>Download groovy-all.jar and or (scala-lang.jar and scala-compiler.jar) and place it in
       WEB-INF/lib</li>
   <li>Prepare your script paths (WEB-INF/java, WEB-INF/groovy, WEB-INF/scala)</li>
   <li>Add your <a href="./exampleconfig.html">web.xml</a> entries</li>
   <li>start the web application ...</li>
</ul>
 
 
 Build via maven
<ul>
   <li>Check if your installation environment is setup</li>
   <li>Add your pom xml dependencies and the repository entry</li>
   <li>Prepare your script paths (WEB-INF/java, WEB-INF/groovy, WEB-INF/scala)</li>
   <li>Add your <a href="./exampleconfig.html">web.xml</a> entries</li>
   <li>mvn clean install ...</li>
</ul>
 
 
 Build via ide
<ul>
   <li>Check if your installation environment is setup</li>
   <li>Download the appropriate meta bundle and add it to your dependency and deployment settings
   (for the download location check the <a href="./download.html">download page</a>)
   </li>
   <li>Download groovy-all.jar and add it to your dependency and deployment settings</li>
   <li>Prepare your script paths</li>
   <li>Add your <a href="./exampleconfig.html">web.xml</a> entries</li>
   <li>start the web application ...</li>
</ul>
 
 
 
#Navigation Bottom
 [&lt;&lt;Back to the Netbeans Users Guide](./usingNetbeans.html)
 or
 [On to the configuration entries overview&gt;&gt;](./configentries.html)
 
 
