经过我一段努力终于将这个关于TongWeb插件搞定,期间也走了一些弯路,现在把大致的过程介绍一下:要想在eclispse的server视图中添加Tongweb选项,千万不能硬来,直接通过修改server视图的源码来达到此目的,这样做很费劲,原因有二:一、你等于把server要实现的功能,自己再重现实现一下,看看它复杂的源码,你会觉得你要干的绝对是一个惊人的工程;二,这样做的话,也不符合插件可重用的特点。刚开始我也是想着改server视图的源码,后来,发现那是一个不可能的事,太难了。实际上,要想在srever视图中添加自己服务的选现,就要搞搞另外一个插件org.eclipse.jst.server.generic.core,有人说可以看看tongcat的server视图的插件,但是tomcat的这个插件做得太完美了,而且tomcat自己定义了自己的一套东西,像Jboss,Websphere,Oracle OC4J Standalone Server等他们公用一套东西。所以选择看看org.eclipse.jst.server.generic.core插件,这样你可以抽取适用于Jboss,Websphere,Oracle OC4J Standalone Server这几类服务的共性东西,
这项工作大致分一下几步:
第一步:从plugin.xml文件搞起,在server视图中添加新的Tongweb服务
<extension
point="org.eclipse.wst.server.core.runtimeTypes">
<runtimeType
class="org.eclipse.jst.server.generic.core.internal.GenericServerRuntime"
description="description"
id="org.eclipse.jst.server.kingserver.runtimeType2"
name="%genericCategory"
vendor="TongWeb1"
version="1.0">
<moduleType types="jst.web" versions="2.2, 2.3, 2.4, 2.5,3.0" />
<moduleType types="jst.ejb" versions="1.1, 2.0, 2.1, 3.0" />
<moduleType types="jst.connector" versions="1.0, 1.5" />
<moduleType types="jst.ear" versions="1.2, 1.3, 1.4, 5.0" />
<moduleType types="jst.utility" versions="1.0" />
</runtimeType>
</extension>
此扩展点定义了新建Tongweb服务的选择项,其中的moduleType定义了Tongweb支持的几种项目的类型。其中,在GenericServerRuntime中的validate()方法中添加关于启动服务的路径验证。
<extension
point="org.eclipse.wst.server.core.serverTypes">
<serverType
runtime="true"
behaviourClass="org.eclipse.jst.server.kingserver.core.TongwebServerBehaviour"
class="org.eclipse.jst.server.generic.core.internal.GenericServer"
description="%pluginDescription"
id="org.eclipse.jst.server.kingserver.tongweb1"
initialState="stopped"
launchConfigId="org.eclipse.jst.server.kingserver.core.launchConfigurationType"
name="%genericCategory"
startBeforePublish="true" hasConfiguration="false" launchModes="run"
runtimeTypeId="org.eclipse.jst.server.kingserver.runtimeType2">
</serverType>
</extension>
此扩展点添加Tongweb的一些启动配置选项,launchConfigId="org.eclipse.jst.server.kingserver.core.launchConfigurationType"中指定启动Tongweb的类,TongwebServerBehaviour实际上是关于Tongweb的一些配置描述,主要是添加一些关于获取Tongweb启动参数的方法,
<extension
point="org.eclipse.wst.server.ui.wizardFragments">
<fragment
class="org.eclipse.jst.server.generic.ui.internal.GenericServerRuntimeWizardFragment"
id="org.eclipse.jst.server.kingserver.runtime"
typeIds="org.eclipse.jst.server.kingserver.runtimeType2"/>
<fragment
class="org.eclipse.jst.server.generic.ui.internal.GenericServerWizardFragment"
id="org.eclipse.jst.server.kingserver.server"
typeIds="org.eclipse.jst.server.kingserver.tongweb1"/>
</extension>
<extension
point="org.eclipse.wst.server.ui.serverImages">
<image
icon="icons/tongweb1.gif"
id="org.eclipse.jst.server.kingserver.image1"
typeIds="org.eclipse.jst.server.kingserver.tongweb1">
</image>
</extension>
此扩展点主要是在新建的向导页中加入Tongwen启动的选项,org.eclipse.wst.server.ui.serverImages这个扩展点是添加向导页中所需要的图片
有了以上的这些配置,我们立刻就能在server视图中添加新的Tongweb服务。
<extension point="org.eclipse.jst.server.generic.core.serverdefinition">
<serverdefinition id="org.eclipse.jst.server.kingserver.runtimeType2" definitionfile="/serverdef/tongweb.serverdef">
</serverdefinition>
</extension>
此扩展点主要是通过加载tongweb.serverdef文件,gerneric server插件会专门去解析这个tongweb.serverdef文件,所以,要想tongweb的配置正确,多多阅读serverdef的定义标准,很关键。这里面有关于serverdef文件的解释
http://www.eclipse.org/webtools/jst/components/server/tutorials/genericServers/ServerDefinitionExplained.html 反正我看了好几遍。
<property id="wasAdminID" label="%wasAdminID"
type="string" context="server" default="admin" />
在新建服务向导中添加关于启动Tongweb服务的配置属性,包括指定Tongweb的目录,启动的端口等
<module>
<type>jst.web</type>
<publishDir>${wasHome}/autodeploy</publishDir>
<publisherReference>org.eclipse.jst.server.generic.antpublisher</publisherReference>
</module>
配置Tongweb服务的应用部署的方式,
<start>
<mainClass>com.tongweb.server.PELaunch</mainClass>
<programArguments>start</programArguments>
<workingDirectory>${wasHome}</workingDirectory>
<vmParameters>-Xms800m -Xmx800m -Xmn400m -XX:+UnlockDiagnosticVMOptions -XX:PermSize=128m -XX:MaxPermSize=128m -XX:NewRatio=2 -XX:+LogVMOutput -XX:LogFile=${wasHome}/bin/../logs/jvm.log -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.util.logging.manager=com.tongweb.server.logging.ServerLogManager -Djava.library.path=${wasHome}/bin/../lib:${JAVA_HOME}/bin:${wasHome}/bin/../bin -Djava.endorsed.dirs=${wasHome}/bin/../lib/endorsed -Djavax.management.builder.initial=com.tongweb.advance.admin.AppServerMBeanServerBuilder -Djava.security.auth.login.config=${wasHome}/bin/../config/login.conf -Djmx.invoke.getters=true -Djava.ext.dirs=${JAVA_HOME}/lib/ext:${JAVA_HOME}/jre/lib/ext:${wasHome}/bin/../lib/ext:${wasHome}/bin/../javadb/lib -Dtongweb.root=${wasHome}/bin/.. -Djava.awt.headless=true -Dtongweb.serverName=server -Dtongweb.verbose=true -Djava.rmi.server.RMIClassLoaderSpi=com.tongweb.server.TongWebRMIClassLoader -Djavax.net.ssl.keyStore=${wasHome}/bin/../config/server.keystore -Djavax.net.ssl.trustStore=${wasHome}/bin/../config/cacerts -Djava.security.policy=${wasHome}/bin/../config/server.policy -Dtongweb.environmentFactory=com.tongweb.config.serverbeans.AppserverConfigEnvironmentFactory -Dtongweb.pluggable.repository=com.tongweb.advance.server.pluggable.EEPluggableFeatureImpl -Dtongweb.logFile=${wasHome}/bin/../logs/server.log -Dtongweb.configFile=${wasHome}/bin/../config -Dtongweb.identity=false -Dtongweb.taglibs=twns-jstl.jar,jsf-impl.jar -Dtongweb.taglisteners=jsf-impl.jar -Dtongweb.classloader.sharedChainJars=${wasHome}/bin/../lib/ant/lib/ant.jar -Dtongweb.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar -Dtongweb.classloader.excludesList=admin-cli.jar,twns-anttask.jar,twns-el.jar -Dtongweb.classloader.appserverChainJars=admin-cli.jar,j2ee-svc.jar</vmParameters>
<classpathReference>tongweb.launch</classpathReference>
</start>
<stop>
<mainClass>com.tongweb.server.PELaunch</mainClass>
<programArguments>stop</programArguments>
<vmParameters>-Xmx512m -XX:+UnlockDiagnosticVMOptions -XX:MaxPermSize=192m -XX:NewRatio=2 -XX:+LogVMOutput -XX:LogFile=${wasHome}/bin/../logs/jvm.log -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.util.logging.manager=com.tongweb.server.logging.ServerLogManager -Djava.library.path=${wasHome}/bin/../lib:../j2sdk-image-product/bin:${wasHome}/bin/../bin -Djava.endorsed.dirs=${wasHome}/bin/../lib/endorsed -Djavax.management.builder.initial=com.tongweb.advance.admin.AppServerMBeanServerBuilder -Djava.security.auth.login.config=${wasHome}/bin/../config/login.conf -Djmx.invoke.getters=true -Djava.ext.dirs=../j2sdk-image-product/lib/ext:../j2sdk-image-product/jre/lib/ext:${wasHome}/bin/../lib/ext:${wasHome}/bin/../javadb/lib -Dtongweb.root=${wasHome}/bin/.. -Dtongweb.serverName=server -Dtongweb.verbose=true -Djava.rmi.server.RMIClassLoaderSpi=com.tongweb.server.TongWebRMIClassLoader -Djavax.net.ssl.keyStore=${wasHome}/bin/../config/server.keystore -Djavax.net.ssl.trustStore=${wasHome}/bin/../config/cacerts -Djava.security.policy=${wasHome}/bin/../config/server.policy -Dtongweb.environmentFactory=com.tongweb.config.serverbeans.AppserverConfigEnvironmentFactory -Dtongweb.pluggable.repository=com.tongweb.advance.server.pluggable.EEPluggableFeatureImpl -Dtongweb.logFile=${wasHome}/bin/../logs/server.log -Dtongweb.configFile=${wasHome}/bin/../config -Dtongweb.identity=false -Dtongweb.taglibs=twns-jstl.jar,jsf-impl.jar -Dtongweb.taglisteners=jsf-impl.jar -Dtongweb.classloader.sharedChainJars=${wasHome}/bin/../lib/ant/lib/ant.jar -Dtongweb.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar -Dtongweb.classloader.excludesList=admin-cli.jar,twns-anttask.jar -Dtongweb.classloader.appserverChainJars=admin-cli.jar,j2ee-svc.jar</vmParameters>
<workingDirectory>${wasHome}</workingDirectory>
<classpathReference>tongweb.launch</classpathReference>
</stop>
指定Tongweb启动和停止的详细配置参数,
第二步:在server视图中启动新建的Tongweb服务
generic server适配了很多的服务,但是,还没有适配Tongweb,所以他的启动的类需要我们自己来写,Tongweb要想启动,需要配置:工作目录workingDirectory、VM参数、Tongweb启动类、依赖的jar包。这个类需要继承AbstractJavaLaunchConfigurationDelegate类就可以,然后将参数一个一个的加入进来。这个需要慢慢来写,下面是Tongweb在终端启动的命令:
java -classpath /opt/public/jdk1.6.0_18/lib/tools.jar:/usr/TongWeb5.0/bin/../lib/launch.jar:/usr/TongWeb5.0/bin/../lib/license.jar -Xms800m -Xmx800m -Xmn400m -XX:+UnlockDiagnosticVMOptions -XX:PermSize=128m -XX:MaxPermSize=128m -XX:NewRatio=2 -XX:+LogVMOutput -XX:LogFile=/usr/TongWeb5.0/bin/../logs/jvm.log -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=360000 -Djava.util.logging.manager=com.tongweb.server.logging.ServerLogManager -Djava.library.path=/usr/TongWeb5.0/bin/../lib:/opt/public/jdk1.6.0_18/bin:/usr/TongWeb5.0/bin/../bin -Djava.endorsed.dirs=/usr/TongWeb5.0/bin/../lib/endorsed -Djavax.management.builder.initial=com.tongweb.advance.admin.AppServerMBeanServerBuilder -Djava.security.auth.login.config=/usr/TongWeb5.0/bin/../config/login.conf -Djmx.invoke.getters=true -Djava.ext.dirs=/opt/public/jdk1.6.0_18/lib/ext:/opt/public/jdk1.6.0_18/jre/lib/ext:/usr/TongWeb5.0/bin/../lib/ext:/usr/TongWeb5.0/bin/../javadb/lib -Dtongweb.root=/usr/TongWeb5.0/bin/.. -Djava.awt.headless=true -Dtongweb.serverName=server -Dtongweb.verbose=true -Djava.rmi.server.RMIClassLoaderSpi=com.tongweb.server.TongWebRMIClassLoader -Djavax.net.ssl.keyStore=/usr/TongWeb5.0/bin/../config/server.keystore -Djavax.net.ssl.trustStore=/usr/TongWeb5.0/bin/../config/cacerts -Djava.security.policy=/usr/TongWeb5.0/bin/../config/server.policy -Dtongweb.environmentFactory=com.tongweb.config.serverbeans.AppserverConfigEnvironmentFactory -Dtongweb.pluggable.repository=com.tongweb.advance.server.pluggable.EEPluggableFeatureImpl -Dtongweb.logFile=/usr/TongWeb5.0/bin/../logs/server.log -Dtongweb.configFile=/usr/TongWeb5.0/bin/../config -Dtongweb.identity=false -Dtongweb.taglibs=twns-jstl.jar,jsf-impl.jar -Dtongweb.taglisteners=jsf-impl.jar -Dtongweb.classloader.sharedChainJars=/usr/TongWeb5.0/bin/../lib/ant/lib/ant.jar -Dtongweb.classloader.optionalOverrideableChain=webservices-rt.jar,webservices-tools.jar -Dtongweb.classloader.excludesList=admin-cli.jar,twns-anttask.jar,twns-el.jar -Dtongweb.classloader.appserverChainJars=admin-cli.jar,j2ee-svc.jar com.tongweb.server.PELaunch start
其中/opt/public/jdk1.6.0_18/为JDK的路径,/usr/TongWeb5.0/为Tongweb文件路径,有了这个关键参数,启动Tongweb就没什么问题了。
第三步:将应用在Tongweb中部署
虽然,Tongweb能够启动,但是应用去还没有办法部署进来,怎么部署这个应用呢?
首先,需要明白Tongweb的两种部署方式:通过Tongweb的游览器控制台部署和直接将应用的war包放到Tongweb的autodeploy目录下面进行部署,毫无疑问通过server视图中的Tongweb部署应用要采用第二中方式。
这里将应用.war包拷贝到autodeploy目录下面主要采用ant方式,
<extension
point="org.eclipse.jst.server.kingserver.genericpublisher">
<genericpublisher
class="org.eclipse.jst.server.kingserver.core.AntPublisher"
id="org.eclipse.jst.server.generic.antpublisher">
</genericpublisher>
</extension>
通过此扩展点来获取指定Ant的build方式,org.eclipse.jst.server.kingserver.core.AntPublisher为build类,org.eclipse.jst.server.kingserver.genericpublisher扩展点是我们自己定义的,类似于generic server插件的自定义的org.eclipse.jst.server.generic.core。genericpublisher扩展点,有了这些部署应用应该能轻松搞定!