还没启程,就遇到了诸多意想不到的问题……弄得我焦头烂额,极度郁闷。

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。反正搞到最后,命令行下敲一个 javajavac ,能用了,因此关于 OpenJDK 和 Sun-JDK 之间到底是什么关系,我也就没有再深究了。

Java 好了,接下来就是开发环境的选择了。记得去年的 Java 程序设计,我单用 Emacs 就搞定了 1500 行的 Java 校车查询系统,因此 Emacs + JDEE + ECB 应该也能胜任。但是今年的 J2EE Project 更侧重 Web 和 Database,这方面我不熟,因此就想暂时偷偷懒,找个 IDE 暂时搪塞一下。

关于 Java 开发的 IDE,除了已经“廉颇老矣”的 JBuilder,恐怕只剩下 EclipseNetbeans了。早先安装过这两个大名鼎鼎的 IDE,觉得还是 Eclipse 更美观一点,因此这次也就首选 Eclipse 进行安装。安装过程倒也顺利,只是众所周知,Eclipse 和 Emacs 一样是一个平台,需要插件的协助才可以“建功立业”。习惯了 Linux 自动化的包管理系统后,自然也希望 Eclipse 的插件管理也有类似的功能:自动下载,自动配置,自动判断依赖。可是我几乎在网上找了一天,也没有找到合适的网址,作为 Eclipse 插件的“源”,自然是及其郁闷,索性放弃,去做别的事情。

后来一次做嵌入式的实验,闲来无聊,就下了 Windows 版的 Eclipse 安装在实验室的电脑上,然后在这个版本上的 Eclipse 找到了比较合适的更新网址(泪流满面,真不容易):

这样总算能安装一些常规插件了(什么?你问我怎么安装?呃,这个问题还是先问问百度先生和 Google 小姐吧。)我安装了 Eclipse CDTEclipse 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 服务器主要有两个,ApacheTomcat。这两者是什么关系,有没有相互的依赖性,又是一头雾水。貌似 Apache 主要解析静态网页,配上 PHP 模块可以解析动态 PHP网页,而 Tomcat 则主要解析 ServletJSP。具体依赖性我就不知道了。不过 Tomcat 是 Apache 的子项目倒是真的。Apache 的配置比较简单,参见 Gentoo Wiki,而 Tomcat 的配置又出了很大的问题。Gentoo Docs 上的 Tomcat Guide 有这么一段:

Standard Tomcat Layout

The root directory of a typical Tomcat binary distribution is laid out as illustrated in the following listing.

/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

Gentoo Tomcat Layout

To comply with FHS and Gentoo standards, Tomcat has been dissected and installed into the following locations.

/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,只需要:

事实上重启后 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。

“待月西厢下,迎风户半开,隔墙花影动,疑是玉人来。”