2009年5月4日星期一

DDD(Domain Driven Design)之Package规划

在以前的项目中,“贫血”模型用的比较多,然而“贫血”模型并没有充分发挥DDD的优势,也达不到Domain Objects是业务逻辑的核心作用。

借鉴网络上的一些资料,在新的架构下,自己规划了一下Packages。目前,新架构采用Wicket 1.4 + Guice 2.0 + Warp-persist 2.0 + Hibernate 3.3 框架。如此设计架构,主要是为了进行组件式复用,以及保持架构尽量轻量化。

Packages按层次方式来进行划分(见下图):
  1. domain:放置所有的领域对象,包含model和service两类对象。model下放置DO和Repository接口,DO中包含业务逻辑方法,并可注入Repository进行持久化。service下主要放置涉及多个DO之间存在交互的对

    象。
  2. infrastructure.persistence:放置所有Repository接口的hibernate实现。infrastructure下包含所有的基础实施,譬如:cache,security等。
  3. application:facade模式的应用,主要是为了方便表现层调用。并且可适配多种展现方式,譬如:html、xml等。
  4. guice:放置guice的module。


2009年4月30日星期四

Wicket+Guice+Warp-Persist+Hibernate配置

Wicket1.4中已经有独立的Guice模块,但Guice只是一个IoC框架,不支持对事务等的管理;Warp-Persist是Guice下的一个支持事务管理的框架,它支持多种ORM框架,如:Hibernate、Jpa等。当前,配置Wicket+Guice+Warp-Persist+Hibernate已经非常简单,几个步骤即可:

1. download相应框架的jar包和运行时必须的lib;Guice当前的版本已经升级到2.0 snapshot,只需要guice-core.jar和aopalliance.jar,warp-persist也只需求找一个最新的jar包即可;Wicket和Hibernate所需的lib比较多,主要需要注意cglib和slf4j(日志)。

2. 创建一个Guice的Module,扩展AbstractModule即可。

3. Module中首先装载Warp-Persist:
install(PersistenceService.usingHibernate().across(UnitOfWork.REQUEST).buildModule());

4. 然后配置hibernate configuation,我这里用的是AnnotationConfiguration,切记:configuration中一定要指定current_session_context_class这个参数。hibernate.cfg.xml放在WEB-INF/classes目录下。
AnnotationConfiguration result = new AnnotationConfiguration();
result.configure(ServiceModule.class.getResource("/hibernate.cfg.xml"));
result .setProperty("hibernate.current_session_context_class", "managed");
bind(Configuration.class).toInstance(result);


