搭建Opentaps开发环境并改用MySQL数据库

时间:2023-01-19 13:02:31

前言

本文是以Eclipse为开发工具来搭建opentaps开发环境的,而不是简单的安装opentaps。要想开始安装并使用opentaps,首先,需要安装Java6的环境,并且设置ClassPath,Path,JAVA_HOME等环境变量;其次,因为opentaps自带的derby数据库不适合开发使用,因此还需要下载并更改默认数据库为MySQL5.0。此外由于编译使用的是Eclipse自带的ant工具,因此可以不需要像网上的部分教程那样额外安装ant工具。本文会全程使用Eclipse的工具搭建环境,而不会使用opentaps自带的命令行文件。

文章会说明我自己的安装环境,如何使用MySQL创建opentaps的专有用户的数据库,如何修改opentaps中的配置文件,以及修复一个小bug,如何安装并运行opentaps,最后文章汇总了到目前为止我在安装过程中遇到的错误以及它们的解决办法。

环境说明(请务必和我的配置一致否则可能会需要额外的配置)

Opentaps版本:opentaps-1.5.0.zip(289.4 MB)请注意选择版本

MySQL版本:mysql-5.0.22-win32(请注意“MYSQL版本问题”)

Eclipse版本:eclipse-jee-luna-SR2-win32.zip(即Eclipse IDE forJava EE Developers, 254 MB)

Java版本:Java6(java version " 1.6.0_10-rc2")

计算机系统:win7 32位,4G内存

安装过程

创建MySQL中的用户

这一步主要是为opentaps创建专有的用户和数据库,当然这肯定不是必须的,因为你可以直接用你的root用户,但是使用root用户可能会造成安全问题。

请在MySQL命令行中依次输入以下命令(当然首先你得登陆了,如果不会在命令行下登陆可参考之后的ofbiz用户的登陆命令):

  • 创建用户:
    create user ofbiz;
  • 创建数据库:
    create database ofbiz;
  • 授权数据库:
    #这里的identified by ‘ofbiz’,是设置ofbiz为密码grant all privileges on ofbiz.* to 'ofbiz'@'locallhost' identified by 'ofbiz' with grant option; 
    
    
  • 更新权限:
    #必须更新权限,否则更改无法应用
    flush privileges;
    
    

这时可以退出数据库,然后重新以mysql –u ofbiz –p登陆(密码是ofbiz)。如果是密码设置有问题或者想要更改密码,则可以输入:

  • 选择mysql数据库:
    use mysql;
  • 更新密码:
    update user set password=password('ofbiz') where user='ofbiz';
  • 更新权限:
    flush privileges;

修改opentaps中的文件,并安装opentaps

打开Eclipse的File->import…->General->Existing Projects into Workspace选择opentaps的解压位置,从而完成opentaps的导入。Eclipse的窗口左部默认的是包视图(Project Explorer),可以在Window->show view->Navigator从而选择文件夹结构的视图,这样可以清楚的看到opentaps的文件结构目录。

1. 修改数据库配置文件:

选择{opentaps-1.50}/framework/entity/config/ entityengine.xml。

修改line53-line71:

    <delegator name="default" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="false">
<group-map group-name="org.ofbiz" datasource-name="localderby"/>
<group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
<group-map group-name="org.ofbiz.tenant" datasource-name="localderbytenant"/>
<group-map group-name="org.opentaps.analytics" datasource-name="analytics"/>
<group-map group-name="org.opentaps.testing" datasource-name="testing"/>
</delegator>
<delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">
<group-map group-name="org.ofbiz" datasource-name="localderby"/>
<group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
<group-map group-name="org.ofbiz.tenant" datasource-name="localderbytenant"/>
</delegator>

<!-- be sure that your default delegator (or the one you use) uses the same datasource for test. You must run "ant run-install" before running "ant run-tests" -->
<delegator name="test" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">
<group-map group-name="org.ofbiz" datasource-name="localderby"/>
<group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
<group-map group-name="org.ofbiz.tenant" datasource-name="localderbytenant"/>
</delegator>

修改为(只修改其中的datasource-name为localmysql):
    <delegator name="default" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="false">
