zoukankan      html  css  js  c++  java
  • DailyMasalaCMS升级记录

    手头上是一个比较老的工程,Jdk1.7 + Tomcat7.0 + Spring 3.x + Hibernate 3.x + Elasticseach 2.x

    最近Elasticsearch升级,jar需要使用最新的5.2版本,随之而来一系列问题。

      1.Es 5.2版本的jar包 需要jdk1.8支持

      2.Jdk1.8不再支持Spring 3.x

      3.升级Spring 4.x 顺便把Hibernate也升级成第4版

    最终项目环境为:Jdk1.8 + Tomcat7.5 + Spring 4.x + Hibernate 4.x + Elasticsearch 5.x

    下面记录一下整个过程中所遇到的问题和所填的坑:

    1.升级es jar包为5.x,maven打包版本改为1.8

    <!--Elasticsearch-->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.2.0</version>
    </dependency>
    
    
    <!--pom.xml-->
    <plugins>
                <!-- compiler插件, 设定JDK版本 -->
              <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <showWarnings>true</showWarnings>
                        <compilerArguments>
                            <extdirs>srcmainwebappWEB-INFlib</extdirs>
                        </compilerArguments>
                    </configuration>
                </plugin>
    
                <!-- war打包插件, 设定war包名称不带版本号 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <warName>goldlocker-manager</warName>
                    </configuration>
                </plugin>
         </plugins>

    这里会遇到一个问题:如果是用1.8版本编译的工程,在tomcat (1.7)上运行,会报错;

    解决办法:将tomcat运行环境改为jdk1.8

    Linux系统下环境为Jdk1.7,有一些软件还在使用这个版本的Jdk.所以不能改系统环境,但是可以修改Tomcat所使用的环境.
    1.修改catalina.sh     在文件头部加上:export JAVA_HOME=/usr/local/java/jdk1.8.0_121
    2.修改setclasspath.sh   在文件头部加上:export JAVA_HOME=/usr/local/java/jdk1.8.0_121

    2.升级Spring 4.x

      在升级Spring,倒是没有多少麻烦的,只需要将Jar包中的Spring3版本改为4即可。确保升级后的工程中,不会出现Spring3 和 Spring4同时存在的情况。但是这里有这样一个问题,我的war包中有引用之前自己生成的jar包,这些jar包里面使用的是Spring3,所以这个时候需要找到之前的源代码,将之前工程中的pom文件中修改Spring的版本,然后重新install,即可。

    3.升级Hibernate 4.x

      在升级Hibernate的过程中遇到的问题最多。有如下几点:

      1. Hibernate4里面没有Hiberate.STRING、Hiberate.Integer这种写法。

     正确写法为:StringType.INSTANCE、IntegerType.INSTANCE    http://www.iteye.com/problems/94206

     

      2. 修改Spring中sessionFactory配置文件

    java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'manageOpLogConsumer': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.cyou.nad.goldlocker.dao.ManageOpLogDao com.cyou.nad.goldlocker.log.ManageOpLogConsumer.opLogDao; nested exception is java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition; at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) ~[spring-beans-4.2.9.RELEASE.jar:4.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1219) ~[spring-beans-4.2.9.RELEASE.jar:4.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:551) ~[spring-beans-4.2.9.RELEASE.jar:4.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.9.RELEASE.jar:4.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.9.RELEASE.jar:4.2.9.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.9.RELEASE.jar:4.2.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.9.RELEASE.jar:4.2.9.RELEASE]

    解决办法:
      原先:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
      改成:<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
      http://blog.csdn.net/u011080848/article/details/37506915

     

      3.javax.persistence.Table.indexes()异常原因

    Caused by: java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
    在网络上搜索这个错误,基本上都是说@Table注解的问题,然后我发现有人说使用@Entity(name="topic")注解可以解决问题,但是工程中存在相同的Bean对应同一张表的情况,所以如果使用@Entity会出现如下错误:
    Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of the same entity name twice: topic

    最后发现,其实改为@Entity并不能解决问题,这里并不是@Table注解的问题。通过搜索和分析发现原来是自己的工程中存在两个版本的hibernate-jpa。
    一个为2.0版本,一个为2.1版本。
    这里需要去除旧的2.0版本,然后问题解决。
    https://my.oschina.net/JasonZhang/blog/539095

      4.Hibernate4 获取session问题

    org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session 
    原因:hibernate4之后,spring31把HibernateDaoSupport去除,包括数据访问都不需要hibernatetemplate,这意味着dao需要改写,直接使用hibernate的session和query接口。
    http://godo121.iteye.com/blog/1473563

    这里涉及到要重写工程中的BaseDAO.在重写的过程中遇到的主要问题是在获取session上。
    获取session有两种方式:
      1.sessionFactory.getCurrentSession();
      2.sessionFactory.openSession();
    我采用第一种方式,原因:http://blog.csdn.net/loveyout/article/details/4193894
    使用openSession没有任何问题,程序正常运行,但是需要每次开启后自己需要关闭session,比较麻烦。
    如果使用getCurrentSession会出现如下异常:
      org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
      http://www.oschina.net/question/1777377_224862(网上出现这个异常的人很多,但是都没有很好的解决方案。这个链接作为参考,里面并没有解决问题)
    最终发现如果采用的时Hibernate4,使用getCurrentSession()必须配置事务,否则无法取到session
      解决办法:1.Spring xml配置控制事物
           2.@Transcation
      http://blog.csdn.net/bao19901210/article/details/41724355
      http://blog.csdn.net/lipei1220/article/details/47153181
      http://stackoverflow.com/questions/26203446/spring-hibernate-could-not-obtain-transaction-synchronized-session-for-current
    http://jinnianshilongnian.iteye.com/blog/1423971

      TransactionSynchronizationManager.isSynchronizationActive()
      http://blog.csdn.net/sunyujia/article/details/2788192
      http://www.ibm.com/developerworks/cn/java/j-lo-spring-ts3/
      http://www.iteye.com/topic/78674

    4.升级dailymasalanews es

      1.Caused by: java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
    Caused by: java.lang.NoSuchFieldError: FAIL_ON_SYMBOL_HASH_OVERFLOW
    Jackson版本问题,解决办法:mavenrepository.com上找到对应的合适版本

      

      2.Caused by: java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger

    Caused by: java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger
    出现这个问题,找了半天。发现是es 5.2 jar包需要log4j2支持
    https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/_log4j_2_logger.html

    17/4/8 整合MyBatis

    1. mybatis与hibernate的sessionFactory,共用同一个dataSource
    2. 事务管理共用hibernate的事务管理
    @Transactional注解
    Spring切面:
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    http://blog.csdn.net/flyjiangs/article/details/51537381

     

  • 相关阅读:
    [转]ARM QT实现多点触摸
    Accessors are only available when targeting ECMAScript 5 and higher 错误提示
    设置全局变量
    ERROR Error: Cannot find module ‘vueloaderv16/package.json‘
    JVM系列三:JVM参数设置、分析
    HDU 1407 测试你是否和LTC水平一样高
    HDU 1276 士兵队列训练问题
    python类的学习笔记1
    manjaro更新到了20版本fcitx5出问题的解决方法
    图片网站
  • 原文地址:https://www.cnblogs.com/0xcafedaddy/p/6516201.html
Copyright © 2011-2022 走看看