~~ 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.

Running a server

  The OpenEJB plugin provides a mechanism to run OpenEJB as a standalone server in Eclipse. This page show you how to use it.
  
  First of all, open the Server view. You can do this from the menu bar using the 'Window->Show view->Other' options. Select 'Servers' under the 'Server' category.
  
  Right click in the Server view, and select 'New->Server'.
  
[images/server_step_1.jpg]
  
  Expand the 'Apache' category and select 'OpenEJB 3.0.0'. Click 'Next'.
  
[images/server_step_2.jpg]
  
  Select the directory where you have OpenEJB installed.
  
[images/server_step_3.jpg]

  Select the host and port, and click 'Finish'.
  
  You can now start and stop the server from the servers view.
  
Known issues

  Version numbering. The current plugin only works with OpenEJB built from source, as it looks for jars with 3.0-SNAPSHOT in the filenames.
  This is in the process of being fixed, and will hopefully be resolved shortly.
  
