环境准备
版本选择:最新稳定版本:release17.12.04
操作系统:windows 10
开发工具:ideal
下载源码:
git clone https://gitbox.apache.org/repos/asf/ofbiz-framework.git ofbiz-framework
git checkout release17.12.04
国内镜像:
从git仓库下载速度太慢,别挣扎,请转到国内镜像下载吧,
https://mirrors.tuna.tsinghua.edu.cn/apache/ofbiz/apache-ofbiz-17.12.04.zip
安装步骤
1. 导入项目
使用Ideal打开项目,导入项目源码
2. 配置gradle插件版本
Ofbiz的配置文件为:
${ofbiz}/gradle/wrapper/gradle-wrapper.properties
另外从其他的gradle项目中拷贝gradle-wrapper.jar 到${ofbiz}/gradle/wrapper/ 目录
修改distributionUrl的值
Gradle默认缓存地址是 C:\Users\${user}\.gradle\wrapper\dists,如:
为了避免重新下载gradle插件提高构建速度,这里将distributionUrl修改为本地已缓存的版本gradle-4.1-all.zip
3. 配置gradle国内仓库
Gradle镜像配置文件:
${ofbiz}/build.gradle
将buildscript节点的repositories改为:
repositories {
maven{ url 'https://maven.aliyun.com/repository/public' }
}
将allprojects节点的repositories改为:
repositories{
maven{ url 'https://maven.aliyun.com/repository/public'}
}
4. 修改数据库配置
Ofbiz默认使用的数据库是内置的derby,这里改为笔者熟悉的数据库mysql
配置文件为:
${ofbiz}/framework/entity/config/entityengine.xml
找到localmysql、localmysqlolap、localmysqltenant三个数据源配置节点,将其以下内容修改为自己所需的配置:
character-set="utf8mb4"
collate="utf8mb4_general_ci"> //修改数据库字符配置使其支持emoji表情
jdbc-uri="jdbc:mysql://xxx.xxx.xxx.xxx:3306/ofbiz?autoReconnect=true&characterEncoding=UTF-8"
jdbc-username="****"
jdbc-password="****" //修改数据库链接及账号密码使其能够访问您的mysql数据库
然后分别修改delegator name="default"节点的三个datasource-name为:localmysql、localmysqlolap、localmysqltenant
5. 创建数据库
在mysql中创建用户:user:ofbiz,password:ofbiz;
创建数据库:ofbiz、ofbizolap、ofbiztenant;
sql语句:
create user 'ofbiz'@'localhost' identified by 'ofbiz';
create database ofbiz DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
create database ofbizolap DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
create database ofbiztenant DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
grant all on *.* to 'ofbiz'@'localhost';
flush privileges;
show grants for 'ofbiz'@'localhost';
6. 清理项目
打开命令行工具,在${ofbiz}项目根目录执行以下命令:
gradlew cleanAll loadDefault
会出现以下错误:
解决办法:从报错可以看出是plugins中的birt这个项目依赖名不正确,为了正常运行项目,这里现将org.milyn的依赖从birt中排除,当前阶段不需要使用birt,后续再想办法解决。排除依赖的方法是修改${ofbiz}/plugins/birt/build.gradle文件,增加红色部分内容:
dependencies {
pluginLibsCompile('org.eclipse.birt.runtime:viewservlets:4.4.1') {
exclude group: 'org.eclipse.birt.runtime.3_7_1', module: 'derby'
exclude group: 'org.eclipse.birt.runtime.3_7_1', module: 'org.apache.batik.pdf'
exclude group: 'org.milyn'
}
}
再次执行gradlew cleanAll loadDefault命令即可。
7. 构建项目
执行命令:gradlew cleanAll loadAll
会出现以下错误:
解决办法:根据报错可以知道,我们配置了mysql数据库,但是没有添加mysql的jdbc驱动依赖,在${ofbiz}/build.gradle文件添加相应的驱动依赖即可,因OFbiz在构建阶段就使用到了依赖,我们在compile、runtime阶段都添加上:
compile 'mysql:mysql-connector-java:5.1.39'
runtime 'mysql:mysql-connector-java:5.1.39'
配置完成后再重新执行gradlew cleanAll loadAll
又出现如下错误:
解决办法:根据错误我们可以看出,这是因为修改了字符类型导致的,mysql的varchar主键只支持不超过767个字节或者768/2=384个双字节 或者767/3=255个三字节的字段 而GBK是双字节的,UTF8是三字节的,utf8mb4是四字节的,最多只能设置767/4=191因此我们要找到相关的表的定义,检查主键配置,凡是主键长度超过191的都需要改小。
首先我们修改${ofbiz}/framework/entity/fieldtype/fieldtypemysql.xml 文件,增加以下类型映射:
<field-type-def type="key-varchar" sql-type="VARCHAR(180)" java-type="String"/>
<field-type-def type="id-mlong" sql-type="VARCHAR(90)" java-type="String"/>
然后将对应数据实体定义中主键长度超过191的类型改为key-varchar
示范:修改${ofbiz}/framework/entity/entitydef/entitymodel.xml 中的TENANT_DOMAIN_NAME表实体的主键:
<entity entity-name="TenantDomainName" package-name="org.apache.ofbiz.entity.tenant"
title="Tenant and its Domain Name">
<field name="tenantId" type="id"></field>
<field name="domainName" type="key-varchar"></field> //原值为long-varchar,映射的类型是VARCHAR(255)
<prim-key field="domainName"/>
<relation type="one" fk-name="TNNT_DMNAM" rel-entity-name="Tenant">
<key-map field-name="tenantId"/>
</relation>
</entity>
以下是都需要修改的表实体定义:
文件 | 表 | 主键 | 原类型及长度 | 修改后类型 |
${ofbiz}/framework/entity/entitydef/entitymodel.xml | TENANT_DOMAIN_NAME(TenantDomainName) | DOMAIN_NAME | long-varchar(255) | key-varchar(180) |
${ofbiz}/applications/datamodel/entitydef/party-entitymodel.xml | ADDRESS_MATCH_MAP(AddressMatchMap) | MAP_KEY, MAP_VALUE | id-vlong(250) + id-vlong(250) | id-mlong(90) + id-mlong(90) |
${ofbiz}/applications/datamodel/entitydef/party-entitymodel.xml | EMAIL_ADDRESS_VERIFICATION(EmailAddressVerification) | EMAIL_ADDRESS | id-vlong(250) | key-varchar(180) |
${ofbiz}/framework/entityext/entitydef/entitymodel.xml | ENTITY_GROUP_ENTRY(EntityGroupEntry) | ENTITY_GROUP_ID, ENTITY_OR_ PACKAGE | id(20) + long-varchar(255) | id(20) + id-mlong(90) |
${ofbiz}/framework/entity/entitydef/entitymodel.xml | ENTITY_KEY_STORE(EntityKeyStore) | KEY_NAME | id-vlong(250) | key-varchar(180) |
${ofbiz}/framework/entityext/entitydef/entitymodel.xml | ENTITY_SYNC_INCLUDE(EntitySyncInclude) | ENTITY_SYNC_ID, ENTITY_OR_ PACKAGE | id(20) + long-varchar(255) | id(20) + id-mlong(90) |
${ofbiz}/plugins/bin/pricat/entitydef/entitymodel.xml | EXCEL_IMPORT_HISTORY (ExcelImportHistory) | USER_LOGIN_ID, SEQUENCE_NUM | id-vlong(250)+numeric(20) | id-mlong(90) + numeric(20) |
${ofbiz}/plugins/pricat/entitydef/entitymodel.xml | EXCEL_IMPORT_HISTORY (ExcelImportHistory) | USER_LOGIN_ID, SEQUENCE_NUM | id-vlong(250)+numeric(20) | id-mlong(90) + numeric(20) |
${ofbiz}/plugins/passport/entitydef/entitymodel.xml | GIT_HUB_USER(GitHubUser) | GIT_HUB_USER_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/plugins/bin/passport/entitydef/entitymodel.xml | GIT_HUB_USER(GitHubUser) | GIT_HUB_USER_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/framework/entity/entitydef/entitymodel.xml | JAVA_RESOURCE(JavaResource) | RESOURCE_NAME | id-vlong(250) | key-varchar(180) |
${ofbiz}/framework/common/entitydef/entitymodel.xml | KEYWORD_THESAURUS(KeywordThesaurus) | ENTERED_KEYWORD, ALT ERNATE_KEYWORD | long-varchar(255) + long-varchar(255) | id-mlong(90) + id-mlong(90) |
${ofbiz}/framework/common/entitydef/entitymodel.xml | LINKED_IN_USER(LinkedInUser) | LINKED_IN_USER_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/plugins/bin/passport/entitydef/entitymodel.xml | LINKED_IN_USER(LinkedInUser) | LINKED_IN_USER_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/applications/datamodel/entitydef/content-entitymodel.xml | MIME_TYPE(MimeType) | MIME_TYPE_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/applications/datamodel/entitydef/content-entitymodel.xml | MIME_TYPE_HTML_TEMPLATE(MimeTypeHtmlTemplate) | MIME_TYPE_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/applications/datamodel/entitydef/order-entitymodel.xml | ORDER_BLACKLIST(OrderBlacklist) | BLACKLIST_STRING, ORDER_BLACKLIST_TYPE_ID | long-varchar(255) + id(20) | id-mlong(90) + id(20) |
${ofbiz}/applications/datamodel/entitydef/product-entitymodel.xml | PRODUCT_PROMO_CODE_EMAIL(ProductPromoCodeEmail) | PRODUCT_PROMO_CODE_ID, EMAIL_ADDRESS | id(20) + email(320) | id(20) + email(150) |
${ofbiz}/framework/webapp/entitydef/entitymodel.xml | SERVER_HIT(ServerHit) | VISIT_ID, CONTENT_ID, HIT_START_DATE_TIME, HIT_TYPE_ID | id(20) + id-vlong(250) + date-time(3) + id(20) | id(20) + id-mlong(90) + date-time(3) + id(20) |
${ofbiz}/framework/security/entitydef/entitymodel.xml | TARPITTED_LOGIN_VIEW(TarpittedLoginView) | VIEW_NAME_ID, USER_LOGIN_ID | id-long(60) + id-vlong(250) | id-long(60) + id-mlong(90) |
${ofbiz}/framework/security/entitydef/entitymodel.xml | USER_LOGIN(UserLogin) | USER_LOGIN_ID | id-vlong(250) | id-mlong(90) |
${ofbiz}/framework/security/entitydef/entitymodel.xml | USER_LOGIN_HISTORY(UserLoginHistory) | USER_LOGIN_ID, FROM_DATE | id-vlong(250) + date-time(3) | id-mlong(90) + date-time(3) |
${ofbiz}/framework/security/entitydef/entitymodel.xml | USER_LOGIN_PASSWORD_HISTORY(UserLoginPasswordHistory) | USER_LOGIN_ID, FROM_DATE | id-vlong(250) + date-time(3) | id-mlong(90) + date-time(3) |
${ofbiz}/framework/security/entitydef/entitymodel.xml | USER_LOGIN_SECURITY_GROUP(UserLoginSecurityGroup) | USER_LOGIN_ID, GROUP_ID, FROM_DATE | id-vlong(250) + id(20) + date-time(3) | id-mlong(90) + id(20) + date-time(3) |
${ofbiz}/framework/security/entitydef/entitymodel.xml | USER_LOGIN_SECURITY_QUESTION(UserLoginSecurityQuestion) | QUESTIO N_ENUM_ID, USER_LOGIN_ID | id(20) + id-vlong(250) | id(20) + id-mlong(90) |
${ofbiz}/framework/security/entitydef/entitymodel.xml | USER_LOGIN_SESSION(UserLoginSession) | USER_LOGIN_ID | id-vlong(250) | id-mlong(90) |
${ofbiz}/framework/common/entitydef/entitymodel.xml | USER_PREFERENCE(UserPreference) | USER_LOGIN_ID, USER_PREF_TYPE_ID | id-vlong(250) + id-long(60) | id-mlong(90) + id-long(60) |
${ofbiz}/applications/datamodel/entitydef/accounting-entitymodel.xml | VALUE_LINK_KEY(ValueLinkKey) | MERCHANT_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/applications/datamodel/entitydef/content-entitymodel.xml | WEB_SITE_PATH_ALIAS(WebSitePathAlias) | WEB_SITE_ID, PATH_ALIAS, FROM_DATE | id(20) + id-vlong(250) + date-time(3) | id(20) + id-mlong(90) + date-time(3) |
${ofbiz}/applications/datamodel/entitydef/content-entitymodel.xml | WEB_USER_PREFERENCE(WebUserPreference) | USER_LOGIN_ID, PARTY_ID, VISIT_ID, WEB_PREFERENCE_TYPE_ID | id-vlong(250) + id(20) + id(20) + id(20) | id-mlong(90) + id(20) + id(20) + id(20) |
${ofbiz}/applications/datamodel/entitydef/workeffort-entitymodel.xml | WORK_EFFORT_REVIEW(WorkEffortReview) | WORK_EFFORT_ID, USER_LOGIN_ID, REVIEW_DATE | id(20) + id-vlong(250) + date-time(3) | id(20) + id-mlong(90) + date-time(3) |
主键长度限制导致的问题修复后,重新执行gradlew cleanAll loadAll命令,又发现如下错误:
解决方案:从报错日志看出这是由于外键索引长度超过限制导致的报错,需要重新设置外键索引长度,按照报错日志找到对应的实体定义文件进行修改,修改方法和修改主键的方法相同。需要修改的文件如下:
文件 | 数据表(实体) | 外键索引值 | 原长度 | 修改后长度 |
${ofbiz}/applications/datamodel/entitydef/accounting-entitymodel.xml | (BudgetStatus) | BUDGET_STTS_USRLGN | id-vlong(250) | id-mlong(90) |
${ofbiz}/applications/datamodel/entitydef/party-entitymodel.xml | (CommunicationEvent) | CONTENT_MIME_TYPE_ID | id-vlong(250) | key-varchar(180) |
${ofbiz}/applications/datamodel/entitydef/marketing-entitymodel.xml | (ContactList) | CNCT_LST_CBUL, CNCT_LST_LMUL | id-vlong(250), id-vlong(250) | id-mlong(90), id-mlong(90) |
${ofbiz}/applications/datamodel/entitydef/marketing-entitymodel.xml | (ContactListCommStatus) | CNCT_LST_CST_ST_UL | id-vlong(250) | id-mlong(90) |
其他文件不一一列出 |
外键很多名称相同,可以使用全局替换的命令修改。
在这个过程,如果再有执行报错,及时中断运行,然后找到错误原因,再将数据库中的数据表全部删除,修复问题后再重新执行gradlew cleanAll loadAll命令,如果您的数据库配置正确,gradle将在数据库自动创建OFbiz的所需数据表并建立主键与外键。
直到不报错并输出:
检查数据库:ofbiz(847张表)、ofbizolap(6张表)、ofbiztenant(6张表)
8. 运行ofbiz
执行命令:gradlew ofbiz
成功启动后浏览器访问:https://localhost:8443/accounting
Ofbiz默认使用的是https协议,到这里我们还没有配置证书,所以需要点击继续前往localhost(不安全)。
账号和密码:admin/ofbiz,登录成功后:
访问过程中注意观察:
系统自动根据您访问所在地判断显示何种语言,ofbiz几乎支持的全世界所有主要语言,访问:https://localhost:8443/accounting/control/ListLocales 可以查看和手动设置语言:
Ofbiz是一个真正实现国际化的开源ERP,是一个非常值得学习和研究的开源系统。
9. 关闭ofbiz
执行命令:gradlew ofbiz --shutdown
10. 开发者手册
Ofbiz提供了详尽的开发者指导手册,能够帮助开发者快速熟悉系统:
https://cwiki.apache.org/confluence/display/OFBIZ/OFBiz+Tutorial+-+A+Beginners+Development+Guide