一,參考文章:
(1)基於 Apache Mahout 構建社會化推薦引擎:http://www.ibm.com/developerworks/cn/java/j-lo-mahout/
(2)“基於 Apache Mahout 構建社會化推薦引擎”一文例子運行紀實 :http://blog.csdn.net/softwarehe/article/details/7465151
(3)對 基於 Apache Mahout 構建社會化推薦引擎 一文的補充:http://www.cnblogs.com/abelstronger/articles/2093847.htm
二,說明:
運行環境是:linux下myeclipse8.0+tomcat6.0,用的時mahout0.5。
由於是linux環境,所以可能js代碼有警告,這里先忽略。
整個過程主要參考了原文一(1),這是基礎,原始代碼也是從原文下載的;
搭建過程主要參考一(2),基本上大的問題在該文中都給出了解決辦法;
數據導入過程參考了一(3),不過由於時linux下,所以數據路徑稍微修改了一下。
這里主要是對以上作者的工作做一個稍微的補充,希望對以后的同學能有一定幫助。
三,具體建立工程過程
(1)在myeclipse下建立web project 工程,命名為MovieSite。
(2)在WebRoot/WEB-INF/lib下導入各種包,具體如下圖:

這里做一下說明
說明1:
lib 下的包主要是將 demo 時生成的推薦引擎 Web 應用的 war 包解壓縮,將 lib 下的 jar 文件拷貝到 MovieSite 的 lib 目錄下,同時將jasper.jar,mysql-connector-java-5.0.6-bin.jar考入lib中。
說明2:
由於采用的時tomcat6.0,Tomcat6.0之前的版本以Tomcat5.5.20 壓縮版為例,jasper-runtime.jar在Tomcat5.5.20\common\lib下就自帶有的。但是在Tomcat6.0版本后lib包的位置調整了,現在只有lib在跟目錄下。jasper-runtime.jar和jasper-compiler-jdt.jar、jasper-compiler.jar等都集成到jasper.jar包中去了,所以直接包含jasper.jar就可以了。
參考:http://wenku.baidu.com/view/f4f3fa0190c69ec3d5bb7557.html
說明3:
lib下並沒有servlet-api.jar和jsp.jar,主要原因是jsp-api.jar和servlet-api.jar這兩個包tomcat的common\lib已經有了,必須將\WEB-INF\lib\目錄下的去掉,否則會沖突的,會引起validateJarFile(/usr/local/src/tomcat6/webapps/MovieSite/WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class。
參考:End2012的 http://hi.baidu.com/lpzsybgekvbdkrd/item/f975beac2a08b59b14107302 一文。
(3)在src下導入原來工程的各種包,具體如下:

其中前面的6個包是原來的MovieSite工程已經有的,,dataimporter是向數據庫插入數據的幾個class,主要是參考一(3)的數據導入部分,包括ImportMovies.java,ImportRatings.java,ImportUsers.java,這里
說明1:
有一點需要注意的,由於數據是后來導入的,導入movies數據的時候沒有問題,不過在導入movie_preferences的時候注意去掉對users表的外鍵參考(因為此時users表為空呢)。
說明2:
導入數據之后會報DBUtils.java下趙不到getJDBCConnection,解決辦法就是在DBUtils.java下添加getJDBCConnection()類,(參考一(2)的數據導入部分)。
說明3:
這個時候會提示com.ibm.taste.example.movie.recommender中的幾個class出現錯誤,,主要是類型錯誤,將類中參數Rescorer<long>rescorer 修改為IDRescorer rescorer即可。
說明4:
這時候可能會提示MovieDataModel.java有問題,在MovieDataModel.java,添加一行public final static String TIMESTAMP_COLUMN = "timestamp";這里的timestamp對應的是數據庫表里邊的字段名,不能亂寫,再出錯的super函數最后加上一個參數 TIMESTAMP_COLUMN,這個編譯錯誤消失(參考一(2))。
(4)配置web.xml
不知道是什么原因,我參考一(2)配置web.xml總是出現錯誤,所以,我就直接在新項目的web.xml中手動添加各個參數,最終web.xml如下:
View Code
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <description>Movie recommender servlet</description> <display-name>Movie Recommender</display-name> <servlet-name>movie-recommender</servlet-name> <servlet-class>com.ibm.taste.example.movie.servlet.MovieRecommenderServlet</servlet-class> <init-param> <param-name>recommender-class</param-name> <param-value>com.ibm.taste.example.movie.recommender.UserBasedRecommender</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <display-name>Apache-Axis Servlet</display-name> <servlet-name>axis</servlet-name> <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class> </servlet> <servlet> <display-name>User Servlet</display-name> <servlet-name>user</servlet-name> <servlet-class>com.ibm.taste.example.movie.servlet.UserServlet</servlet-class> </servlet> <servlet> <display-name>Movie Servlet</display-name> <servlet-name>movie</servlet-name> <servlet-class>com.ibm.taste.example.movie.servlet.MovieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>movie-recommender</servlet-name> <url-pattern>/recommend</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>user</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>movie</servlet-name> <url-pattern>/movies</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>axis</servlet-name> <url-pattern>*.jws</url-pattern> </servlet-mapping> <!-- The rest of the config is adapted from Axis's default web app --> <session-config> <session-timeout>5</session-timeout> </session-config> <mime-mapping> <extension>wsdl</extension> <mime-type>text/xml</mime-type> </mime-mapping> <mime-mapping> <extension>xsd</extension> <mime-type>text/xml</mime-type> </mime-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <login-config> <auth-method>BASIC</auth-method> </login-config> <resource-ref> <description>DB Connection</description> <res-ref-name>jdbc/movie</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
(5)將index.html文件,style文件夾,images文件夾,script文件夾拷貝到WebRoot下,修改index.html的一些警告。
(6)部署項目運行

在Email中輸入users表中的數據例如:test1@gmail.com , Password中不用輸入,Login即可,結果如下:

四,總結
雖然可以看到結果,不過還有幾個問題,現在正在修改中,,,
(1)警告:You are not using ConnectionPoolDataSource. Make sure your DataSource pools connections to the database itself, or database performance will be severely reduced.,看來連接池還有問題,
(2)關閉項目時:The web application [/MovieSite] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
(3)關閉項目時:The web application [/MovieSite] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
