做java开发一年零两个月,发现自己对于项目部署这一块还很模糊。于是趁空闲时间,在阿里云上买了个服务器,试着把平时写的项目部署下,以便对部署生产环境有更为细致深入的理解。最终结果是部署成功了,下面我把这一过程中遇到的坑记录下,避免以后重蹈覆辙,方便自己也方便他人。
一、购买云服务器
二、安装oracle数据库
由于安装的是服务器版的centos,服务器上通常不会安装图形界面。在字符界面下安装oracle11g过程比较复杂(这个以后有时间再认真研究下),我在阿里云市场上找了一个直接初始化进来就已经安装了oracle的centos镜像。
linux下安装oracle教程:
http://www.cnblogs.com/vesaa/p/9213749.html
https://www.cnblogs.com/yingsong/p/6031235.html
https://www.cnyunwei.cc/archives/1156
https://blog.csdn.net/u011391839/article/details/76566316
该环境为centos 6.8 x64,jdk1.8,oracle11.2.0.4.0,Tomcat9,apache2.2
三、开启服务器端口
假定阿里云分配的公网地址为47.90.220.210,我将web应用部署在tomcat下,tomcat默认端口为8080。
oracle的默认端口为1521,,这个需要开启。有时需要远程连接生产环境数据库,查看下数据。
网上有说通过iptables和firewalld来修改,这些我都试过了,没有用;可能在自己虚拟机上面做实验能用。
后来专门找了下,阿里云需要“本实例安全组-->出入方向规则”中进行配置
四、远程导入oracle数据库
oracle数据存成了dmp文件,要先创建表空间,然后将该文件通过imp命令进行远程导入操作。
另外,我想用客户端工具(plsql)远程连接oracle,有以下问题及注意点:
1.ORA-12170 TNS 连接超时
参考https://www.cnblogs.com/kerrycode/archive/2012/12/14/2818421.html,我发现在tnsping的时候显示操作超时,说明是防火墙的问题。解决参考三
2.检查下是否开启共享
在linux服务器上,进入oracle,运行select count(*) from v$shared_server;
如果不为0,说明已经开启了共享服务器模式。我的已经打开了
五、将war包传输到远程linux服务器上
这里说明下,通常工作中,会在本地弄好一个war包(绝大多数是通过ide工具生成的),然后再借助xftp4等工具传输过去。
我这边自己为了能多熟悉一下linux操作,就没有通过网络把编译好的war包传过去,主要做了以下两步操作:
1.在远程linux机上把最新的代码用svn命令导出来
2.使用ant工具编译web项目,生成war包
步骤一:svn命令导出最新的项目代码
centos6.8上预装了svn工具,
我在输入命令svn export https://svnserver/branch/V1.0/myweb "/root/myweb/" --username test1 --password test1(这条命令是说从指定svn服务器上使用账号密码导出myweb这一项目的最新代码,并且不带svn信息;有关svn命令的使用,可以参考https://blog.csdn.net/aresiii/article/details/52253155)
进行导出时,报了这样的错
handshake failed: SSL error: Key usage violation in certificate has been detected
参考https://blog.csdn.net/kongdeqian1988/article/details/70228175,发现原因是svn版本太老,将svn升级到1.8(添加yum源,卸载旧包,安装新包)就可以解决该问题
步骤二:用apache的ant工具(ant基础教程)编译项目,生成war包
如果只是简单打成war包,只要直接进到项目的WebRoot目录下(假如我的项目名称叫myweb),键入命令jar -cvf myweb.war ./*就可以了。问题是这个命令只管打包,不管编译(如果只是几个文件还好,现在有上千个java文件需要进行编译),也不管目录结构是否符合war包的要求(至于什么样的war是符合要求的,可以自己使用eclipse中的生成war包功能,查看下里面生成的war是什么样的)。
所以需要用到一个构建工具ant,我使用的版本是apache-ant-1.9.13-bin.tar.bz2
1)下载ant工具,wget -c http://mirror.bit.edu.cn/apache//ant/binaries/apache-ant-1.9.13-bin.tar.bz2
然后将文件解压至/usr/local目录下
配置如下(https://www.cnblogs.com/sell/archive/2013/07/24/3210198.html):
2)根据项目代码中已有的build.xml,使用ant编译web项目
报了以下错误:
ANT编译错误: 编码utf8的不可映射字符
网上搜的大部分都是说编码gbk的不可映射字符(如https://blog.csdn.net/yuelong2456/article/details/20639025),然后说再改成utf-8。但我现在写的已经是utf-8(复制、移动、编译用的都是utf-8的编码)
找到几个靠谱点的(https://blog.csdn.net/chagaostu/article/details/46710287 https://www.cnblogs.com/haitao-fan/p/3336409.html),使用eclipse的jdt进行编译即可
我把JDTCompilerAdapter放到ant安装目录的lib下了,结果又报错:
ant build.compiler org.eclipse.jdt.core.JDTCompilerAdapter not found
参考http://blog.sina.com.cn/s/blog_8d8f99440102ux99.html,发现需要把eclipse的plugins目录下的jdt相关的lib包(不清楚的话,就直接把eclipse下所有带jdt的全都拷过去)都放到ant_home/lib目录下
结果还是报错:Arrays cannot be resolved
百度查了下(https://blog.csdn.net/laosaidan/article/details/75305493),eclipse较低版本(我的是4.4的)用jdk1.8会本身就会报这种诡异的错误,用1.7就不会。
有两种解决办法:a.卸载jdk1.8,装1.7版本的 b.下载最新的eclipse,从中复制jdt相关的lib包
我选择第2种方法(第1中比较简单,就不试了;第2中没试过),下载了eclipse-jee-neon-3-win32-x86_64.zip
将其中22个包全部上传到远程linux的ant_home/lib目录下
这下终于编译成功了!