您的位置:首页 > 运维架构 > Tomcat

jbpm 3.2.2+Tomcat 6.0.10+MySQL5.0.27/SQL Server2000部署详解

2010-09-20 10:55 387 查看
jbpm 3.2.2+Tomcat 6.0.10+MySQL5.0.27/SQL Server2000部署详解
大象刚刚接触jBPM,经过这几天的折腾,终于把jbpm-console这个项目在Tomcat6上布署成功了,现在把这几天来的学习经验拿出来和大家分享一下。(结尾处有相关JAR包和MySQL及SQL Server 2000脚本下载)
系统环境:windowsXP-SP2 JDK1.5.0_09 jbpm-jpdl-3.2.2 MySQL5.0.27 Tomcat6.0.10 MSSQL 2000
[b]1、安装JDK1.5.0_09[/b]
不必一定要按我的版本来安装,不过至少JDK应该在1.5以上,JDK安装好以后,设置PATH和CLASSPATH环境变量。
2、安装Tomcat6.0.10
这个没什么好说的,请用6.0的版本,因为大象没在5.0或5.5上测试过,而且这几个版本之间有很大的不同,为了能尽快上手,还是按照我写的来吧。^_^
3、安装MySQL5.0.27
MySQL安装中采用默认安装即可,字符集不用设置为GB2312或GBK,这样做比较通用(大象用的MySQL没有设置)。
4、安装Ant-1.7.0
从apache网站上下载Ant,然后解压,设置PATH环境变量,在CMD中键入ant -version 如果看到:
Apache Ant version 1.7.0 compiled on December 13 2006 (那说明你的PATH环境已经设置好了。)
5、安装jbpm-jpdl-3.2.2
下载jbpm-jpdl-suite-3.2.2,然后解压就行,直接放在根目录下,比如:D:/jbpm-jpdl-3.2.2,这个版本是包含所有的一整套工具,目录下主要包含以下几个子目录:
config —— jBPM及Hibernate与log4j的配置文件
db —— 各种数据库的SQL语句
deploy —— 已经打包好的war包
designer —— jBPM的Eclipse插件,具体在eclipse子目录中
doc —— API文档及用户使用向导
examples —— jBPM自带的例子程序
lib —— 依赖的第三方依赖类库
server —— 一个已经配置好了的基于JBoss的jBPM示例
src —— jBPM的源代码
jbpm-jpdl-suite-3.2.2的下载地址:http://sourceforge.net/project/showfiles.php?group_id=70542
注意看下面一个链接:View older releases from the f) jBPM jPDL 3 package » 这是jbpm以前的版本
6、安装Eclipse3.2.1和MyEclipse5.1.0GA
我使用的是一种整合版本,就是解压后可以直接使用,eclipse和myeclipse已经整合好了(嘿嘿,感觉非常方便,我自己还做了一个Eclipse3.3和MyEclipse6.0的整合版,详情请看:详解Eclipse+MyEclipse完全绿色版制作方法),版本比我的高应该没关系,虽然没试过,但网上有很多人都在高版本上做过,应该没问题。这里就不说安装方法了,网上有很多相关资料。
7、安装jbpm开发插件
虽然布署jbpm-console这个项目不需要用到开发插件,但为了以后的开发,在这里我还是说一下,大象用的版本是3.0.13,为什么使用这个版本呢?因为我试过最新的3.1.3.sp2版,里面可视化编辑流程里左下角没有swimlanes标签,而3.0.13的版本中却有。
3.0.13的下载地址:http://sourceforge.net/project/showfiles.php?group_id=70542&package_id=116692 这个页面可以找到所有的插件版本,当然包括最新版。
下面来说下我的安装方法:



看到这红线框的两个文件夹了吧,大象前面说了,我用的是一种整合版本,解压后就可以直接用了,所以这两个文件夹早就已经存在了,所以如果你们要用的话就像这样建两个文件夹吧,ThirdPlugins是放第三方插件的,Links是放ini配置文件的,下面都会有详细介绍。
将下载的jbpm-gpd-3.0.13解压,复制整个eclipse文件夹,进入ThirdPlugins下,新建一文件夹,命名jbpm-gpd-3.0.13,再在此目录下粘贴eclipse文件夹



另外还需要将plugins目录下的jar包作一下修改,只保留如下两个jar包,因为其它几个jar包在MyEclipse中也有,启动eclipse之后会发生冲突,而且千万不要想当然的,在myeclipse中把同名的jar包用高版本替换,不然你会发现启动之后全是错误,嘿嘿,大象试过,有着血一样的教训,请大家千万不要重蹈覆辙。



