大象剛剛接觸jBPM,經過這幾天的折騰,終於把jbpm-console這個項目在Tomcat6上佈署成功了,現在把這幾天來的學習經驗拿出來和大家分享一下。(結尾處有相關JAR包和MySQL及SQL Server 2000腳本下載) javax.servlet.ServletException: Servlet.init() for servlet Faces Servlet threw exception
系統環境: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>
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','[email protected]','user');
INSERT INTO JBPM_ID_USER VALUES(2,'U','manager','[email protected]','manager');
INSERT INTO JBPM_ID_USER VALUES(3,'U','admin','[email protected]','admin');
INSERT INTO JBPM_ID_USER VALUES(4,'U','shipper','[email protected]','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_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腳本: 點擊下載
本文爲菠蘿大象原創,如要轉載請註明出處。
jbpm 3.2.2+Tomcat 6.0.10+MySQL5.0.27/SQL Server2000部署詳解
<target name="customize.console.for.tomcat" description="Creates a customized jbpm-console.war for tomcat in the customized directory">
大家看到了吧,customize.console.for.tomcat爲taget的name,所以這裏使用這個命令就不覺得奇怪了,大象開始也覺得很迷惑,爲什麼網上都這樣寫,卻不寫爲什麼,看來是問題太簡單了,那些大大們想來這根本就不是問題。呵呵呵~~~ <!-- hibernate dialect -->
修改後如下: <!-- hibernate dialect -->
d、修改web.xml文件<listener>
這兩個監聽器很關鍵,大象先一直沒有成功的原因就是沒有加這個,而這兩個監聽器都在jsf-impl.jar包中,jbpm-console這個應用可是用jsf來實現的,如果你不加,則會產生如下這些錯誤:java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
e、修改Tomcat安全驗證<?xml version='1.0' encoding='utf-8'?>
使用這種方式來處理安全驗證將不用考慮向數據庫中插入組,角色,用戶之類的數據,完全由Tomcat來管理<Context>
需要向數據庫中插入的數據: INSERT INTO JBPM_ID_GROUP VALUES(1,'G','sales','organisation',NULL);
這兩種方法任選一種即可。警告: 已創建表 'JBPM_DELEGATION',但其最大行大小(8300)超過了每行的最大字節數(8060)。如果結果行長度超過 8060 字節,則此表中行的 INSERT 或 UPDATE 將失敗。
這些不用管它,接下來修改hiberate.cfg.xml文件,大象採用的是JTDS驅動的連接方式,修改後的內容如下: <!-- hibernate dialect -->
不要忘了,還要將JTDS的驅動拷貝到%TOMCAT_HOME%/lib目錄下,如果採用的是Tomcat安全驗證,此時就不用向數據庫插入數據,直接就可以啓動服務器運行了。如果採用的是jBPM來管理安全驗證,此時則需要將前面提到的數據插入數據庫中,在插入前需要修改一下,將每條記錄前的ID號去掉,因爲數據庫中對此字段已經作了標識,不能手動對它設置。數據插入後,就啓動服務器看下吧!發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.