转载请注明出处哦~
http://uuflower.iteye.com/blog/1873300
最近在调查LMS的开源平台,考虑再三后,计划借鉴Sakai平台,但由于java是0基础,遇到了n多诡异问题,今天终于把这个最简单的Demo搭建弄好了,特意把遇到的问题整理一下,希望像我一样是0基础的人,遇到此类问题,能更顺利地解决。
了解Sakai的人估计知道,现在有两个版本:CLE(目前最新的是2.9.1)、OAE(目前最新的是1.4.3),为了权衡这两个平台,先把Demo搭起来对比下,OAE的相对简单,CLE Demo的搭建是一波三折,这里就详细说下这个吧。
1、背景
1)搭建环境:windowsXP 内存2G
2)Sakai版本:2.9.1
3)机器已安装并配置Java环境(关键注意环境变量哦)
具体的配置方法可以baidu、google,这个就不说了 。
我机器装的是JDK1.6,具体的版本信息如下:
2、demo包下载
从官网上下2.9.1版本的zip包:
http://source.sakaiproject.org/release/2.9.1/
3、解压包
将包解压到指定目录。
这个目录自己可以随便放,不过,路径上最好不要有空格哦,网上有人说有空格会有问题,不过我没试过。
4、按照解压文件夹下的说明启动
在\sakai-demo-2.9.1文件夹下,有一个文件demo_readme.txt,是官方的安装说明文档。
简单说Windows下的安装步骤如下:
1)启动方法:
开始-》运行-》输入“cmd”启动命令窗口,切换目录到sakai-demo-2.9.1文件夹下;
输入“start-sakai.bat”,启动这个脚本,下面这个是我的启动页面:
理论上程序会自动启动tomcat,跳出来熟悉的tomcat启动框了,然后看着tomcat哗哗的启动log从屏幕上跑过,直到tomcat启动完毕;
然后,在浏览器中,输入如下URL即可以看到Sakai的真面目了:
2)关闭
步骤与启动一样,唯一不一样执行的脚本是stop-sakai.bat。
5、悲催问题整理
上面的步骤看起来很简单人性化哈,但悲催的我生生折腾了两天才折腾好,下面就把我遇到问题整理下,大家一起happy下吧:
启动时,输入“start-sakai.bat”后,只显示了上面图中的类似信息,没有启动tomcat。
1)环境变量的恶作剧---CATALINA_HOME
baidu、google时,发现有好心网友提醒,如果机器已安装配置过tomcat,原tomcat配置的CATALINA_HOME环境变量会对Sakai Demo自带的tomcat有影响。
仔细观察了下,确实是引用了当前环境变量,导致使用错误的文件。
大喜,修改后,再次启动,依旧;有点恼火,但,转念一想,刚刚解决的问题,让咱们离成功近了一步,该高兴。
继续……
2)端口到底占用了没?
再次研究demo_readme.txt,发现有如下内容:
Problems getting started
-----------------------------------------------------
1) Sakai's Tomcat will run on port 8080, and also make use of ports 8005 and 8009.
If another process is running on any of these ports, Sakai will not start up.
2) Sakai's Tomcat will find itself relative to the startup directory. Always start it from the sakai-demo folder.
If you have an environment variable CATALINA_HOME set to another Tomcat, this will interfere with Sakai's startup.
第二个问题,咱们在第一步已经解决了,下面就看看这个端口到底占用了没有:
首先,在命令窗口中,输入“netstat -ano|find "8080"”查看是否有程序占用了该端口。
如果回车后,没有任何输出结果,说明没有程序占用该端口,说明不是端口被占用导致的问题。
如果有输出内容,看下占用程序最后一列的内容是多少,这一列标识的是程序的pid。
然后,输入指令“tasklist”,在输出列表中,查找对应pid的程序是什么。
如果确实被占用了,退出占用程序,或修改tomcat的使用端口,推荐第二种。
修改的端口方法与普通tomcat一样,进入sakai-demo-2.9.1\conf\server.xml,修改tomcat使用端口:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
我改成了8088,默认的是8080哦。
注意,端口号改了后,开启Sakai的URL中的端口号也得变哈,别忘了:
再试一次,冥冥中觉得,这不是问题的关键,试下吧……果然,tomcat还是纹丝不动呢
再查……
3)到底是啥阻碍了我与tomcat
到底是啥原因导致tomcat启动不起呢,上面的命令窗口没有任何提示信息,
好吧,我手动进入bin目录,手动启动start.bat,哈哈,有反应,看到tomcat log噌噌跑,有谱……
好景不长,等了5min左右,tomcat启动窗口不见了,自动关闭了!!!
为啥?
到logs目录下看所有log文件,找到catalina的log(我的是catalina.2013-05-22.log),打开发现tomcat的启动错误信息如下:
2013-5-22 9:25:44 org.apache.catalina.core.ContainerBase addChildInternal
严重: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/osp-common-tool]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:812)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:787)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:607)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:932)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:723)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1329)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:334)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1041)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:774)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1033)
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:291)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
at org.apache.catalina.startup.Catalina.start(Catalina.java:621)
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:597)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)
Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at org.apache.tomcat.util.threads.DedicatedThreadExecutor.execute(DedicatedThreadExecutor.java:62)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5220)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:148)
... 29 more
Caused by: java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: Java heap space
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)
at java.util.concurrent.FutureTask.get(FutureTask.java:83)
at org.apache.tomcat.util.threads.DedicatedThreadExecutor.execute(DedicatedThreadExecutor.java:56)
... 31 more
Caused by: java.lang.OutOfMemoryError: Java heap space
……
又是一阵google baidu,修改JAVA_OPTS、CATALINA_OPTS的配置内存大小,参照修改后,再次启动,OK,tomcat自动启动起来了,狂喜……
好景不长,过了大约三四分钟,tomcat卡住了,
在tomcat窗口,看到“java.lang.OutOfMemoryError: PermGen space ”错误提示信息
吐血,再次google baidu,终于找到一个相当靠谱的方案及解释,推荐大家参考:
http://hi.baidu.com/gonervergiveup/item/3c7a9b374f29749db80c03a9
----------------------------------------------------------------------------------------------------
1、首先是:java.lang.OutOfMemoryError: Java heap space
解释:
Heap size 设置
JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.
JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。
可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。
提示:Heap Size 最大不要超过可用物理内存的80%,
一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
解决方法:
手动设置Heap size
修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
或修改catalina.sh
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
2、其次是:java.lang.OutOfMemoryError: PermGen space
原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
1. 手动设置MaxPermSize大小
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
catalina.sh下为:
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
4)终极解决方案
根据上面的粗体提示,用文本文件打开sakai-demo-2.9.1\start-sakai.bat,添加-Xms32m,修改-Xmx256m,和其他所有带XXXm的数字,下面是我的修改数据(我机器的内存是2G):
set JAVA_OPTS=-server -Xms32m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Dhttp.agent=Sakai -Dsakai.demo=true -Djava.awt.headless=true -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dorg.apache.jasper.compiler.Parser.STRICT_WHITESPACE=false -Dsun.lang.ClassLoader.allowArraySyntax=true
set CATALINA_OPTS=-server -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Dhttp.agent=Sakai -Dsakai.demo=true -Djava.awt.headless=true -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dorg.apache.jasper.compiler.Parser.STRICT_WHITESPACE=false -Dsun.lang.ClassLoader.allowArraySyntax=true
上面粗体部分是我修改或添加的内容。
保存后,再次按照在命令行中启动指令“start-sakai.bat”,成功自动启动tomcat……然后等待5~6min后,tomcat启动完毕,hoho
那试试ok了不,在浏览器中输入URL:http://localhost:8088/portal
oho,终于看到Sakai的真面目了,眼泪哗哗地啊:
用户名、密码都是admin,记得哈
6、总结
要不是被逼着,这个问题还不知道啥时候能搞定呢,通过本次事件,得到两个经验教训:
1)网络的力量是无穷的,没有前面兄弟的泣血共享,我也不能解决遇到的问题。
再次感谢慷慨共享的兄弟们,完事我也自己整理了一份,供后来者参观。
2)相信问题终将解决
别人能搞定的问题,咱们一样也能搞定,只是时间长短的问题。
在这个浮躁的社会,没有信仰是可怕的,鉴于历朝各代的宗教统治,推荐大家,信春哥吧~~不求永生但求有房有xifu