Java - 行者无疆 始于足下 - 行走,思考,在路上
纠结的j2ee之旅
还没启程,就遇到了诸多意想不到的问题……弄得我焦头烂额,极度郁闷。
web开发本身就是的部署本身就是一件极其纠结复杂的事情,在正是进入web开发前先要搞懂什么叫静态网页、动态网页,什么叫服务器、客户端,什么叫tcp/ip,什么叫html/css,什么叫做动态语言等等;而要进行j2ee的web开发,新概念的爆炸简直是一场急风暴雨,扑面而来,譬如jsp、javabeans、struts、hibernate、spring、ejb、设计模式、MVC等等,令人目不暇接,说实话这写概念到今天我也只是略懂皮毛,因此寻求一款好用的IDE协助开发成了当务之急。等到真正熟悉了整个开发流程和原理,再尝试着转回CLI,寻求一种full-control的感觉。
想进行Java Web开发,第一个前提是有Java,第二个前提是有Web。Gentoo上的Java还是好搞定的,一条命令几乎什么都设置好了,也不用像windows那样去设置PATH环境变量。但是令人比较混乱的是java的选择问题。Gentoo上的jdk至少有5、6种,什么ibm的、apple的、sun的等等,还有什么openjdk——貌似是sun-jdk的开源版本,icedtea(A harness to build the OpenJDK using Free Software build tools and dependencies),GNU Classpath。默认安装的是icedtea6-bin。反正搞到最后,命令行下敲一个java和javac,能用了,因此关于openjdk和sunjdk之间到底是什么关系,我也就没有再深究了。
Java好了,接下来就是开发环境的选择了。记得去年的java程序设计,我单用emacs就搞定了1500行的java校车查询系统,因此emacs+jde+ecb应该也能胜任。但是今年的J2EE Project更侧重web和database,这方面我不熟,因此就想暂时偷偷懒,找个IDE暂时搪塞一下。
关于Java开发的IDE,除了已经“廉颇老矣”的JBuilder,恐怕只剩下Eclipse和Netbeans了。早先安装过这两个大名鼎鼎的IDE,觉得还是Eclipse更美观一点,因此这次也就首选Eclipse进行安装。安装过程倒也顺利,只是众所周知,Eclipse和Emacs一样是一个平台,需要插件的协助才可以“建功立业”。习惯了linux自动化的包管理系统后,自然也希望Eclipse的插件管理也有类似的功能:自动下载,自动配置,自动判断依赖。可是我几乎在网上找了一天,也没有找到合适的网址,作为Eclipse插件的“源”,自然是及其郁闷,索性放弃,去做别的事情。
后来一次做嵌入式的实验,闲来无聊,就下了windows版的eclipse安装在实验室的电脑上,然后在这个版本上的eclipse找到了比较合适的更新网址(泪流满面,真不容易):
- EPP Packages Repository http://download.eclipse.org/technology/epp/packages/galileo
- Galileo http://download.eclipse.org/releases/galileo
- Mylyn for Eclipse 3.4 and 3.5 http://download.eclipse.org/tools/mylyn/update/e3.4/
- The Eclipse Project Updates http://download.eclipse.org/eclipse/updates/3.5
- The Eclipse Web Tools Platform (WTP) Project update site http://download.eclipse.org/webtools/updates
这样总算能安装一些常规插件了(什么?你问我怎么安装?呃,这个问题还是先问问百度先生和google小姐吧。)我安装了Eclipse CDT、Eclipse WTP,还有一些看似像但不知道能不能用的上的插件。
老师用的是MyEclipse,对于MyEclipse,我的理解就是一个插件的集合,针对Java Web开发做了整合优化。我也想图省事,就去校内的神网搜索,只有MyEclipse 7.0 for linux版本,装之……无法启动……直接sudo rm -rf /where/is/myeclipse/……我又想到最新出的MyEclipse 8.5版会不会好一点,结果是,MyEclipse的官网说”你们中国盗版太严重了“,因此封了所有来自中国的ip,所以也就无法访问了,彻底无语了……
Eclipse安装完毕,简单Hello World也能跑。好啦,开始配置Web和Database。
涉及到的Web服务器主要有两个,Apache和Tomcat。这两者是什么关系,有没有相互的依赖性,又是一头雾水。貌似Apache主要解析静态网页,配上php模块可以解析动态php网页,而Tomcat则主要解析Servlet和Jsp。具体依赖性我就不知道了。不过Tomcat是Apache的子项目倒是真的。Apache的配置比较简单,参见Gentoo Wiki,而Tomcat的配置又出了很大的问题。Gentoo Docs上的Tomcat Guide有这么一段:
The root directory of a typical Tomcat binary distribution is laid out as illustrated in the following listing.
Code Listing 2.1: Standard Tomcat Root Directory Layout |
/opt/tomcat-x.y/bin /opt/tomcat-x.y/common /opt/tomcat-x.y/conf /opt/tomcat-x.y/logs /opt/tomcat-x.y/server /opt/tomcat-x.y/shared /opt/tomcat-x.y/temp /opt/tomcat-x.y/webapps /opt/tomcat-x.y/work |
Note: Substitute either 5, or 5.5 for x.y |
To comply with FHS and Gentoo standards, Tomcat has been dissected and installed into the following locations.
Code Listing 2.2: Gentoo Tomcat Layout |
/usr/share/tomcat-x.y/bin /usr/share/tomcat-x.y/common /etc/tomcat-x.y /var/log/tomcat-x.y/logs /usr/share/tomcat-x.y/server /var/lib/tomcat-x.y/shared /var/tmp/tomcat-x.y /var/lib/tomcat-x.y/webapps /var/run/tomcat-x.y |
这里面又涉及到一个FHS(Filesystem Hirarchy Standard)的概念。简单的说,tomcat的“正常”安装(在windows平台上)呢,其所有的安装文件都应该在同一个目录下,但是Linux(Gentoo)呢,则有自己的标准(就是FHS),比如临时文件放/tmp和/var,配置文件放/etc里,因此gentoo就把tomcat这个包拆了放到不同的目录里面,这样和自己的哲学比较统一,也确实比较便于管理,比如gentoo环境下开机自动启动apache和tomcat,只需要:
sudo rc-update add apache2 default sudo rc-update add tomcat-6 default
事实上重启后apache和tomcat服务都已经启动,在浏览器地址栏输入http://localhost/就会出现apache的经典宣传口号“It works!",但是输入http://localhost:8080,浏览器却显示一片空白,再次输入http://localhost:8080/manager/html时,跳出一个对话框,询问manager的用户名和密码(这个密码需要自己配置),正确配置了用户名和密码后重启tomcat输入manager/html,是出现了一个界面,但是功能残缺不全,很多超链接指向html但是实际目录中的文件确实xml格式。而且Eclipse的tomcat插件要求tomcat的安装必须在同一个目录下。我曾想着在/opt/tomcat做几个ln -s的软链接,但终究失败。搜索良久,我找到了这片文章,里面描述的的窘境和我的情况一样。
没办法了,只能去官网下了tarball,自己解压手动安装到/opt/tomcat目录中。然后每次开机手动启动tomcat,这下Eclipse的插件配置也好了……此时的我泪流满面……然后呢,参考ibm developerworks上的文章,兴冲冲地在Eclipse中建立Dynamic Web Project,写了一个"hello, jsp",然后启动tomcat,又出现了tomcat无法启动的问题:
然后我就无语掉了……继续泪流满面……
看来,偷懒的方法不成,还是得回到原始生活时代,开始上网搜一些emacs开发j2ee的东西。用脚趾想也能想得到,用emacs的少,用emacs开发java的少,用emacs开发j2ee的就更少了,因此资料也是出奇的少,相关插件也不完善。拿最简单的jsp来说,我觉得怎么也应该有一个比较顺手的jsp-mode的插件吧,可是结果令人失望……分别尝试了mmm-mode,multi-mode,jsp-mode,nxhtml-mode,可是无一如意,要么是bug无法启动,要么是用了一段时间后就bug,无法正确缩进(nxhtml)等等,于是这条路也走不通了。
于是就剩下最后一个备胎了,netbeans。老实说我不太喜欢netbeans(我觉得界面和字体照eclipse差远了,java swing做出来的东西貌似没几个特别好看的)。emerge一下,提示有几十个包300M的东西要下载,好大的家伙,忍了。然后呢,开始的几十个包安装还是很顺利的。只是到了jnlp这个包,出现了以前没有遇到的问题:
>>> Emerging (1 of 3) dev-java/jnlp-bin-1.2-r1 !!! dev-java/jnlp-bin-1.2-r1 has fetch restriction turned on. !!! This probably means that this ebuild's files must be downloaded !!! manually. See the comments in the ebuild for more information. * Please download javaws-1_2-dev.zip and place it in /usr/portage/distfiles * https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=7026-jaws_dev_pack-1.2-oth-JPR@CDS-CDS_Developer * Fetch failed for 'dev-java/jnlp-bin-1.2-r1', Log file: * '/var/tmp/portage/dev-java/jnlp-bin-1.2-r1/temp/build.log' >>> Failed to emerge dev-java/jnlp-bin-1.2-r1, Log file: >>> '/var/tmp/portage/dev-java/jnlp-bin-1.2-r1/temp/build.log' * Messages for package dev-java/jnlp-bin-1.2-r1: * Fetch failed for 'dev-java/jnlp-bin-1.2-r1', Log file: * '/var/tmp/portage/dev-java/jnlp-bin-1.2-r1/temp/build.log'
google了一下,大概意思是由于license问题,需要到sun的网站上去下载,需要”同意某个许可“,然后给出一个下载链接,就是上面的log中给的那个长串,可是令我极其郁闷的是这个链接怎么也打不开,用wget -c也下载不下来,最后我怀疑是GFW的问题。shit,真是不能忍了,本来不想折腾的。把人逼到绝境。于是我就想起了前不久看到的一个west-chamber计划,好在linuxsir上面还有相关的帖子教程,加了gentoo-china的overlay,可是用eix搜索却怎么也搜不到这个ebuild,奇了怪了,又搜寻了好久,原来是layman升级到1.3后overlay portage的位置改变了,找到了sabayon forums上的帖子,解决了layman的问题,这写总算可以emerge west-chamber了。
编译的过程出了问题,原来是内核配置的问题,又照着linuxsir上的帖子改了.config文件,重新编译了内核,现在还没有重启,不知道能否成功编译west-chamber,翻越GFW。
“待月西厢下,迎风户半开,隔墙花影动,疑是玉人来。”