## page was renamed from Cytoscape_3.0/Developer/CreateProject = Create OSGI-Spring Project with Maven = == Introduction == This document is for developers who knows Java, but not familiar with new technologies such as Spring or OSGi. == Your First Spring-OSGi Project == In this section, you will learn how to create simple Spring + OSGi project with Maven. === Setup === For this tutorial, you need to install the following software: * Java 5/6 * Maven 2.0.9 or later Installation of Maven is simple. All you have to do is just download, unzip, and set path to the maven directory. === Procedure === * Open the terminal. Make sure maven is correctly installed on your system. {{{ kono$ mvn -version Maven version: 2.0.9 Java version: 1.5.0_16 OS name: "mac os x" version: "10.4.11" arch: "i386" Family: "unix" }}} * Create new project. {{{ mvn org.ops4j:maven-pax-plugin:create-project -DgroupId=org.cytoscape -DartifactId=osgi-sample }}} cd to '''''osgi-sample''''' directory (this is your project name). * Add [[http://www.springsource.com/repository/app/|SpringSource Enterprise Bundle Repository]] to your project. {{{ mvn pax:add-repository -DrepositoryId=com.springsource.repository.bundles.external -DrepositoryURL=http://repository.springsource.com/maven/bundles/external }}} This means maven trying to find required bundles in the SpringSource's repository if they does not exist in the central maven repository. * Import '''''infrastructure bundles'''''. In our case, we need '''Spring Framework''' and '''Spring Dynamic Modules''' to run our bundles. So we need to import those bundles. {{{ mvn pax:import-bundle -DgroupId=org.springframework.osgi -DartifactId=spring-osgi-extender -Dversion=1.1.2 "-DimportTransitive" "-DwidenScope" }}} * Now create your first bundle. Last two options creates some templates for developing bundles running with Spring DM and simple tests. {{{ mvn pax:create-bundle -Dpackage=org.cytoscape.sample "-Dspring" "-Djunit=4.4" }}} * Compile, test, and run your project. {{{ mvn clean install pax:provision }}} * Type '''''ps'''''. Then you can see something like this: {{{ -> ps START LEVEL 6 ID State Level Name [ 0] [Active ] [ 0] System Bundle (1.4.1) [ 1] [Active ] [ 5] spring-osgi-extender (1.1.2) [ 2] [Active ] [ 5] spring-osgi-core (1.1.2) [ 3] [Active ] [ 5] SLF4J Jakarta Commons Logging Over SLF4J Binding (1.5.0) [ 4] [Installed ] [ 5] SLF4J API (1.5.0) [ 6] [Active ] [ 5] spring-osgi-io (1.1.2) [ 7] [Active ] [ 5] spring-aop (2.5.5) [ 8] [Active ] [ 5] spring-beans (2.5.5) [ 9] [Active ] [ 5] spring-context (2.5.5) [ 10] [Active ] [ 5] spring-core (2.5.5) [ 11] [Active ] [ 5] spring-test (2.5.5) [ 12] [Active ] [ 5] AOP Alliance API (1.0.0) [ 13] [Active ] [ 5] Backport Util Concurrent (3.1.0) [ 14] [Active ] [ 5] Apache Log4J (1.2.15) [ 15] [Active ] [ 5] Java Messaging System API (1.1.0) [ 16] [Active ] [ 5] Java Transaction API (1.1.0) [ 17] [Active ] [ 5] org.cytoscape.sample (1.0.0.SNAPSHOT) [ 18] [Active ] [ 1] osgi.compendium (4.1.0.build-200702212030) [ 19] [Active ] [ 1] OPS4J Pax Logging - API (1.3.0) [ 20] [Active ] [ 1] OPS4J Pax Logging - Service (1.3.0) [ 21] [Active ] [ 1] Apache Felix Shell Service (1.0.2) [ 22] [Active ] [ 1] Apache Felix Shell TUI (1.0.2) -> }}} Bundles are running on Apache Felix. You can dynamically start/stop these bundles. {{{ [ 17] [Active ] [ 5] org.cytoscape.sample (1.0.0.SNAPSHOT) }}} This is your bundle. All other bundles are '''''infrastructure bundles''''' which provides functions like shell, AOP, Spring bean creation, etc. To stop your bundle, type {{{ stop 17 }}} where 17 is your bundle ID. Type '''''ps''''' again. {{{ START LEVEL 6 ID State Level Name [ 0] [Active ] [ 0] System Bundle (1.4.1) [ 1] [Active ] [ 5] spring-osgi-extender (1.1.2) [ 2] [Active ] [ 5] spring-osgi-core (1.1.2) [ 3] [Active ] [ 5] SLF4J Jakarta Commons Logging Over SLF4J Binding (1.5.0) [ 4] [Installed ] [ 5] SLF4J API (1.5.0) [ 6] [Active ] [ 5] spring-osgi-io (1.1.2) [ 7] [Active ] [ 5] spring-aop (2.5.5) [ 8] [Active ] [ 5] spring-beans (2.5.5) [ 9] [Active ] [ 5] spring-context (2.5.5) [ 10] [Active ] [ 5] spring-core (2.5.5) [ 11] [Active ] [ 5] spring-test (2.5.5) [ 12] [Active ] [ 5] AOP Alliance API (1.0.0) [ 13] [Active ] [ 5] Backport Util Concurrent (3.1.0) [ 14] [Active ] [ 5] Apache Log4J (1.2.15) [ 15] [Active ] [ 5] Java Messaging System API (1.1.0) [ 16] [Active ] [ 5] Java Transaction API (1.1.0) [ 17] [Resolved ] [ 5] org.cytoscape.sample (1.0.0.SNAPSHOT) [ 18] [Active ] [ 1] osgi.compendium (4.1.0.build-200702212030) [ 19] [Active ] [ 1] OPS4J Pax Logging - API (1.3.0) [ 20] [Active ] [ 1] OPS4J Pax Logging - Service (1.3.0) [ 21] [Active ] [ 1] Apache Felix Shell Service (1.0.2) [ 22] [Active ] [ 1] Apache Felix Shell TUI (1.0.2) -> }}} You can see your bundle is no longer active. Let's start it again {{{ start 17 }}} Now you can see lots of log messages. If you read those messages carefully, you can see some interesting ones: {{{ [SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myExampleBean' [SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating instance of bean 'myExampleBean' [SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'myExampleBean' to allow for resolving potential circular references [SpringOsgiExtenderThread-4] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'myExampleBean' }}} This is the message from '''''Spring Dynamic Modules infrastructure bundles'''''. It recognizes your bundle, and read settings, and automatically create ''bean'' named '''''myExampleBean'''''. ==== Inside Your Bundle ==== Let's look into the code. {{{ kono$ cd org.cytoscape.sample kono$ ls -l total 16 -rw-r--r-- 1 kono kono 201 Mar 11 17:36 osgi.bnd -rw-r--r-- 1 kono kono 2656 Mar 11 17:36 pom.xml drwxr-xr-x 4 kono kono 136 Mar 11 17:36 src drwxr-xr-x 6 kono kono 204 Mar 11 17:54 target }}} This is the basic directory structure of Spring-OSGi project created by maven. In the following directory, you can see two XML files {{attachment:directory.png}} These two XML files defines your '''''beans''''' and '''''OSGi Services'''''. * '''~+bundle-context.xml+~''' {{{ }}} This is the file to define your beans. In this example, only one bean named '''''myExampleBean''''' is defined. This entry creates an instance of '''''org.cytoscape.sample.internal.ExampleBeanImpl''''' and that's all Spring does in this example. * '''~+bundle-context-osgi.xml+~''' {{{ }}} By default, nothing defined in this file. We can tell Spring DM which beans should be exported as OSGi services by writing settings in this file. ===== Summary So Far ===== * There are several important setting files. * '''pom.xml''' - Setting file for Maven. Defines name of module, dependency (required bundles we need to run the bundle), and remote repository locations. * '''bundle-context.xml''' - Defines Spring beans. Spring reads this file and create instances of concrete classes automatically. * '''bundle-context-osgi.xml''' - Defines OSGi service. You can import/export Spring beans as OSGi services. (to be continued...)