<group-map group-name="org.ofbiz" datasource-name="localmysql"/>
<group-map group-name="org.ofbiz.olap" datasource-name=" localmysql"/>
<group-map group-name="org.ofbiz.tenant" datasource-name=" localmysql"/>
<group-map group-name="org.opentaps.analytics" datasource-name=" localmysql"/>
<group-map group-name="org.opentaps.testing" datasource-name=" localmysql"/>
</delegator>
<delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">
<group-map group-name="org.ofbiz" datasource-name=" localmysql"/>
<group-map group-name="org.ofbiz.olap" datasource-name=" localmysql"/>
<group-map group-name="org.ofbiz.tenant" datasource-name=" localmysql"/>
</delegator>

<!-- be sure that your default delegator (or the one you use) uses the same datasource for test. You must run "ant run-install" before running "ant run-tests" -->
<delegator name="test" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">
<group-map group-name="org.ofbiz" datasource-name=" localmysql"/>
<group-map group-name="org.ofbiz.olap" datasource-name=" localmysql"/>
<group-map group-name="org.ofbiz.tenant" datasource-name=" localmysql"/>
</delegator>

localmysql指向的是{opentaps-1.5.0}\opentaps\opentaps-common\config下的localmysql.cfg.xml,用于配置数据源的信息。

修改Line324:table-type="InnoDB" 为 engine="InnoDB"

修改Line325:character-set="latin1" 为 character-set="utf8"

修改Line326:collate="latin1_general_cs" 为 collate="utf8_general_ci"

另外,如果数据库的名称,用户名,密码和本文之前所讲的配置不同,那么你还要修改Line333来配置数据库名称(将本行的*** jdbc-uri="jdbc:mysql://127.0.0.1/ofbiz?autoReconnect=true&amp;useOldAliasMetadataBehavior=true" ***中的ofbiz改为要用的数据库名称),Line334来修改数据库用户名,Line335来修改数据库密码。

2. 修改分隔符错误:

选择{opentaps-1.5.0}\framework\webapp\src\org\ofbiz\webapp\control文件夹下的ConfigXMLReader.java文件。

修改Line81:

