<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marshal&#039;s Blog &#187; jee</title>
	<atom:link href="http://marshal.easymorse.com/archives/tag/jee/feed" rel="self" type="application/rss+xml" />
	<link>http://marshal.easymorse.com</link>
	<description>It&#039;s swap of marshal&#039;s memory.</description>
	<lastBuildDate>Mon, 30 Jan 2012 07:03:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>在spring-dm环境下增加hibernate绑定</title>
		<link>http://marshal.easymorse.com/archives/882?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8spring-dm%25e7%258e%25af%25e5%25a2%2583%25e4%25b8%258b%25e5%25a2%259e%25e5%258a%25a0hibernate%25e7%25bb%2591%25e5%25ae%259a</link>
		<comments>http://marshal.easymorse.com/archives/882#comments</comments>
		<pubDate>Wed, 19 Nov 2008 16:56:16 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/882</guid>
		<description><![CDATA[在spring-dm（1.1.2）环境下增加hibernate（3.2.6 ga）绑定的步骤： 支持类库 设置maven的pom文件： &#60;dependency&#62; &#160;&#160;&#160; &#60;groupId&#62;org.hibernate&#60;/groupId&#62; &#160;&#160;&#160; &#60;artifactId&#62;com.springsource.org.hibernate&#60;/artifactId&#62; &#160;&#160;&#160; &#60;version&#62;3.2.6.ga&#60;/version&#62; &#60;/dependency&#62; &#60;dependency&#62; &#160;&#160;&#160; &#60;groupId&#62;javax.xml.stream&#60;/groupId&#62; &#160;&#160;&#160; &#60;artifactId&#62;com.springsource.javax.xml.stream&#60;/artifactId&#62; &#160;&#160;&#160; &#60;version&#62;1.0.1&#60;/version&#62; &#60;/dependency&#62; 最新的hibernate是3.3.2.ga，由于slf4j版本需要1.5.2以上，高于当前spring-dm1.1.2环境的1.5.0，另外hibernate 3.3.x新增的特性暂时不用，所以暂时用3.2.6。 设置config.ini文件 在config.ini文件增加以下bundle的启动设置： com.springsource.antlr.jar@start,com.springsource.javassist.jar@start,com.springsource.org.apache.commons.collections.jar@start,com.springsource.org.dom4j.jar@start,com.springsource.javax.xml.stream.jar@start,com.springsource.org.objectweb.asm.jar@start,com.springsource.org.objectweb.asm.attrs.jar@start,com.springsource.org.hibernate.jar@start 设置MANIFEST.MF文件 增加： Import-Package: &#8230;,org.hibernate;version=&#34;[3.2.6.ga,3.2.6.ga]&#34;]]></description>
			<content:encoded><![CDATA[<p>在spring-dm（1.1.2）环境下增加hibernate（3.2.6 ga）绑定的步骤：</p>
<p> <span id="more-882"></span><br />
<h4>支持类库</h4>
<p>设置maven的pom文件：</p>
<blockquote><p>&lt;dependency&gt;     <br />&#160;&#160;&#160; &lt;groupId&gt;org.hibernate&lt;/groupId&gt;      <br />&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.org.hibernate&lt;/artifactId&gt;      <br />&#160;&#160;&#160; &lt;version&gt;3.2.6.ga&lt;/version&gt;      <br />&lt;/dependency&gt;      <br />&lt;dependency&gt;      <br />&#160;&#160;&#160; &lt;groupId&gt;javax.xml.stream&lt;/groupId&gt;      <br />&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.javax.xml.stream&lt;/artifactId&gt;      <br />&#160;&#160;&#160; &lt;version&gt;1.0.1&lt;/version&gt;      <br />&lt;/dependency&gt;</p>
</blockquote>
<p>最新的hibernate是3.3.2.ga，由于slf4j版本需要1.5.2以上，高于当前spring-dm1.1.2环境的1.5.0，另外hibernate 3.3.x新增的特性暂时不用，所以暂时用3.2.6。</p>
<h4>设置config.ini文件</h4>
<p>在config.ini文件增加以下bundle的启动设置：</p>
<blockquote><p><a href="mailto:com.springsource.antlr.jar@start,com.springsource.javassist.jar@start,com.springsource.org.apache.commons.collections.jar@start,com.springsource.org.dom4j.jar@start,com.springsource.javax.xml.stream.jar@start,com.springsource.org.objectweb.asm.jar@start,com.springsource.org.objectweb.asm.attrs.jar@start,com.springsource.org.hibernate.jar@start">com.springsource.antlr.jar@start,com.springsource.javassist.jar@start,com.springsource.org.apache.commons.collections.jar@start,com.springsource.org.dom4j.jar@start,com.springsource.javax.xml.stream.jar@start,com.springsource.org.objectweb.asm.jar@start,com.springsource.org.objectweb.asm.attrs.jar@start,com.springsource.org.hibernate.jar@start</a></p>
</blockquote>
<h4>设置MANIFEST.MF文件</h4>
<p>增加：</p>
<blockquote><p>Import-Package: &#8230;,org.hibernate;version=&quot;[3.2.6.ga,3.2.6.ga]&quot;</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/882/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>创建spring-dm和maven驱动的简单webapp</title>
		<link>http://marshal.easymorse.com/archives/877?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2588%259b%25e5%25bb%25baspring-dm%25e5%2592%258cmaven%25e9%25a9%25b1%25e5%258a%25a8%25e7%259a%2584%25e7%25ae%2580%25e5%258d%2595webapp</link>
		<comments>http://marshal.easymorse.com/archives/877#comments</comments>
		<pubDate>Tue, 18 Nov 2008 04:04:36 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/877</guid>
		<description><![CDATA[在osgi环境下运行webapp是很吸引人的特性。它提供了动态部署组件的特性，包括对组件的安装、更新和卸载等；组件的粒度可以小于war这样的构建单位，使组件复用程度得到提高（比如多个webapp可以共享一个hibernate相关的jar文件）。 不过，直接使用比如eclipse的equinox（或者其他osgi框架的实现）和相关的http service bundle创建动态的webapp还是比较麻烦的，spring-dm提供了对osgi开发的简化。 手工使用spring提供的bundle是可以在比如eclipse环境下创建一个基于osgi的开发环境的，比如spring-dm开发简单的web绑定就是实现一个最简单的webapp的步骤，但是，这个过程开发效率还是比较低的。 借助maven，可以使开发进程进一步提高效率。以下以创建支持eclipse的多模块maven项目中示例为基础进一步演化，集成spring-dm。 为web-demo模块增加log4j的配置文件 创建src/main/resources目录，在该目录下创建log4j.properties文件，内容如下： log4j.rootCategory=WARN, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout.ConversionPattern=%t %p [%c{2}] &#8211; %m%n log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.threshold=TRACE log4j.logger.org.springframework.osgi=INFO #log4j.logger.org.springframework=TRACE 为web-demo模块增加osgi清单文件 osgi的清单文件即java的清单文件，只是在该文件中增加osgi自定义的header。在src/main/resources目录下创建META-INF目录，该目录下创建MANIFEST.MF文件，内容为： Web-ContextPath: web-demo Bundle-ManifestVersion: 2 Bundle-Name: Simple OSGi War Bundle-SymbolicName: com.easymorse.marshal.webdemo Bundle-ClassPath: WEB-INF/classes Import-Package: javax.servlet;version=&#34;2.4.0&#34;, javax.servlet.http;version=&#34;2.4.0&#34;, javax.servlet.resources;version=&#34;2.0.0&#34;, javax.servlet.jsp;version=&#34;2.0.0&#34;, javax.servlet.jsp.jstl.core;version=&#34;1.1.2&#34;, javax.servlet.jsp.jstl.fmt;version=&#34;1.1.2&#34;, javax.servlet.jsp.jstl.tlv;version=&#34;1.1.2&#34;, org.apache.taglibs.standard.resources;version=&#34;1.1.2&#34;, org.apache.taglibs.standard.tag.common.core;version=&#34;1.1.2&#34;, org.apache.taglibs.standard.tag.rt.core;version=&#34;1.1.2&#34;, org.apache.taglibs.standard.tei;version=&#34;1.1.2&#34;, org.apache.taglibs.standard.tlv;version=&#34;1.1.2&#34; 这个文件很关键，osgi通过该文件识别将来构建的war为bundle。 为web-demo模块增加依赖类库 pom.xml文件中增加如下依赖类库： &#160;&#160;&#160; &#60;dependency&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;groupId&#62;org.springframework.osgi&#60;/groupId&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>在osgi环境下运行webapp是很吸引人的特性。它提供了动态部署组件的特性，包括对组件的安装、更新和卸载等；组件的粒度可以小于war这样的构建单位，使组件复用程度得到提高（比如多个webapp可以共享一个hibernate相关的jar文件）。</p>
<p> <span id="more-877"></span>
<p>不过，直接使用比如eclipse的equinox（或者其他osgi框架的实现）和相关的http service bundle创建动态的webapp还是比较麻烦的，spring-dm提供了对osgi开发的简化。</p>
<p>手工使用spring提供的bundle是可以在比如eclipse环境下创建一个基于osgi的开发环境的，比如<a href="http://marshal.easymorse.com/archives/772" title="spring-dm开发简单的web绑定">spring-dm开发简单的web绑定</a>就是实现一个最简单的webapp的步骤，但是，这个过程开发效率还是比较低的。</p>
<p>借助maven，可以使开发进程进一步提高效率。以下以<a href="http://marshal.easymorse.com/archives/873" title="创建支持eclipse的多模块maven项目">创建支持eclipse的多模块maven项目</a>中示例为基础进一步演化，集成spring-dm。</p>
<h4>为web-demo模块增加log4j的配置文件</h4>
<p>创建src/main/resources目录，在该目录下创建log4j.properties文件，内容如下：</p>
<blockquote><p>log4j.rootCategory=WARN, stdout     <br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender      <br />log4j.appender.stdout.layout.ConversionPattern=%t %p [%c{2}] &#8211; %m%n      <br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout      <br />log4j.appender.stdout.threshold=TRACE </p>
<p>log4j.logger.org.springframework.osgi=INFO     <br />#log4j.logger.org.springframework=TRACE</p>
</blockquote>
<h4>为web-demo模块增加osgi清单文件</h4>
<p>osgi的清单文件即java的清单文件，只是在该文件中增加osgi自定义的header。在src/main/resources目录下创建META-INF目录，该目录下创建MANIFEST.MF文件，内容为：</p>
<blockquote><p>Web-ContextPath: web-demo     <br />Bundle-ManifestVersion: 2      <br />Bundle-Name: Simple OSGi War      <br />Bundle-SymbolicName: com.easymorse.marshal.webdemo      <br />Bundle-ClassPath: WEB-INF/classes      <br />Import-Package: javax.servlet;version=&quot;2.4.0&quot;,      <br /> javax.servlet.http;version=&quot;2.4.0&quot;,      <br /> javax.servlet.resources;version=&quot;2.0.0&quot;,      <br /> javax.servlet.jsp;version=&quot;2.0.0&quot;,      <br /> javax.servlet.jsp.jstl.core;version=&quot;1.1.2&quot;,      <br /> javax.servlet.jsp.jstl.fmt;version=&quot;1.1.2&quot;,      <br /> javax.servlet.jsp.jstl.tlv;version=&quot;1.1.2&quot;,      <br /> org.apache.taglibs.standard.resources;version=&quot;1.1.2&quot;,      <br /> org.apache.taglibs.standard.tag.common.core;version=&quot;1.1.2&quot;,      <br /> org.apache.taglibs.standard.tag.rt.core;version=&quot;1.1.2&quot;,      <br /> org.apache.taglibs.standard.tei;version=&quot;1.1.2&quot;,      <br /> org.apache.taglibs.standard.tlv;version=&quot;1.1.2&quot;</p>
</blockquote>
<p>这个文件很关键，osgi通过该文件识别将来构建的war为bundle。</p>
<h4>为web-demo模块增加依赖类库</h4>
<p>pom.xml文件中增加如下依赖类库：</p>
<blockquote><p>&#160;&#160;&#160; &lt;dependency&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;servlet-api.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;jsp-api.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.0-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-core&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusions&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;commons-logging&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-test&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusions&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;commons-logging&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;junit&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;junit&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-osgi-test&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.junit&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.junit&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;3.8.2&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;mx4j.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;3.0.2-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;net.sourceforge.cglib&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.net.sf.cglib&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.1.3&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;jasper.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;5.5.23-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;commons-el.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;jstl.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;catalina.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;5.5.23-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;catalina.start.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.0.0&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-osgi-web&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-osgi-web-extender&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-osgi-extender&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2&lt;/version&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.aopalliance&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.org.aopalliance&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.0.0&lt;/version&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-web&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusions&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;aopalliance&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;aopalliance&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;commons-logging&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusions&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;aopalliance&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;aopalliance&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;commons-logging&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;easymock&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;easymock&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.2_Java1.3&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.slf4j&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.slf4j.org.apache.commons.logging&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.5.0&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.slf4j&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.slf4j.api&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.5.0&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.slf4j&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.slf4j.log4j&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.5.0&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusions&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;log4j&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;log4j&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.org.apache.log4j&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.apache.log4j&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/exclusions&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;log4j.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.2.15-SNAPSHOT&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;      <br />&#160;&#160;&#160; &lt;/dependency&gt;</p>
</blockquote>
<h4>为web-demo模块增加构建扩展</h4>
<p>在pom.xml文件build节点内部增加：</p>
<blockquote><p>&lt;extensions&gt;     <br />&#160;&#160;&#160; &lt;extension&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.aws&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-aws-maven&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.2.3&lt;/version&gt;      <br />&#160;&#160;&#160; &lt;/extension&gt;      <br />&lt;/extensions&gt;</p>
</blockquote>
<p>spring针对maven的插件，用于通过amazon s3作为仓库的库文件下载。</p>
<h4>为web-demo模块增加资源的设置</h4>
<p>还是在pom文件的build节点内部：</p>
<blockquote><p>&lt;resources&gt;     <br />&#160;&#160;&#160; &lt;resource&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;directory&gt;src/main/resources&lt;/directory&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;excludes&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclude&gt;META-INF/*&lt;/exclude&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/excludes&gt;      <br />&#160;&#160;&#160; &lt;/resource&gt;      <br />&#160;&#160;&#160; &lt;resource&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;directory&gt;src/main/java&lt;/directory&gt;      <br />&#160;&#160;&#160; &lt;/resource&gt;      <br />&lt;/resources&gt;</p>
</blockquote>
<p>作用是设置哪些目录下的是资源文件。</p>
<h4>为web-demo模块增加插件支持和配置</h4>
<p>在pom文件的plugins节点内部：</p>
<blockquote><p>&lt;plugin&gt;     <br />&#160;&#160;&#160; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;      <br />&#160;&#160;&#160; &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;      <br />&#160;&#160;&#160; &lt;configuration&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;warSourceExcludes&gt;WEB-INF/lib/*&lt;/warSourceExcludes&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;archive&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;manifestFile&gt;src/main/resources/META-INF/MANIFEST.MF&lt;/manifestFile&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/archive&gt;      <br />&#160;&#160;&#160; &lt;/configuration&gt;      <br />&lt;/plugin&gt; </p>
<p>&lt;plugin&gt;     <br />&#160;&#160;&#160; &lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;      <br />&#160;&#160;&#160; &lt;configuration&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filesets&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;fileset&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;directory&gt;META-INF&lt;/directory&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;includes&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;include&gt;MANIFEST.MF&lt;/include&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/includes&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;followSymlinks&gt;false&lt;/followSymlinks&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/fileset&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/filesets&gt;      <br />&#160;&#160;&#160; &lt;/configuration&gt;      <br />&lt;/plugin&gt;</p>
</blockquote>
<p>设置的插件为：</p>
<ol>
<li>maven-war-plugin，用于war打包时包含文件的设置；</li>
<li>maven-clean-plugin，清除临时文件时的设置。</li>
</ol>
<h4>为web-demo模块增加equinox依赖</h4>
<p>这个依赖没有放在上面的dependency中，是因为equinox只是osgi框架的一种，通过profile方式可以灵活更换为其他osgi实现，比如felix。在profiles节点内部：</p>
<blockquote><p>&lt;profile&gt;     <br />&#160;&#160;&#160; &lt;id&gt;equinox&lt;/id&gt;      <br />&#160;&#160;&#160; &lt;dependencies&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;dependency&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.eclipse.osgi&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;org.eclipse.osgi&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;${equinox.ver}&lt;/version&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;type&gt;jar&lt;/type&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;provided&lt;/scope&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/dependency&gt;      <br />&#160;&#160;&#160; &lt;/dependencies&gt;      <br />&#160;&#160;&#160; &lt;properties&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;osgi.test.platform&gt;org.springframework.osgi.test.platform.EquinoxPlatform&lt;/osgi.test.platform&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;log4j.ignoreTCL&gt;true&lt;/log4j.ignoreTCL&gt;      <br />&#160;&#160;&#160; &lt;/properties&gt;      <br />&lt;/profile&gt;</p>
</blockquote>
<h4>为web-demo模块配置maven-dependency-plugin</h4>
<p>maven-dependency-plugin插件也配置在profile中，这样便于灵活决定是否执行，这个配置将会复制所有项目依赖的jar文件到web-demo/libs目录下。</p>
<blockquote><p>&lt;profile&gt;     <br />&#160;&#160;&#160; &lt;id&gt;dependencies&lt;/id&gt;      <br />&#160;&#160;&#160; &lt;build&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;plugins&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;plugin&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;maven-dependency-plugin&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;executions&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;execution&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;copy-dependencies&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;phase&gt;package&lt;/phase&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;goals&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;goal&gt;copy-dependencies&lt;/goal&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/goals&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;configuration&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;outputDirectory&gt;libs&lt;/outputDirectory&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;excludeTransitive&gt;false&lt;/excludeTransitive&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;stripVersion&gt;true&lt;/stripVersion&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/configuration&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/execution&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/executions&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/plugin&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/plugins&gt;      <br />&#160;&#160;&#160; &lt;/build&gt;      <br />&lt;/profile&gt;</p>
</blockquote>
<h4>增加repository的配置信息</h4>
<p>默认maven只使用官方repository，osgi封装成bundle的很多jar需要第三方的repository，加入以下repository可保证所有依赖包都能正常下载使用。</p>
<blockquote><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;eclipse-repository&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Eclipse Repository&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://repo1.maven.org/eclipse/">http://repo1.maven.org/eclipse/</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;com.springsource.repository.bundles.external&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;SpringSource Enterprise Bundle Repository &#8211; External Bundle Releases&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://repository.springsource.com/maven/bundles/external">http://repository.springsource.com/maven/bundles/external</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;com.springsource.repository.bundles.release&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;SpringSource Enterprise Bundle Repository &#8211; SpringSource Bundle Releases&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://repository.springsource.com/maven/bundles/release">http://repository.springsource.com/maven/bundles/release</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-release&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring Portfolio Release Repository&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://maven.springframework.org/release">http://maven.springframework.org/release</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-external&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring Portfolio External Repository&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://maven.springframework.org/external">http://maven.springframework.org/external</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-milestone&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring Portfolio Milestone Repository&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://maven.springframework.org/milestone">http://maven.springframework.org/milestone</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-ext&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring External Dependencies Repository&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;      <br /><a href="http://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/">http://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/</a>      <br />&#160;&#160;&#160;&#160;&#160; &lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;!&#8211; used when building against Spring snapshots &#8211;&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-snapshot&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring Portfolio Milestone Repository&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://maven.springframework.org/snapshot">http://maven.springframework.org/snapshot</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;snapshots&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;enabled&gt;true&lt;/enabled&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/snapshots&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;repository&gt;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;i21-s3-osgi-repo&lt;/id&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;i21 osgi artifacts repo&lt;/name&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;snapshots&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;enabled&gt;true&lt;/enabled&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/snapshots&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://maven.springframework.org/osgi">http://maven.springframework.org/osgi</a>&lt;/url&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/repository&gt;</p>
</blockquote>
<p>这部分代码应复制到总项目pom.xml的repositories节点下面。各个子模块通过继承可以使用到这些repository。</p>
<h4>创建osgi需要的启动文件config.ini</h4>
<p>在web-demo项目中创建libs/configuration目录，在该目录下创建config.ini文件：</p>
<blockquote><p>eclipse.ignoreApp=true     <br />osgi.noShutdown=true      <br />osgi.console=      <br />osgi.clean=true </p>
<p><a href="mailto:osgi.bundles=com.springsource.slf4j.api.jar@start,com.springsource.slf4j.org.apache.commons.logging.jar@start,com.springsource.slf4j.log4j.jar,log4j.osgi.jar@start,com.springsource.org.aopalliance.jar@start,com.springsource.net.sf.cglib.jar@start,spring-aop.jar@start,spring-beans.jar@start,spring-context.jar@start,spring-context-support.jar@start,spring-core.jar@start,spring-web.jar@start,spring-webmvc.jar@start,servlet-api.osgi.jar@start,jsp-api.osgi.jar@start,commons-el.osgi.jar@start,jstl.osgi.jar@start,jasper.osgi.jar@start,mx4j.osgi.jar@start,catalina.osgi.jar@start,catalina.start.osgi.jar@start,spring-osgi-core.jar@start,spring-osgi-io.jar@start,spring-osgi-extender.jar@start,spring-osgi-web.jar@start,spring-osgi-web-extender.jar@start,../target/web_demo.war@start,logging-demo.jar">osgi.bundles=com.springsource.slf4j.api.jar@start,com.springsource.slf4j.org.apache.commons.logging.jar@start,com.springsource.slf4j.log4j.jar,log4j.osgi.jar@start,com.springsource.org.aopalliance.jar@start,com.springsource.net.sf.cglib.jar@start,spring-aop.jar@start,spring-beans.jar@start,spring-context.jar@start,spring-context-support.jar@start,spring-core.jar@start,spring-web.jar@start,spring-webmvc.jar@start,servlet-api.osgi.jar@start,jsp-api.osgi.jar@start,commons-el.osgi.jar@start,jstl.osgi.jar@start,jasper.osgi.jar@start,mx4j.osgi.jar@start,catalina.osgi.jar@start,catalina.start.osgi.jar@start,spring-osgi-core.jar@start,spring-osgi-io.jar@start,spring-osgi-extender.jar@start,spring-osgi-web.jar@start,spring-osgi-web-extender.jar@start,../target/web_demo.war@start,logging-demo.jar</a></p>
</blockquote>
<h4>创建日志模块的日志属性文件</h4>
<p>在logging-demo项目增加src/main/resources目录，在该目录下创建log4j.properties文件：</p>
<blockquote><p>log4j.rootCategory=INFO, stdout     <br />log4j.appender.stdout=org.apache.log4j.ConsoleAppender      <br />log4j.appender.stdout.layout.ConversionPattern=%t %p [%c{2}] &#8211; %m%n      <br />log4j.appender.stdout.layout=org.apache.log4j.PatternLayout      <br />log4j.appender.stdout.threshold=TRACE </p>
<p>#log4j.logger.org.springframework.osgi=TRACE     <br />#log4j.logger.org.apache.catalina=INFO</p>
</blockquote>
<h4>创建日志模块的osgi清单文件</h4>
<p>创建src/main/resources/META-INF目录，在该目录下创建MANIFEST.MF文件：</p>
<blockquote><p>Bundle-ManifestVersion: 2     <br />Bundle-Name: Log4j configuration bundle      <br />Bundle-SymbolicName: com.easymorse.marshal.webdemo.logging.cfg      <br />Fragment-Host: org.springframework.osgi.log4j.osgi</p>
</blockquote>
<h4>日志模块pom文件的修改</h4>
<p>日志模块将打包为jar文件，其中包含清单文件和日志属性文件，需要设置pom文件中的jar打包插件，在pom文件中增加：</p>
<blockquote><p>&lt;build&gt;     <br />&#160;&#160;&#160; &lt;resources&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;resource&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;directory&gt;src/main/resources&lt;/directory&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;excludes&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;exclude&gt;META-INF/*&lt;/exclude&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/excludes&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/resource&gt;      <br />&#160;&#160;&#160; &lt;/resources&gt;      <br />&#160;&#160;&#160; &lt;plugins&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;plugin&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;configuration&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;archive&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;manifestFile&gt;src/main/resources/META-INF/MANIFEST.MF&lt;/manifestFile&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/archive&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/configuration&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/plugin&gt;      <br />&#160;&#160;&#160; &lt;/plugins&gt;      <br />&lt;/build&gt;</p>
</blockquote>
<h4>在web-demo项目中编写web页面供测试</h4>
<p>编写一个静态页面index.html：</p>
<blockquote><p>&lt;html&gt;     <br />&lt;body&gt;      <br />&lt;h2&gt;Hello World!&lt;/h2&gt;      <br />&lt;p&gt;&lt;%=&quot;JSP test success!&quot;%&gt;&lt;/p&gt;      <br />&lt;p&gt;&lt;a href=&quot;helloworld&quot;&gt;Servlet test&lt;/&gt;&lt;/p&gt;      <br />&lt;p&gt;&lt;a href=&quot;jstl.jsp&quot;&gt;JSTL test&lt;/&gt;&lt;/p&gt;      <br />&lt;/body&gt;      <br />&lt;/html&gt;</p>
</blockquote>
<p>编写一个Servlet：</p>
<blockquote><p>package com.easymorse.marshal.servlet; </p>
<p>import java.io.IOException; </p>
<p>import javax.servlet.ServletException;     <br />import javax.servlet.ServletOutputStream;      <br />import javax.servlet.http.HttpServlet;      <br />import javax.servlet.http.HttpServletRequest;      <br />import javax.servlet.http.HttpServletResponse; </p>
<p>public class HelloOsgiWorldServlet extends HttpServlet { </p>
<p>&#160;&#160;&#160; /**     <br />&#160;&#160;&#160;&#160; *       <br />&#160;&#160;&#160;&#160; */      <br />&#160;&#160;&#160; private static final long serialVersionUID = 1L; </p>
<p>&#160;&#160;&#160; protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; resp.setContentType(&quot;text/html&quot;); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; ServletOutputStream out = resp.getOutputStream();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.println(&quot;&lt;html&gt;&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.println(&quot;&lt;head&gt;&lt;title&gt;Hello Osgi World&lt;/title&gt;&lt;/head&gt;&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.println(&quot;&lt;body&gt;&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.println(&quot;&lt;h1&gt;Hello OSGi World&lt;/h1&gt;&quot;);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; out.println(&quot;&lt;/body&gt;&lt;/html&gt;&quot;);      <br />&#160;&#160;&#160; }      <br />}</p>
<p>&#160;</p>
</blockquote>
<p>在web.xml文件中配置该servlet：</p>
<blockquote><p>&lt;servlet&gt;     <br />&#160;&#160;&#160; &lt;servlet-name&gt;HelloOsgiWorldServlet&lt;/servlet-name&gt;      <br />&#160;&#160;&#160; &lt;servlet-class&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; com.easymorse.marshal.servlet.HelloOsgiWorldServlet      <br />&#160;&#160;&#160; &lt;/servlet-class&gt;      <br />&lt;/servlet&gt; </p>
<p>&lt;servlet-mapping&gt;     <br />&#160;&#160;&#160; &lt;servlet-name&gt;HelloOsgiWorldServlet&lt;/servlet-name&gt;      <br />&#160;&#160;&#160; &lt;url-pattern&gt;/helloworld&lt;/url-pattern&gt;      <br />&lt;/servlet-mapping&gt;</p>
</blockquote>
<p>编写一个测试jstl的页面jstl.jsp：</p>
<blockquote><p>&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;<a href="http://java.sun.com/jsp/jstl/core"">http://java.sun.com/jsp/jstl/core&quot;</a> %&gt; </p>
<p>&lt;c:out value=&quot;jstl ok.&quot;/&gt;</p>
</blockquote>
<h4>maven构建</h4>
<p>在根项目目录下执行：</p>
<blockquote><p>mvn install</p>
</blockquote>
<p>在web-demo项目目录下执行：</p>
<blockquote><p>mvn -P dependencies,equinox clean package</p>
</blockquote>
<h4>启动web项目</h4>
<p>在web-demo项目目录下执行：</p>
<blockquote><p>java -jar libs\org.eclipse.osgi.jar</p>
</blockquote>
<h4>访问web项目</h4>
<p>通过浏览器访问：</p>
<blockquote><p><a href="http://localhost:8080/web-demo/">http://localhost:8080/web-demo/</a></p>
</blockquote>
<h4>接下来</h4>
<p>接下来可以：</p>
<ol>
<li>利用spring-dm提供的osgi测试支持为web-demo做集成测试；</li>
<li>集成其他组件，比如hibernate/JPA等。</li>
</ol>
<h4>源代码下载</h4>
<p>通过svn或者web访问：</p>
<blockquote><p><a href="http://easymorse.googlecode.com/svn/tags/multi-modules-demo_2.0.0/">http://easymorse.googlecode.com/svn/tags/multi-modules-demo_2.0.0/</a></p>
</blockquote>
<p>或者本地下载：</p>
[Download not found]
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/877/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>创建支持eclipse的多模块maven项目</title>
		<link>http://marshal.easymorse.com/archives/873?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%2588%259b%25e5%25bb%25ba%25e6%2594%25af%25e6%258c%2581eclipse%25e7%259a%2584%25e5%25a4%259a%25e6%25a8%25a1%25e5%259d%2597maven%25e9%25a1%25b9%25e7%259b%25ae</link>
		<comments>http://marshal.easymorse.com/archives/873#comments</comments>
		<pubDate>Wed, 12 Nov 2008 07:19:12 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/873</guid>
		<description><![CDATA[通过maven可以创建多个关联模块的项目（Multiple Module Projects）。由一个总的模块，下面包含多个子模块（子模块还可以包含子模块）。这种maven功能能支持大型的项目构建，往往大型项目由很多子模块组成。 以下说明在eclipse下如何创建多模块的maven项目。 创建总的POM mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=multi-modules-demo 创建一个maven项目，然后修改该项目的pom.xml文件，package类型改为pom： &#60;packaging&#62;pom&#60;/packaging&#62; 并且删除src目录。 创建子模块 在总模块目录下，创建子模块，比如web-demo： mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=web-demo 再创建一个比如日志模块： mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=logging-demo 在总pom的pom.xml文件中已经自动加入： &#60;modules&#62; &#60;module&#62;web-demo&#60;/module&#62; &#60;module&#62;logging-demo&#60;/module&#62; &#60;/modules&#62; 在各子模块的pom.xml文件中也自动加入了： &#60;parent&#62; &#160; &#60;artifactId&#62;multi-modules-demo&#60;/artifactId&#62; &#160; &#60;groupId&#62;com.easymorse.marshal&#60;/groupId&#62; &#160; &#60;version&#62;1.0-SNAPSHOT&#60;/version&#62; &#60;/parent&#62; 子模块继承了总POM的package，这里需要修改，web-demo模块覆盖为： &#60;packaging&#62;war&#60;/packaging&#62; logging-demo模块修改为 &#60;packaging&#62;jar&#60;/packaging&#62; 对上级模块的特别设置 需要在上级模块中设置java编译的参数，现在eclipse一般都使用比较新的版本，默认jdk是1.6，而maven默认还是1.4。 &#60;plugin&#62; &#160;&#160;&#160; &#60;artifactId&#62;maven-compiler-plugin&#60;/artifactId&#62; &#160;&#160;&#160; &#60;configuration&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;source&#62;1.6&#60;/source&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;target&#62;1.6&#60;/target&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;encoding&#62;UTF-8&#60;/encoding&#62; &#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>通过maven可以创建多个关联模块的项目（Multiple Module Projects）。由一个总的模块，下面包含多个子模块（子模块还可以包含子模块）。这种maven功能能支持大型的项目构建，往往大型项目由很多子模块组成。</p>
<p> <span id="more-873"></span>
<p>以下说明在eclipse下如何创建多模块的maven项目。</p>
<h4>创建总的POM</h4>
<blockquote><p>mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=multi-modules-demo</p>
</blockquote>
<p>创建一个maven项目，然后修改该项目的pom.xml文件，package类型改为pom：</p>
<blockquote><p>&lt;packaging&gt;pom&lt;/packaging&gt;</p>
</blockquote>
<p>并且删除src目录。</p>
<h4>创建子模块</h4>
<p>在总模块目录下，创建子模块，比如web-demo：</p>
<blockquote><p>mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=web-demo</p>
</blockquote>
<p>再创建一个比如日志模块：</p>
<blockquote><p>mvn archetype:create -DgroupId=com.easymorse.marshal -DartifactId=logging-demo</p>
</blockquote>
<p>在总pom的pom.xml文件中已经自动加入：</p>
<blockquote><pre>&lt;modules&gt;
  &lt;module&gt;web-demo&lt;/module&gt;
  &lt;module&gt;logging-demo&lt;/module&gt;
&lt;/modules&gt;</pre>
</blockquote>
<pre>在各子模块的pom.xml文件中也自动加入了：</pre>
<blockquote>
<p>&lt;parent&gt;<br />
    <br />&#160; &lt;artifactId&gt;multi-modules-demo&lt;/artifactId&gt; </p>
<p>&#160; &lt;groupId&gt;com.easymorse.marshal&lt;/groupId&gt; </p>
<p>&#160; &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt; </p>
<p>&lt;/parent&gt;</p>
</blockquote>
<p>子模块继承了总POM的package，这里需要修改，web-demo模块覆盖为：</p>
<blockquote>
<p>&lt;packaging&gt;war&lt;/packaging&gt;</p>
</blockquote>
<p>logging-demo模块修改为</p>
<blockquote>
<p>&lt;packaging&gt;jar&lt;/packaging&gt;</p>
</blockquote>
<h4>对上级模块的特别设置</h4>
<p>需要在上级模块中设置java编译的参数，现在eclipse一般都使用比较新的版本，默认jdk是1.6，而maven默认还是1.4。</p>
<blockquote>
<p>&lt;plugin&gt;<br />
    <br />&#160;&#160;&#160; &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt; </p>
<p>&#160;&#160;&#160; &lt;configuration&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;source&gt;1.6&lt;/source&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;target&gt;1.6&lt;/target&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;encoding&gt;UTF-8&lt;/encoding&gt; </p>
<p>&#160;&#160;&#160; &lt;/configuration&gt; </p>
<p>&lt;/plugin&gt;</p>
</blockquote>
<h4>对web子模块的特别设置</h4>
<p>web子模块（web-demo）依赖它的日志模块logging-demo。设置pom.xml：</p>
<blockquote>
<p>&lt;dependency&gt;<br />
    <br />&#160; &lt;groupId&gt;com.easymorse.marshal&lt;/groupId&gt; </p>
<p>&#160; &lt;artifactId&gt;logging-demo&lt;/artifactId&gt; </p>
<p>&#160; &lt;version&gt;1.0-SNAPSHOT&lt;/version&gt; </p>
<p>&lt;/dependency&gt;</p>
</blockquote>
<p>web子模块在生成eclipse项目时，需要wtp支持，需要设置eclipse插件：</p>
<blockquote>
<p>&lt;build&gt;<br />
    <br />&#160;&#160;&#160; &lt;plugins&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;plugin&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;maven-eclipse-plugin&lt;/artifactId&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;configuration&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;wtpmanifest&gt;true&lt;/wtpmanifest&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;wtpapplicationxml&gt;true&lt;/wtpapplicationxml&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;wtpversion&gt;2.0&lt;/wtpversion&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/configuration&gt; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/plugin&gt; </p>
<p>&#160;&#160;&#160; &lt;/plugins&gt; </p>
<p>&lt;/build&gt;</p>
</blockquote>
<h4>生成Eclipse项目</h4>
<p>在multi-modules-demo项目根目录下：</p>
<blockquote>
<p>mvn eclipse:eclipse</p>
</blockquote>
<p>然后，通过eclipse的import项目导入，可发现两个项目：</p>
<ol>
<li>logging-demo </li>
<li>web-demo </li>
</ol>
<p>都导入进来。导入可能会出现错误，主要是因为没有设置maven的类路径变量&#8220;M2_REPO&#8221;，可以设置这个类变量到maven的本地repository陌路即可。</p>
<p>如果要在eclipse中使用m2eclipse，需要使用：</p>
<blockquote>
<p>mvn eclipse:m2eclipse</p>
</blockquote>
<p>这样就不需要设置M2_REPO类库变量了。</p>
<h4>接下来</h4>
<p>接下来可以：</p>
<ol>
<li>通过eclipse配置的tomcat运行web-demo；</li>
<li>通过maven的tomcat或者jetty插件运行web-demo（需要配置pom.xml文件）；</li>
<li>为项目打包便于分发和部署。</li>
</ol>
<h4>源代码的下载</h4>
<p>本文源代码见：</p>
<blockquote>
<p><a href="http://easymorse.googlecode.com/svn/tags/multi-modules-demo_1.0.0/">http://easymorse.googlecode.com/svn/tags/multi-modules-demo_1.0.0/</a></p>
</blockquote>
<p>或者通过本地下载：</p>
[Download not found]
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/873/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过pax-construct创建spring-dm项目</title>
		<link>http://marshal.easymorse.com/archives/783?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e9%2580%259a%25e8%25bf%2587pax-construct%25e5%2588%259b%25e5%25bb%25baspring-dm%25e9%25a1%25b9%25e7%259b%25ae</link>
		<comments>http://marshal.easymorse.com/archives/783#comments</comments>
		<pubDate>Mon, 03 Nov 2008 16:49:16 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[pax]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/783</guid>
		<description><![CDATA[通过pax-construct创建spring-dm项目，因为借助了maven，所以特别方便。有关pax-construct的准备工作，见：通过pax-construct创建osgi项目。 创建项目： pax-create-project -g com.easymorse.marshal -a spring 进入创建的项目目录，为pax设置导入spring-dm的相关包的仓库： pax-add-repository -i com.springsource.repository.bundles.external -u http://repository.springsource.com/maven/bundles/external 导入spring-dm指定版本绑定： pax-import-bundle -g org.springframework.osgi -a spring-osgi-extender -v 1.1.2 &#8212; -DimportTransitive -DwidenScope 创建一个osgi服务绑定： pax-create-bundle -p org.example.service &#8212; -Djunit 创建一个spring-dm bean： pax-create-bundle -p org.example.bean &#8212; -Dspring -Djunit 构建，使用了equinox代替了默认的felix： mvn clean install pax:provision &#34;-Dframework=equinox&#34; 创建为eclipse项目： mvn clean install pax:eclipse -DdownloadSources 最后，就是通过eclipse导入该项目。 如果以上脚本片段使用有问题，可能是页面中字符&#8220;&#8211;&#8221;被转换为&#8220;&#8212;&#8221;，可参考以下脚本附件：]]></description>
			<content:encoded><![CDATA[<p>通过pax-construct创建spring-dm项目，因为借助了maven，所以特别方便。有关pax-construct的准备工作，见：<a href="http://marshal.easymorse.com/archives/782" title="通过pax-construct创建osgi项目">通过pax-construct创建osgi项目</a>。</p>
<p>创建项目：</p>
<blockquote><p>pax-create-project -g com.easymorse.marshal -a spring</p>
</blockquote>
<p> <span id="more-783"></span>
<p>进入创建的项目目录，为pax设置导入spring-dm的相关包的仓库：</p>
<blockquote><p>pax-add-repository -i com.springsource.repository.bundles.external -u <a href="http://repository.springsource.com/maven/bundles/external">http://repository.springsource.com/maven/bundles/external</a></p>
</blockquote>
<p>导入spring-dm指定版本绑定：</p>
<blockquote><p>pax-import-bundle -g org.springframework.osgi -a spring-osgi-extender -v 1.1.2 &#8212; -DimportTransitive -DwidenScope</p>
</blockquote>
<p>创建一个osgi服务绑定：</p>
<blockquote><p>pax-create-bundle -p org.example.service &#8212; -Djunit</p>
</blockquote>
<p>创建一个spring-dm bean：</p>
<blockquote><p>pax-create-bundle -p org.example.bean &#8212; -Dspring -Djunit</p>
</blockquote>
<p>构建，使用了equinox代替了默认的felix：</p>
<blockquote><p>mvn clean install pax:provision &quot;-Dframework=equinox&quot;</p>
</blockquote>
<p>创建为eclipse项目：</p>
<blockquote><pre>mvn clean install pax:eclipse -DdownloadSources</pre>
</blockquote>
<p>最后，就是通过eclipse导入该项目。</p>
<p>如果以上脚本片段使用有问题，可能是页面中字符&#8220;&#8211;&#8221;被转换为&#8220;&#8212;&#8221;，可参考以下脚本附件：</p>
[Download not found]
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/783/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>spring-dm开发简单的web绑定</title>
		<link>http://marshal.easymorse.com/archives/772?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-dm%25e5%25bc%2580%25e5%258f%2591%25e7%25ae%2580%25e5%258d%2595%25e7%259a%2584web%25e7%25bb%2591%25e5%25ae%259a</link>
		<comments>http://marshal.easymorse.com/archives/772#comments</comments>
		<pubDate>Thu, 30 Oct 2008 16:28:10 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/772</guid>
		<description><![CDATA[spring-dm1.1可支持开发web绑定。基本概念可参考：spring-dm的web支持。以下将在maven创建spring-dm项目和在命令行下运行spring-dm的简单方法涉及的项目基础上，增加web绑定和相关的web支持。 创建web绑定，在eclipse创建一个web项目，只有一个index.html即可。将项目导出打包为war。复制到hh目录下。 复制依赖的绑定，在这里选用的是jetty，所需的绑定可在spring-osgi的分发包的lib或者dist目录中找到： spring-osgi-web-1.1.2.jar spring-osgi-web-extender-1.1.2.jar servlet-api.osgi-2.5-SNAPSHOT.jar jetty-6.1.9.jar jetty-util-6.1.9.jar jetty.start.osgi-1.0.0.jar jetty.web.extender.fragment.osgi-1.0.0.jar 修改config.ini文件，增加如下内容即可： spring-osgi-web-1.1.2.jar@start,spring-osgi-web-extender-1.1.2.jar@start,servlet-api.osgi-2.5-SNAPSHOT.jar@start,jetty-6.1.9.jar@start,jetty-util-6.1.9.jar@start,jetty.start.osgi-1.0.0.jar@start,jetty.web.extender.fragment.osgi-1.0.0.jar@start,first_web.war@start 注意，war格式可以作为绑定直接使用。 下载该项目：]]></description>
			<content:encoded><![CDATA[<p>spring-dm1.1可支持开发web绑定。基本概念可参考：<a href="http://marshal.easymorse.com/archives/769" title="spring-dm的web支持">spring-dm的web支持</a>。以下将在<a href="http://marshal.easymorse.com/archives/677" title="maven创建spring-dm项目">maven创建spring-dm项目</a>和<a href="http://marshal.easymorse.com/archives/735" title="在命令行下运行spring-dm的简单方法">在命令行下运行spring-dm的简单方法</a>涉及的项目基础上，增加web绑定和相关的web支持。</p>
<p> <span id="more-772"></span><strong>创建web绑定</strong>，在eclipse创建一个web项目，只有一个index.html即可。将项目导出打包为war。复制到hh目录下。
</p>
<p><strong>复制依赖的绑定</strong>，在这里选用的是jetty，所需的绑定可在spring-osgi的分发包的lib或者dist目录中找到：</p>
<ul>
<li>spring-osgi-web-1.1.2.jar </li>
<li>spring-osgi-web-extender-1.1.2.jar </li>
<li>servlet-api.osgi-2.5-SNAPSHOT.jar </li>
<li>jetty-6.1.9.jar </li>
<li>jetty-util-6.1.9.jar </li>
<li>jetty.start.osgi-1.0.0.jar </li>
<li>jetty.web.extender.fragment.osgi-1.0.0.jar </li>
</ul>
<p><strong>修改config.ini文件</strong>，增加如下内容即可：</p>
<blockquote><p><a href="mailto:spring-osgi-web-1.1.2.jar@start,spring-osgi-web-extender-1.1.2.jar@start,servlet-api.osgi-2.5-SNAPSHOT.jar@start,jetty-6.1.9.jar@start,jetty-util-6.1.9.jar@start,jetty.start.osgi-1.0.0.jar@start,jetty.web.extender.fragment.osgi-1.0.0.jar@start,first_web.war@start">spring-osgi-web-1.1.2.jar@start,spring-osgi-web-extender-1.1.2.jar@start,servlet-api.osgi-2.5-SNAPSHOT.jar@start,jetty-6.1.9.jar@start,jetty-util-6.1.9.jar@start,jetty.start.osgi-1.0.0.jar@start,jetty.web.extender.fragment.osgi-1.0.0.jar@start,first_web.war@start</a></p>
</blockquote>
<p><strong>注意</strong>，war格式可以作为绑定直接使用。</p>
<p><strong>下载该项目：</strong></p>
[Download not found]
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/772/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在命令行下运行spring-dm的简单方法</title>
		<link>http://marshal.easymorse.com/archives/735?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%259c%25a8%25e5%2591%25bd%25e4%25bb%25a4%25e8%25a1%258c%25e4%25b8%258b%25e8%25bf%2590%25e8%25a1%258cspring-dm%25e7%259a%2584%25e7%25ae%2580%25e5%258d%2595%25e6%2596%25b9%25e6%25b3%2595</link>
		<comments>http://marshal.easymorse.com/archives/735#comments</comments>
		<pubDate>Mon, 27 Oct 2008 08:36:13 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/735</guid>
		<description><![CDATA[在spring-dm开发简单的绑定中介绍了编写spring绑定的方法。运行在eclipse环境中。如果需要单独部署，可这样做（不是最优方案，是最简单的）： 还是以helloworldService为例。 将dependency目录下的所有jar文件复制到一个单独的文件夹中，比如c:/hh。将target目录下生成的helloworldService-0.0.1-SNAPSHOT.jar也复制到该目录下。 在c:/hh目录下创建configuration目录，并创建config.ini文件，内容如下： osgi.bundles=com.springsource.net.sf.cglib-2.1.3.jar@start, com.springsource.org.aopalliance-1.0.0.jar@start, com.springsource.org.apache.commons.logging-1.1.1.jar@start, helloworldService-0.0.1-SNAPSHOT.jar@start, org.springframework.aop-2.5.5.A.jar@start, org.springframework.beans-2.5.5.A.jar@start, org.springframework.context-2.5.5.A.jar@start, org.springframework.core-2.5.5.A.jar@start, org.springframework.osgi.core-1.1.2.A.jar@start, org.springframework.osgi.extender-1.1.2.A.jar@start, org.springframework.osgi.io-1.1.2.A.jar@start 即除osgi包（org.eclipse.osgi-3.4.2.R34x_v20080826-1230.jar）以外，其他需要加入equinox osgi中的绑定都需要按照jar文件名@start[,]语法写在osgi.bundles项下。 然后，就可以运行了（在命令行，hh目录下）： java -jar org.eclipse.osgi-3.4.2.R34x_v20080826-1230.jar -console 效果和在eclipse下控制台差不多。执行ss后： 上述环境的打包下载： 如果在运行期间configuration目录下有错误日志，内容如： java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini). &#160;&#160;&#160; at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:74) &#160;&#160;&#160; at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386) &#160;&#160;&#160; at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) &#160;&#160;&#160; at org.eclipse.core.runtime.adaptor.EclipseStarter.main(EclipseStarter.java:150) &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://marshal.easymorse.com/archives/730" title="spring-dm开发简单的绑定">spring-dm开发简单的绑定</a>中介绍了编写spring绑定的方法。运行在eclipse环境中。如果需要单独部署，可这样做（不是最优方案，是最简单的）：</p>
<p> <span id="more-735"></span>
<p>还是以helloworldService为例。</p>
<p>将dependency目录下的所有jar文件复制到一个单独的文件夹中，比如c:/hh。将target目录下生成的helloworldService-0.0.1-SNAPSHOT.jar也复制到该目录下。</p>
<p>在c:/hh目录下创建configuration目录，并创建config.ini文件，内容如下：</p>
<blockquote><p>osgi.bundles=com.springsource.net.sf.cglib-2.1.3.jar@start, com.springsource.org.aopalliance-1.0.0.jar@start, com.springsource.org.apache.commons.logging-1.1.1.jar@start, helloworldService-0.0.1-SNAPSHOT.jar@start, org.springframework.aop-2.5.5.A.jar@start, org.springframework.beans-2.5.5.A.jar@start, org.springframework.context-2.5.5.A.jar@start, org.springframework.core-2.5.5.A.jar@start, org.springframework.osgi.core-1.1.2.A.jar@start, org.springframework.osgi.extender-1.1.2.A.jar@start, <a href="mailto:org.springframework.osgi.io-1.1.2.A.jar@start">org.springframework.osgi.io-1.1.2.A.jar@start</a></p>
</blockquote>
<p>即除osgi包（org.eclipse.osgi-3.4.2.R34x_v20080826-1230.jar）以外，其他需要加入equinox osgi中的绑定都需要按照<em>jar文件名@start[,]</em>语法写在osgi.bundles项下。</p>
<p>然后，就可以运行了（在命令行，hh目录下）：</p>
<blockquote><p>java -jar org.eclipse.osgi-3.4.2.R34x_v20080826-1230.jar -console</p>
</blockquote>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/k.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="408" alt="k" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/k-thumb.png" width="644" border="0" /></a></p>
<p>效果和在eclipse下控制台差不多。执行ss后：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/hh.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="384" alt="hh" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/hh-thumb.png" width="566" border="0" /></a></p>
<p>上述环境的打包下载：</p>
[Download not found]
<p>如果在运行期间configuration目录下有错误日志，内容如：</p>
<blockquote><p>java.lang.IllegalStateException: Unable to acquire application service. Ensure that the org.eclipse.core.runtime bundle is resolved and started (see config.ini).     <br />&#160;&#160;&#160; at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:74)      <br />&#160;&#160;&#160; at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:386)      <br />&#160;&#160;&#160; at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)      <br />&#160;&#160;&#160; at org.eclipse.core.runtime.adaptor.EclipseStarter.main(EclipseStarter.java:150)</p>
<p>&#160;</p>
</blockquote>
<p>可在config.ini文件中增加：</p>
<blockquote><p>eclipse.ignoreApp=true</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/735/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>spring-dm开发简单的绑定</title>
		<link>http://marshal.easymorse.com/archives/730?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-dm%25e5%25bc%2580%25e5%258f%2591%25e7%25ae%2580%25e5%258d%2595%25e7%259a%2584%25e7%25bb%2591%25e5%25ae%259a</link>
		<comments>http://marshal.easymorse.com/archives/730#comments</comments>
		<pubDate>Sun, 26 Oct 2008 22:28:37 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/730</guid>
		<description><![CDATA[记录一下使用spring-dm、eclipse、maven创建绑定的步骤。 使用环境 jdk 1.6.0_07； eclipse 3.4； maven 2.0.9； spring 2.5.5； spring dm 1.1.2。 具体步骤 安装m2eclipse http://m2eclipse.codehaus.org/update/ 通过help&#62;software updates&#8230;在线安装。 只需安装maven integration即可，不需要安装optional components。 创建maven项目 下面是创建完成的效果，项目名称helloworldService： 转换为plug-in项目 在转换后项目中增加的内容： 第一次运行 第一次运行，通过如下方式： 运行后，控制台可能打印一些异常，类似下面的BundleException： 不过不影响使用，使用ss命令，后面跟项目名称，查看绑定的状态： 虽然是空的项目，但是却表示一个绑定，而且当前处于active状态。 创建新的运行配置 上面的运行，默认带了很多不相干的eclipse绑定，而且有些是不可用的。重新创建一个简化的可用的运行配置并再次运行helloworldService绑定。 然后创建新的osgi framework运行配置： 在对话框更新如下标示内容： 这回运行不再报错了。 可以看到，只有两个绑定，一个是eclipse osgi，另一个是helloworldService。 设置maven，导入对spring的库依赖 在pom.xml文件中增加如下内容，主要是导入对spring相关库的依赖以及为了导入这些库需要的仓库。 &#60;dependencies&#62; &#160;&#160;&#160; &#60;dependency&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;groupId&#62;org.springframework&#60;/groupId&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;artifactId&#62;spring-test&#60;/artifactId&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;version&#62;2.5.5&#60;/version&#62; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#60;scope&#62;test&#60;/scope&#62; &#160;&#160;&#160; &#60;/dependency&#62; &#160;&#160;&#160; &#60;dependency&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>记录一下使用spring-dm、eclipse、maven创建绑定的步骤。</p>
<h3>使用环境</h3>
<ul>
<li>jdk 1.6.0_07； </li>
<li>eclipse 3.4； </li>
<li>maven 2.0.9； </li>
<li>spring 2.5.5； </li>
<li>spring dm 1.1.2。 </li>
</ul>
<p> <span id="more-730"></span><br />
<h3>具体步骤</h3>
<p><strong>安装m2eclipse</strong></p>
<blockquote><p><a href="http://m2eclipse.codehaus.org/update/">http://m2eclipse.codehaus.org/update/</a></p></blockquote>
<p>通过help&gt;software updates&#8230;在线安装。</p>
<p>只需安装maven integration即可，不需要安装optional components。</p>
<p><strong>创建maven项目</strong></p>
<p>下面是创建完成的效果，项目名称helloworldService：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/1.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="1" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/1-thumb.png" width="244" border="0" /></a> </p>
<p><strong>转换为plug-in项目</strong></p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="2" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/2-thumb.png" width="490" border="0" /></a> </p>
<p>在转换后项目中增加的内容：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/3.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="3" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/3-thumb.png" width="198" border="0" /></a> </p>
<p><strong>第一次运行</strong></p>
<p>第一次运行，通过如下方式：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/4.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="232" alt="4" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/4-thumb.png" width="660" border="0" /></a></p>
<p>运行后，控制台可能打印一些异常，类似下面的BundleException：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/5.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="264" alt="5" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/5-thumb.png" width="644" border="0" /></a> </p>
<p>不过不影响使用，使用ss命令，后面跟项目名称，查看绑定的状态：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="168" alt="6" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/6-thumb.png" width="244" border="0" /></a> </p>
<p>虽然是空的项目，但是却表示一个绑定，而且当前处于active状态。</p>
<p><strong>创建新的运行配置</strong></p>
<p>上面的运行，默认带了很多不相干的eclipse绑定，而且有些是不可用的。重新创建一个简化的可用的运行配置并再次运行helloworldService绑定。</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/7.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="125" alt="7" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/7-thumb.png" width="244" border="0" /></a> </p>
<p>然后创建新的osgi framework运行配置：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/8.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="8" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/8-thumb.png" width="208" border="0" /></a> </p>
<p>在对话框更新如下标示内容：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/9.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="439" alt="9" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/9-thumb.png" width="644" border="0" /></a></p>
<p>这回运行不再报错了。 可以看到，只有两个绑定，一个是eclipse osgi，另一个是helloworldService。</p>
<p><strong>设置maven，导入对spring的库依赖</strong></p>
<p>在pom.xml文件中增加如下内容，主要是导入对spring相关库的依赖以及为了导入这些库需要的仓库。</p>
<blockquote><p>&lt;dependencies&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-test&lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-core&lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-context&lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;spring-beans&lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.5.5&lt;/version&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;scope&gt;test&lt;/scope&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&lt;/dependencies&gt;       <br />&lt;build&gt;       <br />&#160;&#160;&#160; &lt;plugins&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;plugin&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;configuration&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;archive&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;manifestFile&gt;META-INF/MANIFEST.MF       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/manifestFile&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/archive&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/configuration&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/plugin&gt;       <br />&#160;&#160;&#160; &lt;/plugins&gt;       <br />&lt;/build&gt;       <br />&lt;pluginRepositories&gt;       <br />&#160;&#160;&#160; &lt;pluginRepository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;maven-repo&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;maven repo&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://repo1.maven.org/maven2/">http://repo1.maven.org/maven2/</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/pluginRepository&gt;       <br />&#160;&#160;&#160; &lt;pluginRepository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;agilejava&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://agilejava.com/maven/">http://agilejava.com/maven/</a>&lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/pluginRepository&gt;       <br />&lt;/pluginRepositories&gt;       <br />&lt;repositories&gt;       <br />&#160;&#160;&#160; &lt;repository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;eclipse-repository&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Eclipse Repository&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://repo1.maven.org/eclipse/">http://repo1.maven.org/eclipse/</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/repository&gt;       <br />&#160;&#160;&#160; &lt;repository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;safehaus-repository&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Safehaus Repository&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;<a href="http://m2.safehaus.org">http://m2.safehaus.org</a>&lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/repository&gt;       <br />&#160;&#160;&#160; &lt;repository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-ext&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring External Dependencies Repository&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt;       <br /><a href="http://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/">http://springframework.svn.sourceforge.net/svnroot/springframework/repos/repo-ext/</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/repository&gt;       <br />&#160;&#160;&#160; &lt;repository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-release&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring Portfolio Release Repository&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt; <a href="http://s3.amazonaws.com/maven.springframework.org/release">http://s3.amazonaws.com/maven.springframework.org/release</a>&lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/repository&gt;       <br />&#160;&#160;&#160; &lt;repository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-external&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring Portfolio Release Repository&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt; <a href="http://s3.amazonaws.com/maven.springframework.org/external">http://s3.amazonaws.com/maven.springframework.org/external</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/repository&gt;       <br />&#160;&#160;&#160; &lt;repository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;spring-milestone&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;Spring Portfolio Milestone Repository&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt; <a href="http://s3.amazonaws.com/maven.springframework.org/milestone">http://s3.amazonaws.com/maven.springframework.org/milestone</a>       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/repository&gt;       <br />&#160;&#160;&#160; &lt;repository&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;id&gt;i21-s3-osgi-repo&lt;/id&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;name&gt;i21 osgi artifacts repo&lt;/name&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;snapshots&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;enabled&gt;true&lt;/enabled&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/snapshots&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url&gt; <a href="http://s3.amazonaws.com/maven.springframework.org/osgi">http://s3.amazonaws.com/maven.springframework.org/osgi</a>&lt;/url&gt;       <br />&#160;&#160;&#160; &lt;/repository&gt;       <br />&lt;/repositories&gt;</p>
<p>&#160;</p>
</blockquote>
<p>这一步做完并保存，m2eclipse将自动导入pom.xml文件中声明的导入库：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/11.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="201" alt="11" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/11-thumb.png" width="244" border="0" /></a></p>
<p><strong>通过m2eclipse执行maven的install </strong></p>
<p>和通过命令行执行：</p>
<blockquote><p>mvn install</p>
</blockquote>
<p>效果相同，使用m2eclipse执行：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/12.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="229" alt="12" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/12-thumb.png" width="644" border="0" /></a> </p>
<p><strong>编写POJI和POJO</strong></p>
<p>编写一个HelloWorldService接口：</p>
<blockquote><p>package com.easymorse.marshal; </p>
<p>public interface HelloWorldService {      <br />&#160;&#160;&#160; public void sayHello();       <br />}</p>
</blockquote>
<p>编写该接口的实现，HelloWorldServiceImpl：</p>
<blockquote><p>package com.easymorse.marshal; </p>
<p>public class HelloWorldServiceImpl implements HelloWorldService {      <br />&#160;&#160;&#160; public HelloWorldServiceImpl() {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;&#8212;&#8212;&#8212;&#8212;&#8211;&gt;new HelloWorldService start&quot;);       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; @Override      <br />&#160;&#160;&#160; public void sayHello() {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(&quot;Hello!!!!!!!!!!!!!!!!&quot;);       <br />&#160;&#160;&#160; }       <br />}</p>
</blockquote>
<p><strong>编写spring的配置文件</strong></p>
<p>一般根据spring推荐的做法，有关业务服务方面的bean放在一个配置文件中，有关osgi的bean放在另外的配置文件中，这样便于管理。</p>
<p>创建目录：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/13.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="140" alt="13" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/13-thumb.png" width="231" border="0" /></a></p>
<p>创建helloworldService.xml文件：</p>
<blockquote><p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      <br />&lt;beans xmlns=&quot;<a href="http://www.springframework.org/schema/beans" ?="?">http://www.springframework.org/schema/beans&quot;</a>       <br />&#160;&#160;&#160; xmlns:xsi=&quot;<a href="http://www.w3.org/2001/XMLSchema-instance" ?="?">http://www.w3.org/2001/XMLSchema-instance&quot;</a>       <br />&#160;&#160;&#160; xsi:schemaLocation=&quot;<a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>       <br /><a href="http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" ?="?">http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&quot;</a>&gt;       <br />&#160;&#160;&#160; &lt;bean id=&quot;helloworldService&quot; class=&quot; com.easymorse.marshal.HelloWorldServiceImpl&quot; /&gt;       <br />&lt;/beans&gt;</p>
</blockquote>
<p>创建helloworldService-osgi.xml：</p>
<blockquote><p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;      <br />&lt;beans:beans xmlns=&quot;<a href="http://www.springframework.org/schema/osgi" ?="?">http://www.springframework.org/schema/osgi&quot;</a>       <br />&#160;&#160;&#160; xmlns:xsi=&quot;<a href="http://www.w3.org/2001/XMLSchema-instance" ?="?">http://www.w3.org/2001/XMLSchema-instance&quot;</a> xmlns:beans=&quot;<a href="http://www.springframework.org/schema/beans" ?="?">http://www.springframework.org/schema/beans&quot;</a>       <br />&#160;&#160;&#160; xsi:schemaLocation=&quot;<a href="http://www.springframework.org/schema/osgi">http://www.springframework.org/schema/osgi</a>       <br /><a href="http://www.springframework.org/schema/osgi/spring-osgi.xsd">http://www.springframework.org/schema/osgi/spring-osgi.xsd</a>       <br /><a href="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a>       <br /><a href="http://www.springframework.org/schema/beans/spring-beans.xsd" ?="?">http://www.springframework.org/schema/beans/spring-beans.xsd&quot;</a>&gt;       <br />&#160;&#160;&#160; &lt;service id=&quot;helloworldServiceOsgi&quot; ref=&quot;helloworldService&quot;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; interface=&quot;com.easymorse.marshal.HelloWorldService&quot; /&gt;       <br />&lt;/beans:beans&gt;</p>
</blockquote>
<p><strong>通过spring ide osgi扩展安装目标平台</strong></p>
<p>这里不能使用eclipse内置的平台，而是要使用spring-dm的平台。获取和配置这些的最简单办法就是安装spring ide，并且包括osgi可选项。</p>
<p>安装的网址：</p>
<blockquote><p><a title="http://dist.springframework.org/snapshot/IDE/nightly" href="http://dist.springframework.org/snapshot/IDE/nightly">http://dist.springframework.org/snapshot/IDE/nightly</a></p>
</blockquote>
<p>这里使用比较新的每日构建版本，发现spring ide osgi extension目前还没有spring-dm1.1版本的target platform。下面演示是使用spring-dm 1.0.2的target platform，目前测试是可以使用。在plug-in development属性中设置spring-dm 1.0.2作为target platform，并load target：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/15.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="108" alt="15" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/15-thumb.png" width="642" border="0" /></a> </p>
<p><strong>编辑plug-in的MANIFEST.MF</strong></p>
<p>设置运行时（runtime）标签页中的导出包（exported package）：</p>
<p>&#160;<a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/151.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="15" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/15-thumb1.png" width="201" border="0" /></a> </p>
<p><strong>修改运行选项</strong></p>
<p>上面运行配置中将target platform去掉了，现在加上：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/16.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="327" alt="16" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/16-thumb.png" width="570" border="0" /></a></p>
<p>运行的效果： </p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/17.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="148" alt="17" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/17-thumb.png" width="579" border="0" /></a> </p>
<p>可以看出是运行在spring-dm 1.0.2上。</p>
<p><strong>手工设置spring-dm 1.1环境</strong></p>
<p>如果需要用到spring-dm 1.1的新特性，可以手工实现环境搭建，不用预置的target platform。首先pom.xml文件的dependencies部分修改为：</p>
<blockquote><p>&lt;dependencies&gt;      <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.aopalliance&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.org.aopalliance       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.0.0&lt;/version&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.org.apache.commons.logging       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.1&lt;/version&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;net.sourceforge.cglib&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;com.springsource.net.sf.cglib       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;2.1.3&lt;/version&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;org.springframework.osgi.core       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2.A&lt;/version&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;org.springframework.osgi.io       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2.A&lt;/version&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.springframework.osgi&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;org.springframework.osgi.extender       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;1.1.2.A&lt;/version&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&#160;&#160;&#160; &lt;dependency&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;groupId&gt;org.eclipse.osgi&lt;/groupId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;artifactId&gt;org.eclipse.osgi&lt;/artifactId&gt;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;version&gt;3.4.2.R34x_v20080826-1230&lt;/version&gt;       <br />&#160;&#160;&#160; &lt;/dependency&gt;       <br />&lt;/dependencies&gt;</p>
</blockquote>
<p>然后执行maven的复制依赖库的插件：</p>
<blockquote><p>mvn dependency:copy-dependencies</p>
</blockquote>
<p>在target/dependency目录下应该复制了所有依赖的绑定jar文件。</p>
<p>导入这些绑定，通过eclipse的import功能：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/14.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="244" alt="1" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/1-thumb1.png" width="181" border="0" /></a> </p>
<p>取消target platform勾选，通过browse找到项目的dependecy目录：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/21.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="303" alt="2" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/2-thumb1.png" width="588" border="0" /></a></p>
<p>下一步，add all即可，是全部所需的绑定：</p>
<p>&#160;<a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/31.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="295" alt="3" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/3-thumb1.png" width="578" border="0" /></a></p>
<p>完成后，package explorer中增加了其他绑定：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/41.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="287" alt="4" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/4-thumb1.png" width="352" border="0" /></a> </p>
<p>再次运行helloService，可以看到加载spring的日志，其中包括实例化helloService的打印内容：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/51.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="560" alt="5" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/5-thumb1.png" width="474" border="0" /></a></p>
<p>在osgi控制台执行ss，看到所有绑定的状态：</p>
<p>&#160;<a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/61.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="334" alt="6" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/6-thumb1.png" width="517" border="0" /></a></p>
<p>手工执行的好处是，能够了解每个细节，而且可以去除所有不必要的绑定。</p>
<p>总结一下各个绑定（组件）和子系统之间的依赖关系：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/components.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="components" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/components-thumb.png" width="349" border="0" /></a> </p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/27.png"></a></p>
<p><strong>增加跟踪信息</strong>&#160;</p>
<p>上面的启动没有留下日志信息，可以利用run选项里面的tracing标签页增加跟踪信息：</p>
<p><a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/28.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="318" alt="28" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/28-thumb.png" width="545" border="0" /></a></p>
<p>运行时可看到如下跟踪日志，比如加载绑定的耗时等：</p>
<p>&#160;<a href="http://marshal.easymorse.com/wp-content/uploads/2008/10/29.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="223" alt="29" src="http://marshal.easymorse.com/wp-content/uploads/2008/10/29-thumb.png" width="334" border="0" /></a></p>
<h3> 源代码</h3>
<p><a href="http://easymorse.googlecode.com/svn/trunk/osgi/helloworldService/">http://easymorse.googlecode.com/svn/trunk/osgi/helloworldService/</a></p>
<h3>参考文档</h3>
<ul>
<li><em>Eclipse, Maven and Spring DM for OSGi? platform Quick Start</em>，下载见：<a href="http://marshal.easymorse.com/archives/654" title="介绍eclipse、maven和spring dm开发osgi入门的电子书">介绍eclipse、maven和spring dm开发osgi入门的电子书</a> </li>
<li><em><a href="http://static.springframework.org/osgi/docs/1.1.2/reference/html/">Spring Dynamic Modules Reference Guide 1.1.2</a></em> </li>
<li><em><a href="http://beb4ch.com/2008/09/26/spring-dynamic-modules-111-with-eclipse-equinox-34/">Spring Dynamic Modules 1.1.1 with Eclipse Equinox 3.4</a></em> </li>
<li><a href="http://www.springsource.com/repository/app/faq">SpringSource Enterprise Bundle Repository FAQ</a> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/730/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>构建spring-dm的simple-web-app</title>
		<link>http://marshal.easymorse.com/archives/851?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e6%259e%2584%25e5%25bb%25baspring-dm%25e7%259a%2584simple-web-app</link>
		<comments>http://marshal.easymorse.com/archives/851#comments</comments>
		<pubDate>Fri, 18 Jul 2008 08:01:42 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>
		<category><![CDATA[spring-dm simple-web-app]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/851</guid>
		<description><![CDATA[下载spring-dm： http://sourceforge.net/project/showfiles.php?group_id=73357&#38;package_id=227224&#38;release_id=630369 下载with-dependencies.zip的版本。 学习和理解simple-web-app，对使用spring-dm编写web应用作用很大。首先要求安装maven，可参考Maven的安装。另外就是能上网。 在命令行，进入${spring-dm}\src\samples\simple-web-app目录，使用equinox作为osgi框架打包： mvn -P dependencies,equinox clean package 可能需要较长时间，maven自动下载所需到jar文件。 执行成功后，即可通过osgi框架启动一个web应用： java -jar war/libs/org.eclipse.osgi.jar 或者也可使用控制台方式（控制台的具体使用见Equinox的简单使用）： java -jar war/libs/org.eclipse.osgi.jar -console 然后就可以在浏览器访问： http://localhost:8080/simple-web-app/ 这是一个静态页面index.html，访问servlet示例： http://localhost:8080/simple-web-app/helloWorldServlet 访问一个简单的jsp示例： http://localhost:8080/simple-web-app/hello-osgi-world.jsp 访问jsp带JSTL的示例： http://localhost:8080/simple-web-app/jsp-tag-osgi-world.jsp]]></description>
			<content:encoded><![CDATA[<p>下载spring-dm：</p>
<blockquote><p><a title="http://sourceforge.net/project/showfiles.php?group_id=73357&amp;package_id=227224&amp;release_id=630369" href="http://sourceforge.net/project/showfiles.php?group_id=73357&amp;package_id=227224&amp;release_id=630369">http://sourceforge.net/project/showfiles.php?group_id=73357&amp;package_id=227224&amp;release_id=630369</a></p>
</blockquote>
<p>下载<em>with-dependencies.zip</em>的版本。</p>
<p> <span id="more-851"></span>
<p>学习和理解simple-web-app，对使用spring-dm编写web应用作用很大。首先要求安装maven，可参考<a href="http://marshal.easymorse.com/archives/497" title="Maven的安装">Maven的安装</a>。另外就是能上网。</p>
<p>在命令行，进入${spring-dm}\src\samples\simple-web-app目录，使用equinox作为osgi框架打包：</p>
<blockquote><p>mvn -P dependencies,equinox clean package</p>
</blockquote>
<p>可能需要较长时间，maven自动下载所需到jar文件。</p>
<p>执行成功后，即可通过osgi框架启动一个web应用：</p>
<blockquote><p>java -jar war/libs/org.eclipse.osgi.jar</p>
</blockquote>
<p>或者也可使用控制台方式（控制台的具体使用见<a href="http://marshal.easymorse.com/archives/411" title="Equinox的简单使用">Equinox的简单使用</a>）：</p>
<blockquote><p>java -jar war/libs/org.eclipse.osgi.jar -console </p>
</blockquote>
<p>然后就可以在浏览器访问：</p>
<blockquote><p><a href="http://localhost:8080/simple-web-app/">http://localhost:8080/simple-web-app/</a></p>
</blockquote>
<p>这是一个静态页面index.html，访问servlet示例：</p>
<blockquote><p><a href="http://localhost:8080/simple-web-app/helloWorldServlet">http://localhost:8080/simple-web-app/helloWorldServlet</a></p>
</blockquote>
<p>访问一个简单的jsp示例：</p>
<blockquote><p><a href="http://localhost:8080/simple-web-app/hello-osgi-world.jsp">http://localhost:8080/simple-web-app/hello-osgi-world.jsp</a></p>
</blockquote>
<p>访问jsp带JSTL的示例：</p>
<blockquote><p><a href="http://localhost:8080/simple-web-app/jsp-tag-osgi-world.jsp">http://localhost:8080/simple-web-app/jsp-tag-osgi-world.jsp</a></p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/851/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>spring-dm的web支持</title>
		<link>http://marshal.easymorse.com/archives/769?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-dm%25e7%259a%2584web%25e6%2594%25af%25e6%258c%2581</link>
		<comments>http://marshal.easymorse.com/archives/769#comments</comments>
		<pubDate>Sat, 12 Jul 2008 16:19:28 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/769</guid>
		<description><![CDATA[从spring-dm 1.1.0开始，增加了一个主要的特性是对wb应用的支持，这使得部署web程序到osgi变得容易。 在osgi中运行web应用最大的问题是有关资源和类的加载；在web应用中没有绑定空间或者导入包的概念。每个web容器有它自己的类加载继承关系，并且类路径的认定可能和osgi空间冲突。spring-dm通过为web容器和osgi空间桥接来解决这个问题，所以加载不再是问题。功能上独特的是，spring-dm的web支持直接和web容器集成，因此war过程对服务器是完全可控的，包括阻塞io和非阻塞io，线程池，规范的支持（servlet2.3,2.4,2.5）等。支持全部web.xml语法而不需要spring-dm自身做任何解析，也支持所有目标容器自定义的配置文件。一句话，所有目标容器支持的，osgi war通过spring-dm都可用。 osgi绑定和war：war特指对web应用打包的jar。每个war可认为是一个osgi绑定，这还需要定义相应的osgi清单条目。绑定并不要求.jar文件结尾，.war一样可作为绑定安装。 支持的web容器 目前，spring-dm支持tomcat5.5/6和jetty 6.1.8+/6.2。web支持兼容jdk1.4。 使用web支持 WAR和web应用的比较：web应用是war的一个实例。 和非war绑定类似，spring-dm web使用扩展器模式监测和安装war。然而，和标准spring-dm扩展器的一个显著不同是，spring-dm只能用于吃法安装和卸载war，因为实际的web应用的创建和线程管理由web容器管理。这也就是说，spring-dm web只控制向web容器部署和从容器删除war；由web容器创建和管理相应的web应用。 使用spring-dm，安装： spring-osgi-web.jar &#8211; spring-dm web支持； spring-osgi-web-extender.jar &#8211; spring-dm web扩展器。 绑定检查一起动的osgi war绑定（.war扩展名的绑定）并将他们部署到一个支持的web容器中。默认情况，将使用tomcat，不过可以更换为其他自定义服务器比如jetty。当war绑定已停止，spring-dm将停止并卸载与之相关的web应用。和通常web部署不同，servlet类需要显式的作为osgi类路径导入。 当运行一个web应用，它的web容器可启动和实例化它，不需要spring的在META-INF/spring下的.xml文件或者使用spring-dm清单条目。可简单的绑定你所需文件到war，而后通过你使用的web框架启动spring容器。 在osgi中的war类路径 servlet规范定义了war中一系列规则和位置。以下解释这些规范在osgi环境中的处理。 静态资源 当安装一个war绑定时，对于静态资源，spring-dm只认识绑定空间中可用的，WEB-INF目录下资源只能通过ServletContext访问，对远程访问不可见。另外任何类路径下资源可被该应用程序的代码使用，但对外不可见。 servlet 和通常war部署的一个主要区别是，servlet包需要导入才可对war绑定可用。做到这点，在Import-Package条目中增加如下包： Import-Package: javax.servlet,javax.servlet.http,javax.servlet.resources 另外，servlet规范定义了war的类路径，基于预置的位置： WEB-INF/classes WEB-INF/lib/*.jar 而且，每个容器的实现可能提供添加到war类路径的公用类库。因为osgi对war所属类的关联、版本控制、重加载，spring-dm将忽略war预置的位置并总是使用osgi类路径实例。这意味着，war绑定导入的类可使用不在WEB-INF/classes文件夹或者WEB-INF/lib下的jar。这也表明，如果在war osgi类路径不可用的任何类，WEB-INF/classes目录下的该类不被识别。 增加对war预定义位置支持最简单的办法是，将这些加入绑定清单： Bundle-Classpath: .,WEB-INF/classes,WEB-INF/lib/some.jar,WEB-INF/lib/lib.jar 需要确认的是默认Bundle-Classpath位置（.）要加上，逗号之间没有空格。 注意：目前osgi API没有提供绑定处理前的回调，spring-dm不能提供可靠的自动化这个过程的方式。然而，我们正在寻找合适的解决方法。bnd工具可以在打包期间增加这些条目。 在为嵌入的库创建条目前，需考虑是否可将他们安装为osgi绑定，这样他们可以让其他war共享，并且osgi可进行版本控制，多版本的同一个库，可在同一个vm中很好的共存。 JSP 对于jsp，spring-dm集成了tomcat jasper2引擎，可支持jsp1.2，2.0和2.1。osgi版本的jasper可在spring-dm osgi仓库中找到。不需要为osgi绑定导入jasper类。 标签库 JSP规范允许创建标签库。spring-dm扩展了jsp的约定，标签库可放置在war类路径或者导入包或者最为绑定。 spring-dm自动查找绑定中可用的tld，并使之对jasper引擎可用。tag定义是自动查找的，而标签类则不是，不过，osgi类路径优先。 当处理类库导出的大量标签时，可使用Require-Bundle代替Import-Package导入标签： Require-Bundle: org.springframework.osgi.jstl.osgi [...]]]></description>
			<content:encoded><![CDATA[<p>从spring-dm 1.1.0开始，增加了一个主要的特性是对wb应用的支持，这使得部署web程序到osgi变得容易。</p>
<p> <span id="more-769"></span>
<p>在osgi中运行web应用最大的问题是有关资源和类的加载；在web应用中没有绑定空间或者导入包的概念。每个web容器有它自己的类加载继承关系，并且类路径的认定可能和osgi空间冲突。spring-dm通过为web容器和osgi空间桥接来解决这个问题，所以加载不再是问题。功能上独特的是，spring-dm的web支持直接和web容器集成，因此war过程对服务器是完全可控的，包括阻塞io和非阻塞io，线程池，规范的支持（servlet2.3,2.4,2.5）等。支持全部web.xml语法而不需要spring-dm自身做任何解析，也支持所有目标容器自定义的配置文件。一句话，所有目标容器支持的，osgi war通过spring-dm都可用。</p>
<p><strong>osgi绑定和war：</strong>war特指对web应用打包的jar。每个war可认为是一个osgi绑定，这还需要定义相应的osgi清单条目。绑定并不要求<em>.jar</em>文件结尾，<em>.war</em>一样可作为绑定安装。</p>
<h3>支持的web容器</h3>
<p>目前，spring-dm支持tomcat5.5/6和jetty 6.1.8+/6.2。web支持兼容jdk1.4。</p>
<h3>使用web支持</h3>
<p><strong>WAR和web应用的比较：</strong>web应用是war的一个实例。</p>
<p>和非war绑定类似，spring-dm web使用扩展器模式监测和安装war。然而，和标准spring-dm扩展器的一个显著不同是，spring-dm只能用于吃法安装和卸载war，因为实际的web应用的创建和线程管理由web容器管理。这也就是说，spring-dm web只控制向web容器部署和从容器删除war；由web容器创建和管理相应的web应用。</p>
<p>使用spring-dm，安装：</p>
<ul>
<li>spring-osgi-web.jar &#8211; spring-dm web支持； </li>
<li><code>spring-osgi-web-extender.jar</code> &#8211; spring-dm web扩展器。 </li>
</ul>
<p>绑定检查一起动的osgi war绑定（.war扩展名的绑定）并将他们部署到一个支持的web容器中。默认情况，将使用tomcat，不过可以更换为其他自定义服务器比如jetty。当war绑定已停止，spring-dm将停止并卸载与之相关的web应用。和通常web部署不同，servlet类需要显式的作为osgi类路径导入。</p>
<p>当运行一个web应用，它的web容器可启动和实例化它，不需要spring的在META-INF/spring下的.xml文件或者使用spring-dm清单条目。可简单的绑定你所需文件到war，而后通过你使用的web框架启动spring容器。</p>
<h3>在osgi中的war类路径</h3>
<p>servlet规范定义了war中一系列规则和位置。以下解释这些规范在osgi环境中的处理。</p>
<h4>静态资源</h4>
<p>当安装一个war绑定时，对于静态资源，spring-dm只认识绑定空间中可用的，WEB-INF目录下资源只能通过ServletContext访问，对远程访问不可见。另外任何类路径下资源可被该应用程序的代码使用，但对外不可见。</p>
<h4>servlet</h4>
<p>和通常war部署的一个主要区别是，servlet包需要导入才可对war绑定可用。做到这点，在<code><em>Import-Package</em>条目中增加如下包：</code></p>
<blockquote><pre>Import-Package: javax.servlet,javax.servlet.http,javax.servlet.resources</pre>
</blockquote>
<pre>另外，servlet规范定义了war的类路径，基于预置的位置：</pre>
<ul>
<li><font face="Courier New">WEB-INF/classes</font> </li>
<li><font face="Courier New">WEB-INF/lib/*.jar</font> </li>
</ul>
<p><font face="Courier New">而且，每个容器的实现可能提供添加到war类路径的公用类库。因为osgi对war所属类的关联、版本控制、重加载，spring-dm将忽略war预置的位置并总是使用osgi类路径实例。这意味着，war绑定导入的类可使用不在WEB-INF/classes文件夹或者WEB-INF/lib下的jar。这也表明，如果在war osgi类路径不可用的任何类，WEB-INF/classes目录下的该类不被识别。</font></p>
<p><font face="Courier New">增加对war预定义位置支持最简单的办法是，将这些加入绑定清单：</font></p>
<blockquote>
<pre>Bundle-Classpath: .,WEB-INF/classes,WEB-INF/lib/some.jar,WEB-INF/lib/lib.jar</pre>
</blockquote>
<p>需要确认的是默认Bundle-Classpath位置（.）要加上，逗号之间没有空格。</p>
<p><strong>注意：</strong>目前osgi API没有提供绑定处理前的回调，spring-dm不能提供可靠的自动化这个过程的方式。然而，我们正在寻找合适的解决方法。bnd工具可以在打包期间增加这些条目。</p>
<p>在为嵌入的库创建条目前，需考虑是否可将他们安装为osgi绑定，这样他们可以让其他war共享，并且osgi可进行版本控制，多版本的同一个库，可在同一个vm中很好的共存。</p>
<h4>JSP</h4>
<p>对于jsp，spring-dm集成了tomcat jasper2引擎，可支持jsp1.2，2.0和2.1。osgi版本的jasper可在spring-dm osgi仓库中找到。不需要为osgi绑定导入jasper类。</p>
<h5>标签库</h5>
<p>JSP规范允许创建标签库。spring-dm扩展了jsp的约定，标签库可放置在war类路径或者导入包或者最为绑定。</p>
<p>spring-dm自动查找绑定中可用的tld，并使之对jasper引擎可用。tag定义是自动查找的，而标签类则不是，不过，osgi类路径优先。</p>
<p>当处理类库导出的大量标签时，可使用<code>Require-Bundle</code>代替Import-Package导入标签：</p>
<blockquote>
<pre>Require-Bundle: org.springframework.osgi.jstl.osgi</pre>
</blockquote>
<p>用上面的清单条目，JSTL所有类，可被war绑定访问。</p>
<p><strong>警告：</strong>在大规模使用Require-Bundle前，阅读osgi规范（3.13）深入了解隐含的语义。</p>
<h3>配置web扩展器</h3>
<p>略。</p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/769/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>spring-dm 1.1新特性</title>
		<link>http://marshal.easymorse.com/archives/673?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-dm-11%25e6%2596%25b0%25e7%2589%25b9%25e6%2580%25a7</link>
		<comments>http://marshal.easymorse.com/archives/673#comments</comments>
		<pubDate>Sat, 12 Jul 2008 07:28:20 +0000</pubDate>
		<dc:creator>Marshal</dc:creator>
				<category><![CDATA[计算机技术]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jee]]></category>
		<category><![CDATA[osgi]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[spring-dm]]></category>

		<guid isPermaLink="false">http://marshal.easymorse.com/archives/673</guid>
		<description><![CDATA[在1.0版本的基础上，增加了如下特性： web support (Servlet, JSP, Taglibs) for OSGi applications Spring-MVC integration classpath scanning customization hooks for Spring-DM extender and web extender event notifications for OSGi service importers and application contexts refined OSGi proxy infrastructure &#8216;greedy-proxy&#8217; functionality for OSGi collections integration with SpringSource Bundle Repository support for custom locations for Spring powered bundles pluggable mechanism for [...]]]></description>
			<content:encoded><![CDATA[<p>在1.0版本的基础上，增加了如下特性：</p>
<ol>
<li>web support (Servlet, JSP, Taglibs) for OSGi applications</li>
<li>Spring-MVC integration</li>
<li>classpath scanning</li>
<li>customization hooks for Spring-DM extender and web extender</li>
<li>event notifications for OSGi service importers and application contexts</li>
<li>refined OSGi proxy infrastructure</li>
<li>&#8216;greedy-proxy&#8217; functionality for OSGi collections</li>
<li>integration with SpringSource Bundle Repository</li>
<li>support for custom locations for Spring powered bundles</li>
<li>pluggable mechanism for determining service dependencies</li>
<li>access to native OSGi ServiceReference for OSGi importers</li>
<li>new web sample</li>
</ol>
<p><em>原文见：</em><a href="http://forum.springframework.org/showthread.php?t=56895"><em>http://forum.springframework.org/showthread.php?t=56895</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://marshal.easymorse.com/archives/673/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

