最近準(zhǔn)備使用jbpm, 從Jboss網(wǎng)站上下載回來jbpm-installer-3.3.1.GA.jar和jboss 4.2.3,機器上原先裝有mysql 5. 本來以為安裝沒有問題,沒想到竟然費了一番周折才搞掟,現(xiàn)把整個過程寫下來,供有需要的朋友參考。
1. 把jboss 4.2.3 展開到某一個文件夾中,我們假定它為{jboss.home};
2. 安裝jbpm-nstaller-3.3.1. 通過命令 java -jar jbpm-installer-3.3.1.GA.jar可以啟動安裝向?qū)АT诎惭b過程中指定jboss所在的文件夾,數(shù)據(jù)庫選擇為mysql. 一路Next后完成后會生成{jboss.home}\server\default\deploy\jbpm,稱其為{jboss-jbpm.home},jbpm還會生成另一份專門存放自己的文件夾,稱其為{jbpm.home}.
3. 麻煩開始了。當(dāng)啟動jboss4.2.3時,總是報錯,即使換成jboss 5 也是一樣。
  
11:04:16,201 INFO  [DatasourceConnectionProvider] Using datasource: java:JbpmDS
11:04:16,201 WARN  [JBossManagedConnectionPool] Throwable while trying to match ManagedConnection, destroying connection: org.jboss.resource.connectionmanager.TxConnectionManager$TxConnectionEventListener@6ca1a6[state=NORMAL mc=org.jboss.resource.adapter.jdbc.xa.XAManagedConnection@1ae8bac handles=0 lastUse=1234195414812 permit=false trackByTx=false mcp=org.jboss.resource.connectionmanager.JBossManagedConnectionPool$OnePool@ed55ec context=org.jboss.resource.connectionmanager.InternalManagedConnectionPool@1a40fff xaResource=org.jboss.resource.connectionmanager.xa.JcaXAResourceWrapper@53d34c txSync=null]
java.lang.NoClassDefFoundError: org
/jboss/resource/adapter/jdbc/ValidConnectionChecker
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:
621)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:
124)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:
260)
    at java.net.URLClassLoader.access$
000(URLClassLoader.java:56)
    at java.net.URLClassLoader$
1.run(URLClassLoader.java:195)

 后來查閱jboss官方說明書,內(nèi)容極其籠統(tǒng)簡略,沒有任何參考價值。也不怪jboss, 人家的文檔是要賣錢的。
 又Google、baidu了半天,直到遇到ColorKnight的一個貼子才解決問題, 在這里嚴重感謝ColorKnight,原貼地址:http://blog.csdn.net/colorknight/archive/2008/12/11/3495408.aspx。
4. 通過仔細閱讀,發(fā)現(xiàn)了問題所在,原來不能直接使用{jboss-jbpm.home}\jbpm-mysql-ds.xml中的配置。它的缺省配置使用xa-datasource,這導(dǎo)致了上述exception的發(fā)生。將它改為local-tx-datasource.下面是我的配置:
   
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
     
<local-tx-datasource>
            
<jndi-name>JbpmDS</jndi-name>
            
<connection-url>jdbc:mysql://localhost:3306/jbpm</connection-url>
            
<driver-class>com.mysql.jdbc.Driver</driver-class>
            
<user-name>jbpm</user-name>
            
<password>jbpm</password>
            
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
   
            
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
            
<metadata>
               
<type-mapping>mySQL</type-mapping>
            
</metadata>
     
</local-tx-datasource>
  
</datasources>
5. 這步完成后就可以啟動Jboss了,不再有任何錯誤。在Firefox中可以打開http://localhost:8080/jbpm-console頁面。但是login會失敗的,因為數(shù)據(jù)庫中沒有任何數(shù)據(jù),安全配置也沒有做。
6. 不用著急,ColorKnight給出了很重要的參考。之所以重要,是因為他的方向正確;之所以說是參考,是因為他用的是Oracle,我的是mysql,略有不同。好吧,快生成數(shù)據(jù)吧。
 
insert into JBPM_ID_USER (ID_, CLASS_, NAME_, EMAIL_, PASSWORD_) values ('1''U''user''sample.user@sample.domain''user');

insert into JBPM_ID_USER (ID_,CLASS_, NAME_, EMAIL_, PASSWORD_) values ('2''U''manager''sample.manager@sample.domain''manager');

insert into JBPM_ID_USER (ID_,CLASS_, NAME_, EMAIL_, PASSWORD_) values ('3''U''shipper''sample.shipper@sample.domain''shipper');

insert into JBPM_ID_USER (ID_,CLASS_, NAME_, EMAIL_, PASSWORD_) values ('4''U''admin''sample.admin@sample.domain''admin');

insert into JBPM_ID_GROUP VALUES(1,'G','admin','security-role',NULL);

insert into JBPM_ID_GROUP VALUES(2,'G','manager','security-role',NULL);

insert into JBPM_ID_GROUP VALUES(3,'G','user','organisation',NULL);

insert into JBPM_ID_MEMBERSHIP VALUES(1,'M',NULL,'user',1,3);

insert into JBPM_ID_MEMBERSHIP VALUES(2,'M',NULL,'admin',2,1);

insert into JBPM_ID_MEMBERSHIP VALUES(3,'M',NULL,'manager',2,2);

insert into JBPM_ID_MEMBERSHIP VALUES(4,'M',NULL,'user',2,3);

insert into JBPM_ID_MEMBERSHIP VALUES(5,'M',NULL,'user',3,3);

insert into JBPM_ID_MEMBERSHIP VALUES(6,'M',NULL,'admin',4,1);

insert into JBPM_ID_MEMBERSHIP VALUES(7,'M',NULL,'user',4,3);
7. 配置jboss的認證管理。打開{jboss.home}/server/default/conf/login-config.xml文件,在文件中加入
   
       <application-policy name = "jbpm-console">
             
<authentication>
               
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
                              flag
="required">
                 
<module-option name="dsJndiName">java:/JbpmDS</module-option>
                 
<module-option name="principalsQuery">
                    SELECT PASSWORD_ FROM JBPM_ID_USER WHERE NAME_=?
                 
</module-option>
                 
<module-option name="rolesQuery">
                    SELECT g.NAME_ ,'Roles'
                    FROM JBPM_ID_USER u,
                         JBPM_ID_MEMBERSHIP m,
                         JBPM_ID_GROUP g
                    WHERE g.TYPE_='security-role'
                      AND m.GROUP_ = g.ID_
                      AND m.USER_ = u.ID_
                      AND u.NAME_=?
                 
</module-option>
               
</login-module>
             
</authentication>
      
</application-policy>

   其中jbpm-console必須與{Jboss-Jbpm.home}/jsf-console.war/WEB-INF/jboss-web.xml中的
<security-domain>所設(shè)置的名字一致。
   
   8. 配置jboss-console的web.xml 使admin能登錄進來。 打開${Jboss-Jbpm.hom}/jsf-console.war/WEB-INF/web.xml文件,增加下例代碼中黃色Highlight的部分。
            

<security-constraint>
       
<web-resource-collection>
           
<web-resource-name>Secure Area</web-resource-name>
           
<url-pattern>/sa/*</url-pattern>
           
<http-method>GET</http-method>
           
<http-method>POST</http-method>
       
</web-resource-collection>

       
<auth-constraint>
           
<role-name>user</role-name>
           
<role-name>admin</role-name>
       
</auth-constraint>
</security-constraint>
    
 9.最后重新啟動jboss,再次登錄http://localhost:8080/jbpm-console,以admin/admin登錄進去,look一下界面吧: