ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

最通俗、最直白的TongWeb应用移植步骤------美其名曰:移植方案

2021-04-04 23:33:55  阅读:4872  来源: 互联网

标签:xml web tomcat TongWeb tongweb 应用 ------ 移植


一、应用能否移植到TongWeb上?

  1. .NET应用为Microsoft 的开发平台,TongWeb不支持。
  2. PHP应用TongWeb通过CGI方式支持PHP,另外TongHttpServer也支持PHP语言。
  3. TongWeb主要以支持JavaEE应用为主。在判断应用能否移植到TongWeb上,只需要了解两个问题:问题一:应用采用的JavaEE规范?  问题二:应用代码有没有跟某一JavaEE应用服务器绑死? 见:https://blog.csdn.net/realwangpu/article/details/114818293 

二、对应用移植的误解

  1.  是否能保证应用100%平滑移植。答:虽有JavaEE规范,但各家厂商的JavaEE应用服务器实现有所不同,并不能保证100%平滑移植。
  2.  JavaEE应用服务器不同版本能不能100%平滑升级? 答:tomcat7与tomcat8不完全兼容,TongWeb6与TongWeb7不完全兼容。
  3.  应用采用XX框架,TongWeb能不能支持? 答:无论采用哪种框架,归根结底还是看其需要的JavaEE规范,可查其官网说明。如Spring MVC:

三、web应用移植了解

       我们以最常见的web应用移植为例进行说明,在开发过程中多以tomcat开发为主,本文主要介绍从tomcat8.x向TongWeb7.0的移植过程,因为tomcat8.x与TongWeb7.0都是JavaEE7的web容器规范。只要应用符合JavaEE7规范,则移植到TongWeb7.0上问题不大。

      1. 首先确认应用能否在tomcat8.x上运行? 若能运行,则更容易迁移到TongWeb7.0上。老版本的tomcat6、7应用也可移植到TongWeb7.0上,但会常见cookie、JSP、tld问题,比如:

          java.lang.IllegalArgumentException: An invalid domain [.sdsoon.cn] was specified for this cookie
             at org.apache.tomcat.util.http.Rfc6265CookieProcessor.validateDomain(Rfc6265CookieProcessor.java:203)

        Tomcat 8更换了默认的 CookieProcessor 实现为 Rfc6265CookieProcessor ,之前的实现为 LegacyCookieProcessor。前者是基于 RFC6265 ,而后者基于 RFC6265 、 RFC2109 、 RFC2616 。可在tomcat8 context.xml中配置 <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />

       2. TongWeb替换tomcat前,了解其在配置上的相同与不同点:

TongWeb7.0配置tomcat8.x配置说明参考

conf/default-web.xml

conf/web.xml

主要用于配置CGI、shtml、jsp编译参数等。

https://blog.csdn.net/realwangpu/article/details/109591883

https://blog.csdn.net/realwangpu/article/details/109684514

conf/tongweb.properties

conf/catalina.properties

主要配置需要过滤annotation的jar

https://blog.csdn.net/realwangpu/article/details/109490040

autodeploy目录,但解压在deployment目录下

webapps目录

自动部署目录https://blog.csdn.net/realwangpu/article/details/110230970
bin下startserver和external.vmoptions脚本

bin/startup和catalina脚本

用于配置JVM参数、-D参数 
conf/tongweb.xml文件

conf/server.xml、context.xml、logging.properties文件

常用通道、虚拟主机、数据源、日志配置。 TongWeb控制台的配置主要存于tongweb.xml。 

            功能相同的常用全局配置参数:

TongWeb7.0tomcat8.x
-Dcom.tongweb.el.parser.SKIP_IDENTIFIER_CHECK=true-Dorg.apache.el.parser. SKIP_IDENTIFIER_CHECK=true
-Dcom.tongweb.catalina.STRICT_SERVLET_COMPLIANCE=true-Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=true
注:可按此规律对比tomcat与TongWeb的参数说明。

         但有些参数位置也会发生变化,常见的比如:Attribute value view.getItems("list") is quoted with " which must be escaped when used  which must be esca 双引号异常问题。TongWeb7.0上需在default-web.xml中配置strictQuoteEscaping为false

<servlet>
    <servlet-name>jsp</servlet-name>
    <servlet-class>com.tongweb.web.jasper.servlet.ThanosJspServlet</servlet-class>
	  <init-param>
          <param-name>strictQuoteEscaping</param-name>
          <param-value>false</param-value>
      </init-param>
......

         tomcat7.x则是: -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false。  tomcat8.x则也是在web.xml中配置。

      3. TongWeb的 “Web应用迁移工具”,则是将tomcat中配置的数据源、虚拟主机、通道等常用配置迁移到TongWeb下,并检查应用去掉一些不必要的类,将其部署在TongWeb上,但不对其应用JSP、代码做差异化检查,仍需人工测试检查。注意:一些不常用的tomcat配置在TongWeb上也有配置,只不过没有写在手册中而已。

四、移植tomcat下web应用步骤

       1. 搭一套TongWeb7.0与tomcat8.x的运行环境,并保证tomcat8.x与TongWeb7.0在同一台机器、使用同一 JDK、同一数据库、同一应用包。这样通过对比测试容易定位问题方向。

       2. 一定把bin/external.vmoptions中的-DWebModuleOnly=false设为true,这样将近似tomcat的web容器功能,不加载EJB,JPA,CDI、mail这些,以免移植引起各类问题。最常见的为CDI、JPA冲突,实际项目中常用hibernate JPA,而TongWeb自带所带OpenJPA常会与应用冲突。

      3. 若确认应用没有采用JavaEE5规范之后的annontation,则可把tongweb.properties中的tongweb.util.scan.StandardJarScanFilter.jarsToSkip加上*.jar。否则可能引起一些没有必要的annontation扫描异常,见:https://blog.csdn.net/realwangpu/article/details/109490040 。若应用用了annontation则不要盲目的设为*.jar,否则应用功能不能正常加载。

      4. 参考tomcat启动脚本增加的参数设置到TongWeb的bin/external.vmoptions中,参考tomcat的conf/web.xml配置设置到TongWeb的conf/default-web.xml中。

      5. 若tomcat上配置的数据源,则需要在TongWeb上配置数据源。两者均需将数据库JDBC驱动包放在TongWeb/tomcat的lib下。

       //tomcat数据源
       <Resource
           name="jdbc/testdb"
           auth="Container"
           type="javax.sql.DataSource"
          factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3316/platform?serverTimezone=UTC"
          ......

          TongWeb上配置数据源

          TongWeb与tomcat在数据源调用上不同,见:https://blog.csdn.net/realwangpu/article/details/115036184

      6. 若有乱码问题,则注意tomcat与TongWeb的编码配置,“URL编码格式”等于URIEncoding,uri处理等于“useBodyEncodingForURI”。

 <Connector port="8080"   maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
               enableLookups="false" redirectPort="8443" acceptCount="100" 
               connectionTimeout="20000"  disableUploadTimeout="true" useBodyEncodingForURI="true"   URIEncoding="GBK"/> 

       7.  静态资源配置。

 <!-- tomcat  的静态资源映射配置 -->
    <Context path="/html" docBase="/home/static/html" reloadable="true" crossContext="true"></Context> 

    TongWeb的静态资源配置

    方法一:在该静态目录下增加WEB-INF目录,当成web应用部署在TongWeb上。
    方法二:在应且的WEB-INF目录下增加tongweb-web.xml文件,设置虚拟目录。
    <?xml version="1.0" encoding="UTF-8"?>
   <tongweb-web-app>
       <property name="aliases" value="/html=/home/static/html"/>
   </tongweb-web-app>

       8. 检查应用包,web应用的WEB-INF/lib下通常存在大量重复但版本不同的jar或是无用的jar。 tomcat*.jar,weblogic.jar这些为其它应用服务器的jar,TongWeb上不需要,且容易与TongWeb冲突。javax.servlet、 javax.ejb、 javax.jms、 javax.websocket等这些类为JavaEE 规范类,TongWeb已提供,应用无需再带。    

       9. 部署应用包,tomcat下的应用包根下可以没有WEB-INF目录,而TongWeb下应用必须有WEB-INF目录才认为是合法的web应用。ROOT目录下的应用相当于TongWeb上部署应用时"应用前缀为"  / 。若部署失败注意查看server.log分析原因。

      10. 测试应用功能点是否正常,从tomcat5,6,7移植到TongWeb7.0上的应用重点检查JSP编译是否正常。