for (String a : url.toString().split(File.separator)) { 

修改为

for (String a : url.toString().split("/")) {

也就是将 File.separator 改为 ”/”

搭建Opentaps开发环境并改用MySQL数据库

3. 安装opentaps:

首先要启用ant工具:选择eclipse的window->show view->other->ant下的ant工具,就会在工作区的下部console的标签区域出现ant工具的工作区;

搭建Opentaps开发环境并改用MySQL数据库

然后将{opentaps-1.5.}下的build.xml拖进ant的工作区,在ant的工作区内选择OFBizMain Build下的run-install标签右键run as->2 ant build…(不要选择第一个1 ant build),默认会打开targets标签。在targets标签最左边有个Main标签,请选择它,并在这个标签下的Arguments区域下填入run-install-seed。

搭建Opentaps开发环境并改用MySQL数据库

最后,点击run按钮执行安装,之后就是漫长的等待了,如果没什么问题就会出现类似下面的提示:

BUILD SUCCESSFUL
Total time: 8 minutes 24 seconds

如果出现了问题,请看第四部分:问题列表。

4. 运行测试opentaps:

经过之前的步骤,opentaps已经顺利的在Eclipse里安装成功,之后就需要运行测试下opentaps。

选择Eclipse工具栏中的run图标右边的小三角,选择run configurations,在run configurations页面中,双击左部的Java Application从而新建一个运行配置项。

搭建Opentaps开发环境并改用MySQL数据库

搭建Opentaps开发环境并改用MySQL数据库

点击Main Class下的Search,出现select Main Type页面,在里边输入start,从而过滤出主函数,选择Start-org.ofbiz.base.start为启动函数。

搭建Opentaps开发环境并改用MySQL数据库

选择arguments标签,在VMarguments标签下输入-Xms256M -Xmx523M -XX:MaxPermSize=1024M,这个对应的是{opentaps-1.5.0}文件夹下的startofbiz.bat文件中对opentaps的配置(这里已经把配置数据改小了,如果你的计算机能够承受默认的配置,那么可以直接粘贴startofbiz.bat的Line54的对应参数过来)。

搭建Opentaps开发环境并改用MySQL数据库

选择Classpath标签,选择UserEntries,之后点击右部的add JARS,选择{opentaps-1.5.0}项目下的ofbiz.jar作为参考类文件,并且删除opentaps-1.5.0(default classpath)条目,如果不删除,运行时会提示找不到主函数,具体的参看问题列表中的问题C。

搭建Opentaps开发环境并改用MySQL数据库

选择Source标签,点击右部的add按钮,选择Java project,添加opentaps-1.5.0整个项目为源文件。

搭建Opentaps开发环境并改用MySQL数据库

最后点击run按钮就可以运行整个项目了。当整个项目运行起来之后,打开浏览器,输入http://locahost:8080/opentaps/ 之后输入用户名密码(admin/opentaps)登陆,就可以看到opentaps的管理员页面,中间会包括11个图标。

搭建Opentaps开发环境并改用MySQL数据库

问题列表

a) Java版本问题:

说明:我使用Java8对项目进行ant编译的时候就会出现下面的错误,可能是因为Java8对Java6的某些地方不兼容导致的。
[java] Exception in thread "main" java.lang.ExceptionInInitializerError
[java] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
[java] at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
[java] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
[java] at java.lang.reflect.Constructor.newInstance(Unknown Source)
[java] at java.lang.Class.newInstance(Unknown Source)
[java] at org.ofbiz.entity.GenericDelegator.initEntityEcaHandler(GenericDelegator.java:339)
[java] at org.ofbiz.entity.DelegatorFactory.getDelegator(DelegatorFactory.java:42)
[java] at org.ofbiz.entityext.data.EntityDataLoadContainer.start(EntityDataLoadContainer.java:236)
[java] at org.ofbiz.base.container.ContainerLoader.start(ContainerLoader.java:101)
[java] at org.ofbiz.base.start.Start.startStartLoaders(Start.java:273)
[java] at org.ofbiz.base.start.Start.startServer(Start.java:323)
[java] at org.ofbiz.base.start.Start.start(Start.java:327)
[java] at org.ofbiz.base.start.Start.main(Start.java:412)
[java] Caused by: java.lang.ArrayIndexOutOfBoundsException: 19567
[java] at org.codehaus.aspectwerkz.org.objectweb.asm.ClassReader.accept(Unknown Source)
[java] at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.getClassInfo(AsmClassInfo.java:308)
[java] at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.getClassInfo(AsmClassInfo.java:331)
[java] at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.createClassInfoFromStream(AsmClassInfo.java:790)
[java] at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.getClassInfo(AsmClassInfo.java:273)
[java] at org.codehaus.aspectwerkz.reflect.impl.asm.AsmClassInfo.getInterfaces(AsmClassInfo.java:619)
[java] at org.codehaus.aspectwerkz.reflect.ClassInfoHelper.implementsInterface(ClassInfoHelper.java:56)
[java] at org.codehaus.aspectwerkz.transform.inlining.compiler.AbstractJoinPointCompiler.collectCustomProceedMethods(AbstractJoinPointCompiler.java:237)
[java] at org.codehaus.aspectwerkz.transform.inlining.compiler.AbstractJoinPointCompiler.collectCustomProceedMethods(AbstractJoinPointCompiler.java:208)
[java] at org.codehaus.aspectwerkz.transform.inlining.compiler.AbstractJoinPointCompiler.initialize(AbstractJoinPointCompiler.java:149)
[java] at org.codehaus.aspectwerkz.transform.inlining.compiler.AbstractJoinPointCompiler.<init>(AbstractJoinPointCompiler.java:133)
[java] at org.codehaus.aspectwerkz.transform.inlining.compiler.MethodExecutionJoinPointCompiler.<init>(MethodExecutionJoinPointCompiler.java:33)
[java] at org.codehaus.aspectwerkz.transform.inlining.compiler.JoinPointFactory.compileJoinPoint(JoinPointFactory.java:86)
[java] at org.codehaus.aspectwerkz.joinpoint.management.JoinPointManager$CompiledJoinPoint.<init>(JoinPointManager.java:262)
[java] at org.codehaus.aspectwerkz.joinpoint.management.JoinPointManager.compileJoinPoint(JoinPointManager.java:251)
[java] at org.codehaus.aspectwerkz.joinpoint.management.JoinPointManager.loadJoinPoint(JoinPointManager.java:118)
[java] at org.ofbiz.entityext.eca.DelegatorEcaHandler.aw$initJoinPoints(DelegatorEcaHandler.java)
[java] at org.ofbiz.entityext.eca.DelegatorEcaHandler.<clinit>(DelegatorEcaHandler.java)
[java] ... 13 more
[java] 2015-03-21 22:35:28,004 (OFBiz_Shutdown_Hook) [ ContainerLoader.java:114:INFO ] Shutting down containers
[java] Java HotSpot(TM) Client VM warning: ignoring option MaxPermSize=512M; support was removed in 8.0

BUILD FAILED
E:\LEARN\myeclipse\mySpace\opentaps-1.5.0\build.xml:510: Java returned: 1

Total time: 4 minutes 6 seconds

解决办法:
更换本机的JDK(使用Java6),重启Eclipse,默认情况下Eclipse会自动重新关联新的JDK,如果没有自动关联,则在Eclipse中选择window->preferences->Java->Compiler界面的compiler compliance level中选择1.6版本,并且在ant的run build过程中,选择JRE标签下的run in the same JRE as the workspace,这样就可以继续使用ant编译安装项目了(已测试可行)。
搭建Opentaps开发环境并改用MySQL数据库
图 compiler compliance level界面
搭建Opentaps开发环境并改用MySQL数据库
图 ant的run-build界面

b) 安装之后使用默认的用户名,密码无法登陆(用户名/密码:admin/opentaps):