此文件内容为:path=ThirdPlugins/jbpm-gpd-3.0.13
OK,到此,插件安装已经全部完成,另外还需要在eclipse中对jBPM作一下设置,同样为了以后开发作准备。
启动eclipse,点击Windows->Preference,中文版为"窗口"->"选项",可以看到:



点击Add,选择Search...找到你解压的jbpm-jpdl-3.2.2文件夹,然后填写Name,点击OK。回到主界面,此时还要勾选Name下的复选框,点击Apply





Server Deployment里面的东西是用来布署流程用的,前提是你得先发布好jbpm-console控制台这个程序,保证这个程序跑起来没有问题,否则是不会成功的。8080端口号和你服务器保持一致,如Tomcat或JBoss,另外布署一个新流程时,一定要先启动服务器。jbpm-console这个名字是默认发布到服务器上的名字,比如Tomcat中,webapps下使用的名字和这个要一样,那个变了,这个也要跟着变,还是保持默认就行。upload不要作修改,这些其实与布署jbpm-console应用没有多大关系,大家看看就行。



8、布署jbpm-console
在jbpm-jpdl-3.2.2/deploy目录下可以看到jbpm-console.war、build.xml(当然还有其它文件,现在我们只关心这两个),在CMD中,进入jbpm-jpdl-3.2.2/deploy目录下,使用命令:ant customize.console.for.tomcat 然后我们在deploy下可以看到多出来customized和target两个文件夹,进入customized,可以看到jbpm-console.war这个文件,用winrar将其解压到当前目录下,这时我们就得到了jbpm-console的发布应用了,不过别高兴,还有很多工作没做呢。这里我来说下,为什么使用ant customize.console.for.tomcat 这个命令,打开build.xml文件,你可以看到这样一段代码:

<target name="customize.console.for.tomcat" description="Creates a customized jbpm-console.war for tomcat in the customized directory">
<mkdir dir="target/war" />
<mkdir dir="customized" />
<unzip src="jbpm-console.war" dest="target/war" />
<copy todir="target/war/WEB-INF/lib">
<fileset dir="../lib">
<include name="activation.jar" />
<include name="antlr*.jar" />
<include name="asm.jar" />
<include name="bsh.jar" />
<include name="cglib.jar" />
<include name="commons-logging.jar" />
<include name="dom4j.jar" />
<include name="hibernate3.jar" />
<include name="jboss-backport-concurrent.jar" />
<include name="jbossretro-rt.jar" />
</fileset>
</copy>
<delete>
<fileset dir="target/war/WEB-INF/lib">
<include name="el-api.jar" />
<include name="el-ri.jar" />
</fileset>
</delete>
<zip destfile="customized/jbpm-console.war">
<fileset dir="target/war" />
</zip>
</target>
大家看到了吧,customize.console.for.tomcat为taget的name,所以这里使用这个命令就不觉得奇怪了,大象开始也觉得很迷惑,为什么网上都这样写,却不写为什么,看来是问题太简单了,那些大大们想来这根本就不是问题。呵呵呵~~~
[b]a、加入必要的jar包
[/b] 在jbpm-console/WEB-INF/lib下要加入以下几个jar包:jboss-j2ee.jar、commons-collections.jar、jsf-api.jar、jsf-impl.jar,删除jsf-api-14.jar和jsf-impl-14.jar这两个jar包。
b、建jBPM数据库
在jbpm-jpdl-3.2.2/db下找到jbpm.jpdl.mysql.sql,打开它删除前面的alter table JBPM_XX部分,保留后面的,然后再在每句SQL语句后面加上分号,检查一下有没有遗漏。然后在MySQL中新建一个jbpm数据库,将sql脚本导入进来,大象使用的是SQLyog可视化操作工具,其它相关的可视化工具非常多,可以任选一种使用,如果你不用这些工具来简化开发,那就配置mysql的PATH环境变量,在命令行中操作吧。^_^
在SQLyog中操作如下:
1、点击菜单"DB"->"Create Database",输入jbpm。
2、点击菜单"Tools"->"Import From SQL Statements...",在弹出窗口中点击"..."按钮,选择jbpm.jpdl.mysql.sql文件,然后再点击Execute按钮。请在点击Execute前确保sql脚本没有语法错误,否则是不可能执行成功的。
c、修改hibernate.cfg.xml文件
修改jbpm-jpdl-3.2.2/deploy/customized/jbpm-console/WEB-INF/classes下hibernate.cfg.xml文件,原配置文件要修改部分如下:

