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
    1、安裝JDK1.5.0_09
       不必一定要按我的版本來安裝,不過至少JDK應該在1.5以上,JDK安裝好以後,設置PATHCLASSPATH環境變量。
    2、安裝Tomcat6.0.10
       這個沒什麼好說的,請用6.0的版本,因爲大象沒在5.0或5.5上測試過,而且這幾個版本之間有很大的不同,爲了能儘快上手,還是按照我寫的來吧。^_^ 
    3、安裝MySQL5.0.27
       MySQL安裝中採用默認安裝即可,字符集不用設置爲GB2312GBK,這樣做比較通用(大象用的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 —— jBPMHibernatelog4j的配置文件
       db ——
各種數據庫的SQL語句
       deploy ——
已經打包好的war
       designer —— jBPM
Eclipse插件,具體在eclipse子目錄中
       doc —— API
文檔及用戶使用嚮導
       examples —— jBPM
自帶的例子程序
       lib ——
依賴的第三方依賴類庫
       server ——
一個已經配置好了的基於JBossjBPM示例
       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.1MyEclipse5.1.0GA
               我使用的是一種整合版本,就是解壓後可以直接使用,eclipsemyeclipse已經整合好了(嘿嘿,感覺非常方便,我自己還做了一個Eclipse3.3MyEclipse6.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端口號和你服務器保持一致,如TomcatJBoss,另外佈署一個新流程時,一定要先啓動服務器。jbpm-console這個名字是默認發佈到服務器上的名字,比如Tomcat中,webapps下使用的名字和這個要一樣,那個變了,這個也要跟着變,還是保持默認就行。upload不要作修改,這些其實與佈署jbpm-console應用沒有多大關係,大家看看就行。

    8、佈署jbpm-console
       jbpm-jpdl-3.2.2/deploy目錄下可以看到jbpm-console.warbuild.xml(當然還有其它文件,現在我們只關心這兩個),在CMD中,進入jbpm-jpdl-3.2.2/deploy目錄下,使用命令:ant customize.console.for.tomcat 然後我們在deploy下可以看到多出來customizedtarget兩個文件夾,進入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.tomcattagetname,所以這裏使用這個命令就不覺得奇怪了,大象開始也覺得很迷惑,爲什麼網上都這樣寫,卻不寫爲什麼,看來是問題太簡單了,那些大大們想來這根本就不是問題。呵呵呵~~~
    a、加入必要的jar包
          jbpm-console/WEB-INF/lib下要加入以下幾個jar包:jboss-j2ee.jarcommons-collections.jarjsf-api.jarjsf-impl.jar,刪除jsf-api-14.jarjsf-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可視化操作工具,其它相關的可視化工具非常多,可以任選一種使用,如果你不用這些工具來簡化開發,那就配置mysqlPATH環境變量,在命令行中操作吧。^_^
       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/classeshibernate.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文件。
       i、修改tomcat-users.xml文件
          修改前請備份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','[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_XXdrop 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腳本: 點擊下載
     本文爲菠蘿大象原創,如要轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章