Sun 微博 Slynkr 部署记录

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 前几个月试图将 Sun 为 GlassFish 平台定制的 Web 2.0 微博 Slynkr 部署到 Tomcat6 上,结果完全彻底败给 Sun 了, 下面是全纪录:   1) 自信满满的从 Sun 网站下载了 slynkr.

前几个月试图将 Sun 为 GlassFish 平台定制的 Web 2.0 微博 Slynkr 部署到 Tomcat6 上,结果完全彻底败给 Sun 了, 下面是全纪录:

 

1) 自信满满的从 Sun 网站下载了 slynkr.war  在 MySQL 创建 db slynkrdb.

 

2) 拷贝 slynkr.war 到 $tomcat6/webapps/ 目录, 进入 http://localhost:8080/slynkr/

 

    提示无法获取 java:comp/env/jdbc/slynkr_datasource 数据源;

 

3) 在 $tomcat6/conf/context.xml 配置了 <Resource name="jdbc/slynkr_datasource" ... /> 重启 Tomcat6,

   还是提示无法获取 java:comp/env/jdbc/slynkr_datasource

 

4) Google 后, 设置 Tomcat6 启动环境变量:

 

    JAVA_OPTS='-Djava.naming.factory.initial="org.apache.naming.java.javaURLContextFactory" -Djava.naming.factory.url.pkgs="org.apache.naming"'

 

   重启 Tomcat6, 继续顽固的提示无法获取 java:comp/env/jdbc/slynkr_datasource

 

5) 再 Google 后,修改 $tomcat6/webapps/slynkr/WEB-INF/classes/META-INF/persistent.xml,  将:

 

    <non-jta-data-source>java:comp/env/jdbc/slynkr_datasource</non-jta-data-source>

 

    改为 (请大家注意新加的 '/' 符号!):

 

    <non-jta-data-source>java:/comp/env/jdbc/slynkr_datasource</non-jta-data-source>

 

6) 终于不再提示无法获取 java:comp/env/jdbc/slynkr_datasource, 改为提示 NullPointerException.

 

7) Google 后, 下载 eclipse-link JPA, 修改 $tomcat6/webapps/slynkr/WEB-INF/classes/META-INF/persistent.xml 将原来的 Toplink JPA 替代为 eclipse-link JPA 实现;

 

8) 仍然提示 NullPointerException

 

    看源代码发现获取 JNDI InitialContext 失败, 打印异常后发现 ClassNotFoundException: "org.apache.naming.java.javaURLContextFactory", 而该类在 $tomcat6/lib/catalina.jar 里存在,囧

 

9) 放弃使用 JNDI: <non-jta-data-source> 直接用在 $tomcat6/webapps/slynkr/WEB-INF/classes/META-INF/persistent.xml  写数据库连接 url, user, password:

 

      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://..."/>
      <property name="javax.persistence.jdbc.user" value="..."/>
      <property name="javax.persistence.jdbc.password" value="..."/>

 

10) 好了, 不再提示 NullPointerException, 改为 index.jsp 提示 JSP 编译失败:属性中的 " 号没有转义。

 

11) Google 后, 加环境参数 -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING="false"

 

12) 仍然提示 JSP 编译失败:<jsp:useBean> 类型 Collection<Post> 不适当;

 

13) 挠头, 写了如下正则替换全部 JSP 中的 <jsp:useBean> 为 <% Xxx yyy = (Xxx) zzz.getAttribute("yyy") %>

 

     find . -name '*.jsp' -exec perl -pi -e 's/<jsp:useBean\s+id="([^"]+)"\s+scope="([^"]+)"\s+class="([^"]+)"\s*\/>/<% $3 $1 = ($3) $2.getAttribute("$1"); %>/g' {} \;
     find . -name '*.jsp' -exec perl -pi -e 's/<jsp:useBean\s+id="([^"]+)"\s+class="([^"]+)"\s*\/>/<% $2 $1 = ($2) pageContext.getAttribute("$1"); %>/g' {} \;

 

14) 现在 index.jsp 可以进入, 但显示不全, 后台打印 SQLException:TABLE 'slynkrdb.Users' not found.

 

15) 查 db 发现创建的表名是 USERS,  而 MySQL 表名大小写敏感...

 

16) 下载 User.java Post.java 等 JPA 类, 修改 JPA Annotation, 复制到 $tomcat6/webapps/slynkr/WEB-INF/classes/.../v1/,  重新编译

 

17) 提示各种表名大小写错误... 反复改各种 JPA Annotition 大小写, 终于不再出现 SQLException

 

18) 抹一把汗, 现在 index.jsp 终于可以访问了

 