5. 最后,配置web.xml,一定要注意Warp‘s Filter和WicketFilter的位置,Warp‘s Filter一定要放置在WicketFilter的前面。并且指定WicketFilter的applicationFactoryClassName和module参数。
<filter>
<filter-name>sessionPerRequestFilter<filter-name>
<filter-class>com.wideplay.warp.persist.PersistenceFilter<filter-class>
</filter>
<filter-mapping>
<filter-name>sessionPerRequestFilter<filter-name>
<url-pattern>/*<url-pattern>
</filter-mapping>

<filter>
<filter-name>wicketFilter<filter-name>
<filter-class>org.apache.wicket.protocol.http.WicketFilter<filter-class>

<init-param>
<param-name>applicationFactoryClassName<param-name>
<param-value>org.apache.wicket.guice.GuiceWebApplicationFactory<param-value>
</init-param>
<init-param>
<param-name>module<param-name>
<param-value>com.deversoft.test.guice.WicketModule<param-value>
</init-param>
<init-param>
<param-name>wicket-guice.stage<param-name&gt
<param-value>DEVELOPMENT<param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>wicketFilter<filter-name>
<url-pattern>/*<url-pattern>
</filter-mapping>



参考资料:
  1. Bleeding Edge Transactional Wicket Web Applications with Warp and Guice
  2. Warp
  3. Wicket
  4. Google-Guice

2009年4月29日星期三

Wicket1.4中调用外部资源的方法

在wicket中,要使用js或css文件,需要将这些文件包装成ResourceReference,通过ResourceReference就可以将js或css文件加入到wicket页面对象中。因此,我分别创建了2个Enum对象:DefaultJavascript和DefaultStyle,如下:
public enum DefaultStyle {
Header("header.css"), MainPage("main-page.css");
private String cssName;
DefaultStyle(String cssName) {
this.cssName = cssName;
}

public ResourceReference getResouceReference() {
return new ResourceReference(DefaultStyle.class, cssName);
}
}
通过DefaultStyle来将css文件封装成ResourceReference对象,js文件要照此处理,比较方便。

要将ResourceReference加入到wicket中,在wicket1.4版本中,
加css文件:
add(CSSPackageResource.getHeaderContribution(DefaultStyle.Popup
.getResouceReference()));
加js文件:
add(JavascriptPackageResource.getHeaderContribution(DefaultJavascript.JQuery
.getResouceReference()));
稍微麻烦一点的是对图片的处理,一般存在三种方式:
  1. 如果在页面中使用了Img标签,那可以按上面js或css方式来进行处理,通过ResourceReference对象来包装。
  2. 如果是在css文件中直接使用图片,可以根据css文件与图片文件所在的相对路径来直接设置。譬如:jquery.tab.css文件放在com.deversoft.web.tab包下,tab-bottom.gif图片放在com.deversoft.web.tab.images包下。那在css文件中可以直接通过images/tab-bottom.gif来进行使用。
  3. 如果是在js文件中直接使用图片,需要引用图片ResouceReference对象的路径。譬如,还是上面的图片tab-bottom.gif,在js中调用,就需要这样调用:resources/com.deversoft.web.tab.DefaultImage/tab-bottom.gif。这其实和第一种方式以相同的。

2009年4月20日星期一

可关闭的Wicket TabbedPanel

Wicket中自带的TabbedPanel是不能关闭的,而在项目中,却要使用可以关闭的Tabs,因此参考Wicket Wiki上的例子,自己实现了一套带关闭图标的TabbedPannel。具体实现方式如下:
第一步:创建一个abstract SimpleAbstractTab类,扩展AbstractTab。
public abstract class SimpleAbstractTab extends AbstractTab {
private String title;
private boolean canBeClosed;

public SimpleAbstractTab(IModel iModel, String title, boolean canBeClosed) {
super(iModel);
this.title = title;
this.canBeClosed = canBeClosed;
}

public String getOngletTitle() {
return this.title;
}

public boolean isCanBeClosed() {
return canBeClosed;
}
}

第二步:创建一个SimpleTabbedPanel,扩展TabbedPanel。

public class SimpleTabbedPanel extends Panel {
private static final long serialVersionUID = 1L;
public static final String TAB_PANEL_ID = "panel";

private String whereAmI;
private final List tabs;

public SimpleTabbedPanel(String id, List tabs) {
super(id, new Model(new Integer(-1)));
add(CSSPackageResource.getHeaderContribution(DefaultStyle.TabbedPanel.getResouceReference()));
this.setOutputMarkupId(true);

if (tabs == null) {
throw new IllegalArgumentException("argument [tabs] cannot be null");
}

this.tabs = tabs;

final IModel tabCount = new AbstractReadOnlyModel() {
private static final long serialVersionUID = 1L;

public Object getObject() {
return new Integer(SimpleTabbedPanel.this.tabs.size());
}
};

WebMarkupContainer tabsContainer = new WebMarkupContainer(
"tabs-container") {
private static final long serialVersionUID = 1L;

protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
tag.put("class", getTabContainerCssClass());
}
};
add(tabsContainer);

// add the loop used to generate tab names
tabsContainer.add(new Loop("tabs", tabCount) {
private static final long serialVersionUID = 1L;

protected void populateItem(LoopItem item) {
final int index = item.getIteration();

final WebMarkupContainer titleLink = newLink("link", index);

titleLink.add(newTitle("title", SimpleTabbedPanel.this.tabs
.get(index).getOngletTitle(), index));
item.add(titleLink);

final AjaxLink closeLink = newAjaxLink("closeTab", index);
closeLink.add(new Image("closeImg", DefaultImage.TabClosed.getResouceReference()));
if (!SimpleTabbedPanel.this.tabs.get(index).isCanBeClosed())
closeLink.setVisible(false);
item.add(closeLink);
}

protected LoopItem newItem(int iteration) {
return newTabContainer(iteration);
}

});

this.whereAmI = this.tabs.get(0).getOngletTitle();
}

protected LoopItem newTabContainer(int tabIndex) {
return new LoopItem(tabIndex) {
private static final long serialVersionUID = 1L;

protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
String cssClass = (String) tag.getString("class");
if (cssClass == null) {
cssClass = " ";
}
cssClass += " tab" + getIteration();

if (getIteration() == getSelectedTab()) {
cssClass += " selected";
}
if (getIteration() == getTabs().size() - 1) {
cssClass += " last";
}
tag.put("class", cssClass.trim());
}

};
}

protected void onBeforeRender() {
super.onBeforeRender();
if (!hasBeenRendered() && getSelectedTab() == -1) {
// select the first tab by default
setSelectedTab(0);
}
}

protected String getTabContainerCssClass() {
return "tab-row";
}

public final List getTabs() {
return tabs;
}

protected Component newTitle(String titleId, String title, int index) {
return new Label(titleId, title);
}

public void newTab(AjaxRequestTarget target, SimpleAbstractTab tab) {
this.tabs.add(tab);
this.setSelectedTab(this.tabs.size()-1);
target.addComponent(this);
}

public void removeTab(AjaxRequestTarget target, int index) {
String titleDeletedTab = this.tabs.get(index).getOngletTitle();
this.tabs.remove(index);

if (titleDeletedTab.equals(this.whereAmI)) {
this.setSelectedTab(0);
this.whereAmI = this.tabs.get(0).getOngletTitle();
} else {
this.setSelectedTab(this.findSelectedTab(whereAmI));
}

target.addComponent(this);
}

protected int findSelectedTab(String title) {
int result = 0;
for (int i = 0; i < result =" i;">= tabs.size()) {
throw new IndexOutOfBoundsException();
}

setDefaultModelObject(new Integer(index));

ITab tab = (ITab) tabs.get(index);

Panel panel = tab.getPanel(TAB_PANEL_ID);

if (panel == null) {
throw new WicketRuntimeException(
"ITab.getPanel() returned null. TabbedPanel [" + getPath()
+ "] ITab index [" + index + "]");

}

if (!panel.getId().equals(TAB_PANEL_ID)) {
throw new WicketRuntimeException(
"ITab.getPanel() returned a panel with invalid id ["
+ panel.getId()
+ "]. You must always return a panel with id equal to the provided panelId parameter. TabbedPanel ["
+ getPath() + "] ITab index [" + index + "]");
}

if (get(TAB_PANEL_ID) == null) {
add(panel);
} else {
replace(panel);
}

this.whereAmI = this.tabs.get(index).getOngletTitle();
}

public final int getSelectedTab() {
return ((Integer) getDefaultModelObject()).intValue();
}
}


第三步:同时,创建一个SimpleTabbedPanel.html,页面如下:

[wicket:panel]
[div wicket:id="tabs-container" class="tab-row"]
[ul]
[li wicket:id="tabs"]
[div class="tab"]
[a href="#" wicket:id="link" class="tab-link"][span wicket:id="title"]tab title[/span][/a]
[a href="#" wicket:id="closeTab" class="tab-close"][img wicket:id="closeImg" alt="Close" border=0/][/a]
[/div]
[/li]
[/ul]
[/div]
[div wicket:id="panel" class="tab-panel"]panel[/div]
[/wicket:panel]

第四步:创建一个css文件,并使用一个close的icon。
div.tabpanel div.tab-row ul {
height: 20px;
margin: 0;
padding-left: 10px;
background: url( images/tab_bottom.gif ) repeat-x bottom;
}

div.tabpanel div.tab-row li {
margin: 0;
padding:0 5px 0 0;
display: inline;
list-style-type: none;
}

div.tabpanel div.tab-row div.tab {
float:left;
display:block;
background:#f3f3f3;
padding:5px 7px 4px 20px;
text-decoration:none;
font-weight:bold;
color:#9cf;
border: 1px solid #ccc;
white-space:nowrap;
}

div.tabpanel div.tab-row a.tab-link:link, div.tabpanel div.tab-row a.tab-link:visited {
float: left;
background: #f3f3f3;
font-size: 12px;
line-height: 14px;
font-weight: bold;
padding:5px 10px 4px 10px;
margin-right: 4px;
text-decoration: none;
color: #666;
}

div.tabpanel div.tab-row li.selected a.tab-link:link, div.tabpanel div.tab-row a.tab-link:visited.active {
border-bottom: 1px solid #fff;
background: #fff;
color: #000;
}

div.tabpanel div.tab-row a.tab-link:hover {
background: #fff;
}

div.tabpanel div.tab-row a.tab-close:hover {
background: #B9D4E8;
}

第五步:实现几个panel,如FirstTab等都是自己任意实现的Panel,调用SimpleTabbedPanel

//tabs
final List tabs = new ArrayList();
tabs.add(new SimpleAbstractTab(new Model("first tab"), "simple tab1", true) {
@Override
public Panel getPanel(final String panelId) {
return new FirstTab(panelId);
}
});
final SimpleTabbedPanel tabbedPanel = new SimpleTabbedPanel("tabs", tabs);
add(tabbedPanel);

// The AjaxLink to new tab
add(new AjaxLink("newTab"){
public void onClick(AjaxRequestTarget target) {
tabbedPanel.newTab(target, new SimpleAbstractTab(new Model("first tab"), "new Tab", true) {
@Override
public Panel getPanel(final String panelId) {
return new NewTab(panelId);
}
});
}
});



2009年4月9日星期四

Install Mysql-Proxy 0.7.0 on openSUSE 11.1

steps:
  1. install pkg-config (yast2)
  2. install autotools && libtool && libmysql-devel (yast2)
  3. install libevent(> 1.4.0) && libevent-devel (yast2)
  4. install glib2(>2.0) && glib2-devel (yast2)
  5. install Lua 5.1 && Lua-devel (yast2)
  6. export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/lib/pkgconfig
  7. download mysql-proxy 0.7.0 sources code
  8. ./autogen.sh && ./configuration && make && install
  9. export PATH=$PATH:/usr/local/sbin
  10. mysql-proxy -V


2009年4月7日星期二

VMware Server2.0: install vmware tools

摆弄了VMware server 2.0一段时间,终于找到怎样来安装vmware tool了。当安装完虚机后,可以将虚机add virtual machine to Inventory。这样左边Inventory目录中就会显示该虚机名称。

先启动该虚机,当打开该虚机的summary tab页时,在右边显示的status信息栏中会出现vmware tools的状态,如果已经安装了,就会显示出running;如果没有安装,则会显示【install vmware tool】的链接。点击该链接,虚机中会自动加载vmware tools的cdrom。通过cdrom就可以安装vmware tools了。


2009年4月3日星期五

mysql5主从备份

这两天在虚机(linux)上搭建了mysql5(imysam)的主从备份机制,廖作记录:

Master
  1. new db :2x_db,and new table: test, input some data;
  2. mysqldump 2x_db to 2x_db_dump.sql,then transfer to slave machine;
  3. modify my.cnf:
log-bin = /var/lib/mysql/master.log
log-bin-index = /var/lib/mysql/master.index.log
binlog-do-db = 2x_db
server-id = 1
   4. start mysql,and create replicate user:
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%' IDENTIFIED BY 'replicator';

5. flush privileges;
6.show master status,then record this info

Slave:
1. modify my.cnf:
server-id=2
master-host=master machine's ip
master-user=replicator
master-password=replicator
master-log-file=master.000002 // from show master status: logfile
master-log-pos=98 // from show master status: logPos
master-connect-retry=60
replicate-do-db=2x_db

2. start mysql,then new db: 2x_db
3. load 2x_db.sql into 2x_db
4. login in mysql,show slave status

Test:
1. login in master's mysql,insert one record;
2. then login in slave's mysql,select this table;

2009年3月27日星期五

VMWare Server 2.0 install Debian 5 Linux

vmware server 2.0提供了web管理界面来管理虚机,令人印象深刻。在Debian5上安装vmware server 2.0非常的简单,只要注意几个地方即可:
  1. 使用root用户;
  2. apt-get update,并且install linux-headers-`uname -r`,与内容相同的版本;
  3. debian默认安装了perl,你只需要记住安装gcc 4.1.3,因为vmware需要这个版本的gcc;如果机器上已经有,请ln -s gcc gcc-4.1.3;
  4. 执行./installVmware.pl,即可进行安装,安装过程中需要填的内容,一般缺省即可;
  5. vmware server 2.0需要设置一个datastore path,即存储虚机文件的地方,在web管理界面中,引导iso文件时,只能从该目录中读取;
  6. 安装完成后,通过https://127.0.0.1:8333/来访问,登录用户名使用系统的root帐号。
web管理界面还是比较简洁美观的,vmware的配置、启动都可以实现。但是我没有发现如何安装vmware tool,这是鼠标操作起来就不太方便了,而且好像无法全屏。

2009年3月25日星期三

Mule IDE 2.0的几个问题

    目前,Mule IDE 2.0发布了。试用了一下,总体上来说非常的好使,配置完MULE_HOME,可以创建mule project和mule config file,然后可以在IDE中直接运行起来。不过,也发现了IDE上的几个问题。

    这几天,在了解Mule与Smooks集成方面的东西,在MuleForge上有一个项目:Smooks for Mule,现在已经可以支持Mule 2.1.X了。测试了一下,还不支持最新发布的Mule 2.2版本。

    在Mule 2.1.2 上跑 Smooks for Mule 2.1.x的例子非常的顺畅,但是当使用Mule IDE 2.0来运行同样的例子,就报如下异常:

ERROR 2009-03-26 11:21:03,312 [main] org.mule.config.spring.SpringXmlConfigurationBuilder: Configuration with "org.mule.config.spring.SpringXmlConfigurationBuilder" failed.

org.mule.api.lifecycle.InitialisationException: Initialisation Failure: Error creating bean with name 'BasicService': Cannot create inner bean '(inner bean)' of type [org.mule.routing.outbound.DefaultOutboundRouterCollection] while setting bean property 'outboundRouter'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Cannot create inner bean '(inner bean)' of type [org.milyn.smooks.mule.Router] while setting bean property 'routers' with key [0]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)': Invocation of init method failed; nested exception is org.mule.api.lifecycle.InitialisationException: IOException while trying to get smooks instance:


   没有仔细的查,初步怀疑这是Mule IDE的bug。

   还有一个问题是,Mule IDE指定MULE_HOME以后,它只找到lib目录下的mule和opt目录中jar,而不去寻找user目录下的jar文件。这样,要运行一些其他的应用,必须要把相应的jar文件copy到opt目录中。

2009年3月22日星期日

HTML Select's scrollbars

IE6浏览器中,select中默认是没有horizontal scrollbar,如果option中的文字太长,就没法完整显示;而且option的title属性也不支持。

要实现horizontal scrollbar的效果,可以用DIV来进行模拟。要注意的是select不要设置width。代码示例如下:

<div style="overflow-x:scroll; width:100px; overflow: -moz-scrollbars-horizontal;">
<select size="3">
<option>horizontal scrollbar test example 1</option>
<option>horizontal scrollbar test example 10</option>
<option>horizontal scrollbar test example 100</option>
<option>horizontal scrollbar test example 1000</option>
<option>horizontal scrollbar test example 10000</option>
<select>
</div>


2009年3月20日星期五

一些常用的小工具

列一下自己常用的工具包:
  1. FScapture:抓图工具,比较亮点的是抓完图后,还可对图片做编辑,比如加一个矩形框等;
  2. AdsClrPicker:取色工具,可以取屏幕上任何地方的色彩;
  3. IconWorkshop:图标编辑工具;
  4. FeiQ:即时通讯工具,局域网中的QQ;
  5. Filezilla:FTP工具,包括客户端和服务器;
  6. 7z:压缩工具;
  7. RocketDock:dock条工具,类似于Mac上的Dock;
  8. TortoiseSVN:Subversion客户端;
  9. Google Pinyin:Google拼音输入法;
  10. Evernote:日常记事工具;
  11. HttpWatch:Http查看工具;
  12. FileFox:火狐浏览器,装上插件,功能无限;
  13. UltraEdit:文本编辑器



2009年3月12日星期四

XOM利器:Simple-Xml

一直以来,对XML文件的操作都让我恐惧。所以,一般在项目中,我都不主动引入XML配置文件。有一个项目里,我还用yaml来代替了xml作为配置文件。可以,yml文件对空格、位置排列限制比较严格,用起来不是很好。

这几天,找到了一个新的XOM工具:Simple-Xml。可以通过annotation将xml直接转换为pojo,十分的方便。将一些使用心得整理一下:

  1. 安装设置简单,只需要3个jar包:simple-xml-2.0.3.jar,stax-1.2.0.jar和stax-api-1.0.1.jar;
  2. Annotation使用简单,最常用的有:@Root, @Attribute, @Text, @Element, @ElementList, @ElementMap等;
  3. 可以设置annotation的name属性来匹配xml文件中元素名词,譬如:@Element(name="simple-xml");
  4. 可以使用inline=true来内联数组、列表和Map等;
  5. 可以通过${var}来共享变量,但必须用@Commit提交后方可使用。譬如:<property name="host.name">qdlake</property> <host>${host.name}</host>;
  6. 支持nested object;
  7. 如果有对象继承,根对象上不要使用@Root注解;
  8. @ElementMap注解使用时,会将此元素下的所有属性放入到map中,非常的方便。但切记,需要指定entry和key,并且value必须放置在<property key="k1">VALUE</property>两标签之中位置,不能使用value="v1"的方式;
  9. 不加annotation的字段将不会被处理;
  10. 支持callback,譬如:@Validate,@Commit等。
先写这么多,以后用到其他功能时再补充。

2009年3月10日星期二

Hooking into Equinox: The Hookable Adaptor

前几天正在摆弄equinox的插件体系,模仿equinox的插件,做了相应的简化。今天,看到了EclipseCon 2007上的一篇slide:【Equinox Framework: How to get Hooked】。自己的很多思路与这个有些相像。感觉是个不错的东东,以后有时间再好好看看。

需要了解相关内容,可以参考:Adaptor Hooks

2009年3月6日星期五

Extension-Point和Extension

Eclipse的插件体系设计的非常精到,extension point和extension令人映像深刻。Extension-Point是指系统定义好的,想让别人来扩展的地方,有点类似于电脑主板上的各种插槽,可以插Cpu、内存条等。而Extension是指你根据提供的Extension-Point来进行的扩展实现,类似于你往主板上插上了不同Cpu、内存条。
在自己开发的插件中,可以自己灵活的定义Extension-Point,允许别人来进行扩展。譬如开发一个菜单的插件,然后提供扩展点,允许别人来往菜单上增加菜单项。
这几天,正在了解这方面的知识,Eclipse中的Extension-Point和Extension比较的复杂,自己想“山寨”一个简单一点的。不需要在写.exsd,而是只需要定义OSGI-INF/plugin/ext.xml,在ext.xml来定义extension-point、extension、param-def(name,type[string,class],optional)、param等元素,然后通过各元素的URI来进行绑定。

2009年3月5日星期四

Annotations for OSGi Declarative Services (A4DS)

在OSGi中,涉及到依赖注入的方法有:Declarative Services (DS),Spring DM,iPOJO,Peaberry Guice等。iPOJO本人没有接触过,其它都略有了解。DS和DM都需要写component.xml;Peaberry虽然不需要xml文件,但是需要一些辅助代码,感觉都有些麻烦。

今天,发现一个挺有意思的东西:Annotations for OSGi Declarative Services (A4DS) 。可以通过annotation来生产xml,比较方便。

2009年3月2日星期一

Embedding Equinox in Apusic 5.1

今天测试了一下,Equinox ServletBridge嵌入到Apusic中运行起来,在dos console界面中可输入OSGi的命令。我用的是(wicket + guice + hibernate) in OSGi的方式,访问的URL:http://localhost:6888/bridge/wicket/

servletbridge的目录布局如下:
WEB-INF/
      /web.xml
      /lib/servletbridge.jar
      /eclipse
          /configuration/config.ini
          /features
          /plugins
只要将打好包的jar文件,放入到plugins目录中,并在config.ini中注明@start即可。

Hibernate-OSGi打包

把Hibernate打成符合OSGi规范的包,支持EJB3和annotation,则需要包含以下类包:
antlr.jar
asm.jar
asm-attrs.jar
cglib.jar
dom4j.jar
commons-collections.jar
javassist.jar
jta.jar
log4j.jar
slf4j-log4j12.jar
slf4j-api.jar
ejb3-persistence.jar
hibernate-commons-annotations.jar
hibernate-core.jar
hibernate-annotations.jar

2009年1月6日星期二

equinox 3.5启动参数

equinox 3.5 的启动参数配置如下:

java -Dosgi.console -Dorg.osgi.service.http.port=9090 -jar org.eclipse.osgi_3.5.0.v20081201-1815.jar

注:
-Dosgi.console:控制台
-Dorg.osgi.service.http.port:HTTP端口号
-Dosgi.configuration.area:config.ini文件所在目录