说明:如果你已经安装了opentaps,然后登陆了用户名密码,却提示你用户名密码错误,这可能是你并没有完整的安装好opentaps。你可以查看你的数据库(本文用的是ofbiz)中的user_login数据表中的数据是否完整(部分数据如下图):
搭建Opentaps开发环境并改用MySQL数据库
解决办法:如果你的数据没有上图的那么完整,且admin用户没有密码,那可能是因为你运行的是ant-install-seed标签或者其他。我之前尝试对比运行了ant-install-seed和ant-install发现如果直接运行ant-install-seed会导致数据不完整,但是如果直接运行ant-install(也就是按照文中的方式安装opentaps)则数据会是完整的且不会出现admin用户无密码的现象。

c) 库文件引用不对问题:

说明:没有删除程序中默认的引用库文件opentaps-1.5.0(default classpath),导致配置失败。你在运行时会出现下列错误信息:
Set OFBIZ_HOME to - E:/LEARN/myeclipse/mySpace/opentaps-1.5.0
Admin socket not configured; set to port 0
Exception in thread "main" java.lang.ExceptionInInitializerError
at org.ofbiz.base.util.Debug.<clinit>(Debug.java:87)
at org.ofbiz.base.container.ContainerLoader.load(ContainerLoader.java:51)
at org.ofbiz.base.start.Start.initStartLoaders(Start.java:260)
at org.ofbiz.base.start.Start.init(Start.java:97)
at org.ofbiz.base.start.Start.main(Start.java:411)
Caused by: java.util.MissingResourceException: Can't find bundle for base name cache, locale en
at java.util.ResourceBundle.throwMissingResourceException(Unknown Source)
at java.util.ResourceBundle.getBundleImpl(Unknown Source)
at java.util.ResourceBundle.getBundle(Unknown Source)
at org.ofbiz.base.util.cache.UtilCache.setPropertiesParams(UtilCache.java:211)
at org.ofbiz.base.util.cache.UtilCache.setPropertiesParams(UtilCache.java:207)
at org.ofbiz.base.util.cache.UtilCache.<init>(UtilCache.java:140)
at org.ofbiz.base.util.cache.UtilCache.createUtilCache(UtilCache.java:1006)
at org.ofbiz.base.util.UtilProperties.<clinit>(UtilProperties.java:70)
... 5 more
解决办法:删除运行配置时没有删除的引用opentaps-1.5.0(default classpath)即可。
搭建Opentaps开发环境并改用MySQL数据库
注:以上步骤已亲测可用,如果还有其他错误可以联系我共同讨论:teaandnoodle@163.com