<!--
 * 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.    
-->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1252">
	<TITLE></TITLE>
	<META NAME="GENERATOR" CONTENT="OpenOffice.org 3.3  (Win32)">
	<META NAME="AUTHOR" CONTENT="ant ">
	<META NAME="CREATED" CONTENT="20110315;9485571">
	<META NAME="CHANGED" CONTENT="20110906;11405052">
	<STYLE TYPE="text/css">
	<!--
		@page { margin: 2cm }
		P { margin-bottom: 0.21cm }
		H1 { margin-bottom: 0.21cm }
		H1.western { font-family: "Arial", sans-serif; font-size: 16pt }
		H1.cjk { font-family: "SimSun"; font-size: 16pt }
		H1.ctl { font-family: "Mangal"; font-size: 16pt }
		TD P { margin-bottom: 0cm }
		A:link { so-language: zxx }
	-->
	</STYLE>
</HEAD>
<BODY LANG="en-GB" DIR="LTR">
<H1 CLASS="western"><IMG SRC="running-tuscany_html_m65f05d55.png" NAME="graphics1" ALIGN=LEFT WIDTH=191 HEIGHT=91 BORDER=0><BR CLEAR=LEFT></H1>
<H1 CLASS="western">Starting the  Tuscany SCA Runtime</H1>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm">How you run the Tuscany runtime, load
contributions and start composites depends on what environment you're
running in and what you're trying to achieve. For example, if you
just want to try out some samples then you may want to run the
Tuscany runtime from the command line using the Tuscany shell or from
Maven or Ant. If on the other hand you want Tuscany to run in a
WebApp, in OSGi or you want to debug the runtime in an IDE like
Eclipse different approaches are required.</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm">The samples in this directory show
various ways in which you can start Tuscany.</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<TABLE WIDTH=643 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=4 CELLSPACING=0>
	<COL WIDTH=142>
	<COL WIDTH=483>
	<TR VALIGN=TOP>
		<TD WIDTH=142>
			<P><BR>
			</P>
		</TD>
		<TD WIDTH=483>
			<P><BR>
			</P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=142>
			<P><A HREF="command-line/README.html" NAME="commmand-line">command-line</A></P>
		</TD>
		<TD WIDTH=483>
			<P>Deploy a contribution from the command line using the Tuscany
			Shell without writing any code</P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=142>
			<P><A HREF="eclipse/README.html"><SPAN STYLE="font-weight: normal">eclipse</SPAN></A></P>
		</TD>
		<TD WIDTH=483>
			<P>Deploy and debug a contribution project from the Eclipse IDE</P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=142>
			<P><A HREF="jse/README.html">jse</A></P>
		</TD>
		<TD WIDTH=483>
			<P>Deploy a contribution from a simple Java program</P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=142>
			<P><A HREF="junit/README.html">junit</A></P>
		</TD>
		<TD WIDTH=483>
			<P>Deploy a contribution from a JUnit test case</P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=142>
			<P><A HREF="ant/README.html">ant</A></P>
		</TD>
		<TD WIDTH=483>
			<P>Deploy a contribution from an Ant script</P>
		</TD>
	</TR>
	<TR VALIGN=TOP>
		<TD WIDTH=142>
			<P><A HREF="osgi/README.html">osgi</A></P>
		</TD>
		<TD WIDTH=483>
			<P>Start the Tuscany runtime in OSGi and install a contribution</P>
		</TD>
	</TR>
</TABLE>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
<P STYLE="margin-bottom: 0cm"><BR>
</P>
</BODY>
</HTML>