19) 注册用户, 提示 JavaMail 无法发送邮件. 手头没有合适的 POP3 邮件服务器, 从数据库查出 TOKEN, 然后自己看代码拼激活链接:

 

    http://localhost:8080/slynkr/validate?user=admin&token=...

 

20) 用户激活成功, 发现不能登陆...  前后台没有任何提示, 就是登录失败, 果然 Simple is Beautiful!

 

21) 继续 Google 后, 在 $tomcat6/conf/context.xml 配置 <Realm>

 

    <Realm className="org.apache.catalina.realm.JDBCRealm"
        driverName="com.mysql.jdbc.Driver"
        connectionName="root" connectionPassword="password"
        connectionURL="jdbc:mysql://localhost/slynkrdb?useUnicode=true&amp;characterEncoding=utf8"
        userTable="AUTH_ACCOUNT" userNameCol="ID" userCredCol="PASSWD" roleNameCol="GROUPS"
        digest="SHA-1" />

 

22) 继续无法登录!读了一遍 Slynkr 文档, 从 Sun 下载自己的 slynkr_realm.jar 拷贝到 $tomcat6/lib, 还有 commons-codec-*.jar  然后修改 <Realm>:

 

    <Realm className="com.sun.slynkr.platform.tomcat.SlynkrJDBCRealm" ... />

 

23) 可以登录, 但是还是粗鲁的提示 "You Do Not Have Access to the Requested Resource. " 大写, 黑体!

 

      返回刷新显示已登录。

 

24) 无管理员权限!翻阅代码后, 手动修改数据库:

 

    UPDATE AUTH_ACCOUNT SET GROUPS = 'USERS;VALIDATED;ADMIN' WHERE ID = 'admin'

 

    然后重启,  刷新可以看到 "administration" 管理链接。

 

25) 进入创建 Categories, PostTypes, Ads 一切正常, 回到首页点 Categories -> 刚刚创建的内容, 显示很干净的 NullPointerException:

 

        java.lang.NullPointerException
            at com.sun.slynkr.web.ControllerFilter.doFilter(ControllerFilter.java:457)
            at com.sun.slynkr.web.ControllerFilter.doFilter(ControllerFilter.java:282)
            ...

 

26) 继续点点点, 然后看到了这个异常:

 

        java.lang.RuntimeException: TODO: Implement
            at com.sun.slynkr.impl.UserWriterImpl.addLeader(UserWriterImpl.java:97)
            at com.sun.slynkr.web.FollowingServlet.doGet(FollowingServlet.java:79)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
            ...


27) 最后说一句, 作为一个网站, 只要输入下面的网址, Slynkr 就抛 RuntimeException

 

      http://localhost:8080/slynkr//


            java.lang.RuntimeException: pathString:
                 at com.sun.slynkr.SPath.toQuery(SPath.java:90)
                 at com.sun.slynkr.web.ControllerFilter.doFilter(ControllerFilter.java:351)
                 at com.sun.slynkr.web.ControllerFilter.doFilter(ControllerFilter.java:282)
                 ...

 

28) 无语, 删掉 Slynkr, DROP DATABASE, 睡觉

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
1053 0
|
12月前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
243 3
|
8月前
|
存储 人工智能 Cloud Native
“爆款”批量生成,如何实现一键创作 AI 有声绘本?
“爆款”批量生成,如何实现一键创作 AI 有声绘本?
208 0
|
机器学习/深度学习 资源调度 分布式计算
阿里PAI-ChatLearn:大规模 Alignment高效训练框架正式开源
PAI-ChatLearn现已全面开源,助力用户快速、高效的Alignment训练体验。借助ChatLearn,用户可全身心投入于模型设计与效果优化,无需分心于底层技术细节。ChatLearn将承担起资源调度、数据传输、参数同步、分布式运行管理以及确保系统高效稳定运作的重任,为用户提供一站式解决方案。
|
网络协议 安全 网络架构
NAT穿透技术、穿透原理和方法
【10月更文挑战第19天】 NAT穿透技术、穿透原理和方法
1022 7
|
人工智能 数据安全/隐私保护
|
Shell Linux 开发工具
Vmware 虚拟机挂起恢复后发现无法 Ping 通,无法连接到主机
在Linux主机上,以`root`用户停止NetworkManager服务并重启网络: ```shell systemctl stop NetworkManager systemctl restart network ``` 或修改网卡配置文件`ifcfg-ens33`,添加`NM_CONTROLLED=&quot;no&quot;`,然后重启`network`服务: ```shell vim /etc/sysconfig/network-scripts/ifcfg-ens33 systemctl restart network ```
535 6
|
JavaScript
Vue项目启动报错处理
Vue项目启动报错处理
469 1
|
存储 架构师 NoSQL
一口气讲完数据仓建模方法--数据仓库架构师碎碎念
一口气讲完数据仓建模方法--数据仓库架构师碎碎念