web开发环境版本不同的问题 页面参数乱码 OutOfMemoryError
今天上午郁闷死啦,因为部署项目的时候遇到了两个大问题。这两个问题产生的原因是本地开发环境和运行环境同生产机上的不同,下面我细细道来。
我本地使用的tomcat6.0、MyEclipse9、jdk1.6,生产机上的是tomcat5.5、jdk1.5
第一个问题:将程序部署到linux环境下之后,开始发布的过程中,一直报找不到文件路径的错误。
因为这是一个写日志的文件,在windows下和linux下路径是不同的。比如在windows下的路径为: String pandianlogspath = "d:/logs/pandian_sql_log"; 但是在linux路径就是 String pandianlogspath ="/usr/local/tomcat/logs/pandian_sql_log";因此在本地运行程序的时候使用的就是windows下的路径,每次部署程序到linux系统下的生产机上的时候就要修改路径。这是一个很麻烦的事情!
但是我确保部署的程序中文件路径是linux系统下的路径,但是他就是报错。
解决办法:每次打war包之前都选择MyEclipse菜单栏中的Project下的clean,清除一下要发布的项目。
第二个问题:页面参数乱码问题。
这个是因为本地的D:\apache-tomcat-5.5.26\conf\server.xml和生产机上的server.xml的配置不一样的问题,我本地的配置是
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
生产机上的是: <Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
如果不指定编码格式,那么默认的编码是iso-8859-1,因此可以使用下面这种方式转码:
public static String getCodeString(String str){
if (str != null && !str.isEmpty()) {
try {
str = new String(str.getBytes("ISO-8859-1"),
"GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return str;
},但是如果指定了编码,那么就不可以这样转码了,否则就会出现乱码。
解决办法:第一、指定文件编码格式,URIEncoding="GBK"
第二、不指定编码,利用getCodeString(String str)方法在程序中对参数处理。
第三个问题:启动程序的时候或者查询的时候后台报内存溢出的错误。java.lang.OutOfMemoryError
这个问题是具有不确定性的,出现是无规律的。只要出现内存溢出了,就需要重启服务器,否则根本就登陆不了系统。
解决办法:在D:\apache-tomcat-5.5.26\bin\catalina.sh中,原来的文件是:
# Set juli LogManager if it is present
if [ -r "$CATALINA_HOME"/bin/tomcat-juli.jar ]; then
JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties"
fi
只需要添加"-Xms128" "-Xmx512"就可以了
# Set juli LogManager if it is present
if [ -r "$CATALINA_HOME"/bin/tomcat-juli.jar ]; then
JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties" "-Xms128" "-Xmx512"
fi
听同事说这是java虚拟机的配置,但是为什么这样改还有待考虑。反正这样改了之后就不出错了。
有的是使用的tomcat的压缩版本,没有catalina.sh文件,怎么办呢?可以看一下
http://blog.csdn.net/sup_heaven/article/details/6911948
第四个问题:后台说找不到 java.lang.String.isEmpty()这个方法。
这个是因为本地项目添加的是jdk1.6的jar包,打包的时候用的是1.5版本的,生产机上使用的是JDK1.5 此时程序编译的时候一定要使用JDK1.5 编译。jdk1.6中的方法无法被1.5的使用。
解决办法:把jar包换成1.5或者是不使用jdk1.6中的方法,java.lang.String.isEmpty()是jdk1.6中的方法。
注意:jdk版本不同是一个很严重的问题,因为在本地运行的好好的程序到生产机上就报错了。