<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- JDBC connection properties (begin) ===
<property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="hibernate.connection.url">jdbc:hsqldb:mem:jbpm</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
==== JDBC connection properties (end) -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!-- DataSource properties (begin) -->
<property name="hibernate.connection.datasource">java:/JbpmDS</property>
<!-- DataSource properties (end) -->

修改后如下:

<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">自己的密码(无密码就空着)</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!-- DataSource properties (begin)
<property name="hibernate.connection.datasource">java:/JbpmDS</property>
DataSource properties (end) -->
d、修改web.xml文件
在jbpm-console/WEB-INF下打开web.xml文件,在servlet前加入以下listener,注意:把listener放在所有的servlet前面,我发现网上很多帖子里都没有提到这一点,不知道他们的程序是怎么跑起来的?残念ING~~~

<listener>
<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

<listener>
<listener-class>com.sun.faces.application.WebappLifecycleListener</listener-class>
</listener>
这两个监听器很关键,大象先一直没有成功的原因就是没有加这个,而这两个监听器都在jsf-impl.jar包中,jbpm-console这个应用可是用jsf来实现的,如果你不加,则会产生如下这些错误:

javax.servlet.ServletException: Servlet.init() for servlet Faces Servlet threw exception
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1202)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:806)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:656)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:469)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at org.apache.catalina.authenticator.FormAuthenticator.forwardToLoginPage(FormAuthenticator.java:316)
at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:244)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:491)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:256)
at javax.faces.webapp.FacesServlet.init(FacesServlet.java:142)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
...16 more

java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:256)
at javax.faces.webapp.FacesServlet.init(FacesServlet.java:142)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1161)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4044)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4350)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:761)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:741)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:920)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:883)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1023)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1015)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
at org.apache.catalina.core.StandardService.start(StandardService.java:448)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2008-8-3 13:03:49 org.apache.catalina.core.StandardContext loadOnStartup
严重: Servlet /jbpm-console threw load() exception
e、修改Tomcat安全验证 有两种方法修改安全验证,第一种是修改%TOMCAT_HOME%/conf下的tomcat-users.xml文件,第二种是在%TOMCAT_HOME%/conf目录下再新建Catalina文件夹,然后再在Catalina文件夹下建localhost文件夹,在此目录下建jbpm-console.xml文件。
[b]i、修改tomcat-users.xml文件
[/b] 修改前请备份tomcat-users.xml文件,修改后的内容如下:

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="user"/>
<role rolename="administrator"/>
<role rolename="manager"/>
<role rolename="sales"/>
<role rolename="hr"/>
<role rolename="admin"/>
<role rolename="participant"/>
<user username="user" password="user" roles="user,sales"/>
<user username="shipper" password="shipper" roles="user,hr"/>
<user username="manager" password="manager" roles="admin,hr,manager,user,sales"/>
<user username="tadmin" password="" roles="admin,manager"/>
<user username="admin" password="admin" roles="admin,user,hr"/>
</tomcat-users>

使用这种方式来处理安全验证将不用考虑向数据库中插入组,角色,用户之类的数据,完全由Tomcat来管理
ii、新建jbpm-console.xml文件
使用这种方式将需要向数据库中插入数据,由jBPM来管理安全验证,jbpm-console.xml文件内容如下:

<Context>
<Realm className="org.apache.catalina.realm.JDBCRealm
driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/jbpm"
connectionName="root"
connectionPassword="自己的密码"
userTable="JBPM_ID_USER u, JBPM_ID_MEMBERSHIP m, JBPM_ID_GROUP g"
userNameCol="g.TYPE_ = 'security-role' AND m.GROUP_ = g.ID_ AND m.USER_ = u.ID_ AND u.NAME_"
userCredCol="DISTINCT u.PASSWORD_"
userRoleTable="JBPM_ID_USER u, JBPM_ID_MEMBERSHIP m, JBPM_ID_GROUP g"
roleNameCol="g.NAME_" />
</Context>
需要向数据库中插入的数据:

INSERT INTO JBPM_ID_GROUP VALUES(1,'G','sales','organisation',NULL);
INSERT INTO JBPM_ID_GROUP VALUES(2,'G','admin','security-role',NULL);
INSERT INTO JBPM_ID_GROUP VALUES(3,'G','user','security-role',NULL);
INSERT INTO JBPM_ID_GROUP VALUES(4,'G','hr','organisation',NULL);
INSERT INTO JBPM_ID_GROUP VALUES(5,'G','manager','security-role',NULL);
INSERT INTO JBPM_ID_USER VALUES(1,'U','user','user@sample.domain','user');
INSERT INTO JBPM_ID_USER VALUES(2,'U','manager','manager@sample.domain','manager');
INSERT INTO JBPM_ID_USER VALUES(3,'U','admin','admin@sample.domain','admin');
INSERT INTO JBPM_ID_USER VALUES(4,'U','shipper','shipper@sample.domain','shipper');
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(1,'M',NULL,NULL,2,4);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(2,'M',NULL,NULL,3,4);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(3,'M',NULL,NULL,4,4);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(4,'M',NULL,NULL,4,3);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(5,'M',NULL,NULL,1,3);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(6,'M',NULL,NULL,2,3);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(7,'M',NULL,NULL,3,3);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(8,'M',NULL,NULL,3,2);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(9,'M',NULL,NULL,2,2);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(10,'M',NULL,NULL,2,5);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(11,'M',NULL,'boss',2,1);
INSERT INTO JBPM_ID_MEMBERSHIP VALUES(12,'M',NULL,NULL,1,1);
这两种方法任选一种即可。
此时基本工作都已经做完,不过在发布前,不要忘了,将MySQL的驱动拷贝到%TOMCAT_HOME%/lib目录下,然后就可以将jbpm-console文件夹复制到%TOMCAT_HOME%/webapps目录下了,接着在bin目录下双击tomcat6.exe启动服务器,等启动过程执行完后,打开IE,输入http://localhost:8080/jbpm-console 回车,应该就能看到jbpm控制台界面了。



到此,在MySQL下的布署就全部结束了,如果能看到这个界面,那恭喜你,你终于成功了!
下面接着说下如何将MySQL数据库换成MS SQL Server 2000,其实很简单,如果在MySQL下布署成功了,只需要将hibernate.cfg.xml文件里的配置改成MS SQL Server 2000的连接方式就行了,另外在2000中建立jbpm的数据库也是必要的。
9、使用SQL Server 2000数据库
在jbpm-jpdl-3.2.2/db下找到jbpm.jpdl.mssql.sql,打开后删除alter table JBPM_XX和drop table JBPM_XX这些语句,这些东东都是用来在以前的版本上做升级用的,我们是新建数据库当然用不到这些了。在SQL Server中新建jbpm数据库,COPY剩下的sql语句,在查询分析器里粘贴,然后执行,这时会有很多警告产生,如下:

警告: 已创建表 'JBPM_DELEGATION',但其最大行大小(8300)超过了每行的最大字节数(8060)。如果结果行长度超过 8060 字节,则此表中行的 INSERT 或 UPDATE 将失败。

警告: 已创建表 'JBPM_LOG',但其最大行大小(18321)超过了每行的最大字节数(8060)。如果结果行长度超过 8060 字节,则此表中行的 INSERT 或 UPDATE 将失败。
这些不用管它,接下来修改hiberate.cfg.xml文件,大象采用的是JTDS驱动的连接方式,修改后的内容如下:

<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:jtds:sqlserver://localhost:1433/jbpm</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">自己的密码(无密码就空着)</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<!-- DataSource properties (begin)
<property name="hibernate.connection.datasource">java:/JbpmDS</property>
DataSource properties (end) -->
不要忘了,还要将JTDS的驱动拷贝到%TOMCAT_HOME%/lib目录下,如果采用的是Tomcat安全验证,此时就不用向数据库插入数据,直接就可以启动服务器运行了。如果采用的是jBPM来管理安全验证,此时则需要将前面提到的数据插入数据库中,在插入前需要修改一下,将每条记录前的ID号去掉,因为数据库中对此字段已经作了标识,不能手动对它设置。数据插入后,就启动服务器看下吧!
写到这里,关于jbpm-console所有的布署都讲完了,大象以上所说的全部都是亲自在电脑上一步一步的做过,绝不会胡乱copy一下网上的东东发出来。如有什么问题,希望和大家一起交流。(如果图片不能显示,在其上点击右键,选择"显示图片")
需要使用的JAR包: 点击下载
SQL脚本: 点击下载
本文为菠萝大象原创,如要转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: