大象刚刚接触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
1、安装JDK1.5.0_09
不必一定要按我的版本来安装,不过至少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文件,你可以看到这样一段代码:
<
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
>
a、加入必要的jar包
在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文件,原配置文件要修改部分如下:
< 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) -->
< 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) -->
在jbpm-console/WEB-INF下打开web.xml文件,在servlet前加入以下listener,注意:把listener放在所有的servlet前面,我发现网上很多帖子里都没有提到这一点,不知道他们的程序是怎么跑起来的?残念ING~~~
< listener-class > com.sun.faces.config.ConfigureListener </ listener-class >
</ listener >
< listener >
< listener-class > com.sun.faces.application.WebappLifecycleListener </ listener-class >
</ listener >
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
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
有两种方法修改安全验证,第一种是修改%TOMCAT_HOME%/conf下的tomcat-users.xml文件,第二种是在%TOMCAT_HOME%/conf目录下再新建Catalina文件夹,然后再在Catalina文件夹下建localhost文件夹,在此目录下建jbpm-console.xml文件。
i、修改tomcat-users.xml文件
修改前请备份tomcat-users.xml文件,修改后的内容如下:
< 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 >
ii、新建jbpm-console.xml文件
使用这种方式将需要向数据库中插入数据,由jBPM来管理安全验证,jbpm-console.xml文件内容如下:
< 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 ( 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控制台界面了。
![](http://writeblog.csdn.net/images/blogjava_net/bolo/jBPM/jbpm-13.jpg)
到此,在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_LOG ' ,但其最大行大小( 18321 )超过了每行的最大字节数( 8060 )。如果结果行长度超过 8060 字节,则此表中行的 INSERT 或 UPDATE 将失败。
< 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) -->
写到这里,关于jbpm-console所有的布署都讲完了,大象以上所说的全部都是亲自在电脑上一步一步的做过,绝不会胡乱copy一下网上的东东发出来。如有什么问题,希望和大家一起交流。(如果图片不能显示,在其上点击右键,选择"显示图片")
需要使用的JAR包: 点击下载
SQL脚本: 点击下载
本文为菠萝大象原创,如要转载请注明出处。