五、Spring Boot嵌入式应用移植

      1. 需使用TongWeb7.0.E嵌入版替换tomcat-embed版本。

      2. 主要是在通过maven打成jar包时,去掉tomcat相关jar,引入TongWeb相关jar。如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <!-- 不用tomcat -->
    <exclusions>
        <exclusion>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-tomcat</artifactId>
         </exclusion>
    </exclusions>
</dependency>
<!--引入tongweb包 -->
<dependency>
    <groupId>com.tongweb.springboot</groupId>
    <artifactId>tongweb-spring-boot-starter</artifactId>
    <version>2.x.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.tongweb</groupId>
    <artifactId>tongweb-embed</artifactId>
    <version>7.0.E.1</version>
</dependency>

       3. Spring Boot主配置文件application.properties中tomcat相关配置改为TongWeb的即可。

#tomcat配置
server.tomcat.uri-encoding=UTF-8
server.tomcat.min-spare-threads=10
server.tomcat.max-threads=200
#TongWeb配置
server.tongweb.uri-encoding=UTF-8
server.tongweb.min-spare-threads=10
server.tongweb.max-threads=200

六、针对其它应用服务器的移植

      1. 若采用JBoss、WebLogic、WebSphere应用服务器,但仅仅是web应用,也可移植到TongWeb,主要是关注JSP编译问题以及有没有针对特定应用服务器的特殊配置。如:

  <!--  weblogic.xml配置,相当于TongWeb的子加载 -->
  <container-descriptor>
      <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>

       2.若应用用到了CDI、EJB、JCA等功能,则一定要把-DWebModuleOnly设为false。

       3.针对EJB容器层的移植主要是关注各应用服务器特定的EJB2.1的xml文件和EJB JNDI命名规则。TongWeb7.0提供对JBoss、WebLogic等的EJB xml文件解析。

<!-- 如weblogic-ejb-jar.xml  --> 
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-ejb-jar>
    <weblogic-enterprise-bean>
        <ejb-name>TestEJB</ejb-name>
        <jndi-name>TestEJBRemote</jndi-name>
    </weblogic-enterprise-bean>
</weblogic-ejb-jar>

//解析weblogic-ejb-jar.xml
package com.tongweb.tongejb.jee.wls;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="weblogic-ejb-jar", propOrder={"description", "weblogicEnterpriseBean", "securityRoleAssignment", "runAsRoleAssignment", "securityPermission", "transactionIsolation", "messageDestinationDescriptor", "idempotentMethods", "retryMethodsOnRollback", "enableBeanClassRedeploy", "disableWarning", "workManager", "weblogicCompatibility"})
public class WeblogicEjbJar
{
  public Description description;

  @XmlElement(name="weblogic-enterprise-bean")
  public List<WeblogicEnterpriseBean> weblogicEnterpriseBean;

  @XmlElement(name="security-role-assignment")
  public List<SecurityRoleAssignment> securityRoleAssignment;

  @XmlElement(name="run-as-role-assignment")
  public List<RunAsRoleAssignment> runAsRoleAssignment;

  @XmlElement(name="security-permission")
  public SecurityPermission securityPermission;

  @XmlElement(name="transaction-isolation")
  public List<TransactionIsolation> transactionIsolation;

  @XmlElement(name="message-destination-descriptor")
  public List<MessageDestinationDescriptor> messageDestinationDescriptor;

  @XmlElement(name="idempotent-methods")
  public IdempotentMethods idempotentMethods;

        说明:由于近年采用EJB开发的项目很少,应用主要采用spring框架,所以针对EJB层的移植差异说明经验很少,这部分只能具体问题具体分析。至于不同应用服务器之间web容器层的差异,除去标准的JavaEE规范外,各应用服务器自身的特点也鲜有深入的对比分析,这也就是TongWeb的“Web应用迁移工具”只能做到配置迁移的原因。

标签:xml,web,tomcat,TongWeb,tongweb,应用,------,移植
来源: https://blog.csdn.net/realwangpu/article/details/115422262

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有