解决AnnotationTransactionAttributeSource is only available on Java 1.5 and highe

本文解决在使用JDK8时遇到的Spring框架兼容性问题,具体表现为AnnotationTransactionAttributeSourceisonlyavailableonJava1.5andhigher错误。通过修改Spring的JdkVersion.java文件,使其兼容JDK8,避免了项目因版本冲突而无法运行的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于项目需要把jdk升级成为了jdk8,在eclipse中导入一个jdk1.6的项目,启动tomcat的时候,报错:

AnnotationTransactionAttributeSource is only available on Java 1.5 and highe

想要解决这个错误,一般有两种办法:

1、将jdk8换成jdk7,重新启动项目就好了(由于另一个项目必须是jdk1.8,所以降版本不现实)。

2、第二种手动修改spring的jar包,在org.springframework.core目录下,有一个JdkVersion.class,自己参照包路径,重新写一个JdkVersion.java,如下所示:


    package org.springframework.core;
     
    public class JdkVersion
    {
        
        public static final int JAVA_13 = 0;
        
        public static final int JAVA_14 = 1;
        
        public static final int JAVA_15 = 2;
        
        public static final int JAVA_16 = 3;
        
        public static final int JAVA_17 = 4;
        
        //for jre 1.8
        public static final int JAVA_18 = 5;
        
        private static final String javaVersion = System.getProperty("java.version");
        
        private static final int majorJavaVersion;
        
        public static String getJavaVersion()
        {
            return javaVersion;
        }
        
        public static int getMajorJavaVersion()
        {
            return majorJavaVersion;
        }
        
        public static boolean isAtLeastJava14()
        {
            return true;
        }
        
        public static boolean isAtLeastJava15()
        {
            return getMajorJavaVersion() >= 2;
        }
        
        public static boolean isAtLeastJava16()
        {
            return getMajorJavaVersion() >= 3;
        }
        
        static
        {
            //for jre 1.8
            if (javaVersion.indexOf("1.8.") != -1)
            {
                majorJavaVersion = 5;
            }
            else if (javaVersion.indexOf("1.7.") != -1)
            {
                majorJavaVersion = 4;
            }
            else if (javaVersion.indexOf("1.6.") != -1)
            {
                majorJavaVersion = 3;
            }
            else if (javaVersion.indexOf("1.5.") != -1)
            {
                majorJavaVersion = 2;
            }
            else
            {
                majorJavaVersion = 1;
            }
        }
    }


写好之后,编译成.class文件,放到spring的jar包中,替换项目jar包,重新启动,就好了。

转载于:https://www.cnblogs.com/llfddmm/p/10521113.html

PORTA EQU 0200H ;8255的PA口地址 PORTB EQU 0202H ;A1、A2用于端口选择 PORTC EQU 0204H ;PC口,上面是PB口 PCONT EQU 0206H ;8255的控制口地址 RESET EQU 11100010B ;LCD复位命令码 DISP_ON EQU 10101111B ;LCD显示开命令码 DISP_NOR EQU 10100110B ;LCD正常显示命令码 DISP_ALL EQU 10100100B ;LCD所有点全部显示命令码 LINE0 EQU 01000000B ;行号,0开始,到63 PAGE0 EQU 10110000B ;页号,0开始,到7 COLHIGH EQU 00010000B ;列号高四位 COLLOW EQU 00000000B ;列号低四位,共16列 ADCA EQU 10100000B ;向左显示命令码 DATA SEGMENT ;定义数据段 ;西北师范大学 SC0 DB 04H,0C4H,44H,44H,44H,0FCH,44H,44H DB 44H,0FCH,44H,44H,44H,0E6H,44H,00H DB 00H,0FFH,40H,50H,48H,47H,40H,40H DB 40H,47H,48H,48H,40H,0FFH,00H,00H SC1 DB 00H,20H,20H,20H,20H,0FFH,00H,00H DB 0FFH,20H,10H,08H,0CH,00H,00H,00H DB 20H,60H,20H,10H,10H,7FH,00H,00H DB 3FH,40H,40H,40H,40H,40H,70H,00H SC2 DB 00H,0FCH,00H,00H,0FFH,00H,02H,0F2H DB 12H,12H,0FEH,12H,12H,0FBH,12H,00H DB 00H,8FH,40H,30H,0FH,00H,00H,3FH DB 00H,00H,0FFH,10H,20H,1FH,00H,00H SC3 DB 04H,44H,94H,24H,6FH,04H,0E4H,24H DB 24H,24H,2FH,0F4H,24H,06H,04H,00H DB 04H,04H,0FDH,04H,02H,00H,3FH,40H DB 40H,42H,44H,43H,40H,40H,70H,00H SC4 DB 20H,20H,20H,20H,20H,20H,0A0H,7FH DB 0A0H,20H,20H,20H,20H,30H,20H,00H DB 00H,40H,40H,20H,10H,0CH,03H,00H DB 01H,06H,08H,10H,20H,60H,20H,00H SC5 DB 40H,30H,11H,96H,90H,90H,91H,96H DB 90H,90H,98H,14H,13H,50H,30H,00H DB 04H,04H,04H,04H,04H,44H,84H,7EH DB 06H,05H,04H,04H,04H,06H,04H,00H ;计算机学院 SA0 DB 40H,40H,42H,0CCH,00H,40H,40H,40H DB 40H,0FFH,40H,40H,40H,60H,40H,00H DB 00H,00H,00H,7FH,20H,10H,08H,00H DB 00H,0FFH,00H,00H,00H,00H,00H,00H SA1 DB 08H,04H,03H,0FAH,0AEH,0AAH,0AAH,0ACH DB 0ABH,0AAH,0AEH,0FAH,02H,02H,00H,00H, DB 08H,08H,88H,4BH,3EH,0AH,0AH,0AH DB 0AH,0AH,0FEH,0BH,08H,0CH,08H,00H SA2 DB 10H,10H,0D0H,0FFH,90H,10H,00H,0FCH DB 04H,04H,04H,0FEH,04H,00H,00H,00H DB 04H,03H,00H,0FFH,80H,41H,20H,1FH DB 00H,00H,00H,3FH,40H,40H,70H,00H SA3 DB 40H,30H,11H,96H,90H,90H,91H,96H DB 90H,90H,98H,14H,13H,50H,30H,00H DB 04H,04H,04H,04H,04H,44H,84H,7EH DB 06H,05H,04H,04H,04H,06H,04H,00H SA4 DB 00H,0FEH,22H,5AH,96H,0CH,24H,24H DB 25H,26H,24H,34H,0A4H,14H,0CH,00H DB 00H,0FFH,04H,08H,87H,81H,41H,31H DB 0FH,01H,3FH,41H,41H,41H,70H,00H ;刘艳鸿 NA0 DB 08H,28H,49H,8AH,0EH,88H,78H,0CH DB 08H,00H,0FCH,00H,00H,0FFH,00H,00H DB 40H,20H,10H,09H,06H,09H,30H,60H DB 00H,00H,0FH,40H,80H,7FH,00H,00H NA1 DB 08H,48H,48H,0FFH,48H,48H,28H,0F8H DB 24H,27H,0F4H,2CH,24H,0F0H,20H,00H DB 02H,02H,02H,0FFH,02H,02H,02H,3FH DB 42H,42H,43H,42H,42H,47H,70H,00H NA2 DB 10H,21H,62H,16H,10H,0F0H,18H,10H DB 0FCH,06H,55H,84H,7EH,04H,00H,00H DB 04H,04H,0FCH,0BH,18H,0FH,04H,14H DB 13H,12H,1AH,52H,82H,7FH,02H,00H ;学号 C0 DB 00H,0E0H,10H,08H,08H,10H,0E0H,00H DB 00H,0FH,10H,20H,20H,10H,0FH,00H C1 DB 00H,10H,10H,0F8H,00H,00H,00H,00H DB 00H,20H,20H,3FH,20H,20H,00H,00H C2 DB 00H,70H,08H,08H,08H,88H,70H,00H DB 00H,30H,28H,24H,22H,21H,30H,00H C3 DB 00H,30H,08H,88H,88H,48H,30H,00H DB 00H,18H,20H,20H,20H,11H,0EH,00H C4 DB 00H,00H,0C0H,20H,10H,0F8H,00H,00H DB 00H,07H,04H,24H,24H,3FH,24H,00H C5 DB 00H,0F8H,08H,88H,88H,08H,08H,00H DB 00H,19H,21H,20H,20H,11H,0EH,00H C6 DB 00H,0E0H,10H,88H,88H,18H,00H,00H DB 00H,0FH,11H,20H,20H,11H,0EH,00H C7 DB 00H,38H,08H,08H,0C8H,38H,08H,00H DB 00H,00H,00H,3FH,00H,00H,00H,00H C8 DB 00H,70H,88H,08H,08H,88H,70H,00H DB 00H,1CH,22H,21H,21H,22H,1CH,00H C9 DB 00H,0E0H,10H,08H,08H,10H,0E0H,00H DB 00H,00H,31H,22H,22H,11H,0FH,00H TEMP DB 32 DUP(0) ;临时字模数据区 X DB 0 ;显示位置的起始行号 Y DB 0 ;显示位置的起始列号 DATA ENDS ;数据段定义结束 STACK SEGMENT STACK ;准备定义堆栈段 STP DW 100 DUP(?) ;预先定义的堆栈深度 LEN EQU $-STP STACK ENDS ;堆栈段定义结束 CODE SEGMENT 'code' ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA ;初始化数据段 MOV DS,AX CALL INIT ;LCD初始化 ;准备显示学校 MOV BL,X MOV BH,Y LEA SI,SC0 CALL DISPCHN LEA SI,SC1 ADD BH,32 CALL DISPCHN LEA SI,SC2 ADD BH,32 CALL DISPCHN LEA SI,SC3 ADD BH,32 CALL DISPCHN LEA SI,SC4 ADD BH,32 CALL DISPCHN LEA SI,SC5 ADD BH,32 CALL DISPCHN ;准备显示学院 MOV BL,0 MOV BH,1 LEA SI,SA0 CALL DISPCHN LEA SI,SA1 ADD BH,32 CALL DISPCHN LEA SI,SA2 ADD BH,32 CALL DISPCHN LEA SI,SA3 ADD BH,32 CALL DISPCHN LEA SI,SA4 ADD BH,32 CALL DISPCHN ;准备显示姓名 MOV BL,0 MOV BH,2 LEA SI,NA0 CALL DISPCHN LEA SI,NA1 ADD BH,32 CALL DISPCHN LEA SI,NA2 ADD BH,32 CALL DISPCHN ;准备显示半角数字2,SI<-2的字模区首地址 ;列号->BL,行号->BH,因半角数字与全角汉字字模存储 ; 空间数不同,故用不同的子程序来显示 ;学号 MOV BL,0 MOV BH,3 LEA SI,C2 LEA DI,C0 LEA BP,TEMP CALL FULLCHA LEA SI,C2 LEA DI,C3 ADD BH,16 CALL FULLCHA LEA SI,C3 LEA DI,C1 ADD BH,16 CALL FULLCHA LEA SI,C6 LEA DI,C0 ADD BH,16 CALL FULLCHA LEA SI,C7 LEA DI,C3 ADD BH,16 CALL FULLCHA LEA SI,C1 LEA DI,C7 ADD BH,16 CALL FULLCHA ;显示完一个汉字和一个数字,在原地循环等待 JMP $ INIT PROC NEAR ;LCD与8255初始化子程序 MOV AL,1 0000000B MOV DX,PCONT OUT DX,AL ;INIT 8255 MOV AL,00000001B ;INIT LCD MOV DX,PORTB OUT DX,AL NOP MOV AL,RESET ;RESET MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,DISP_ON ;DISP ON MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,ADCA ;ADC INC AL MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,DISP_ALL ;DISP ALL MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,DISP_NOR ;DISP NOR MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL RET INIT ENDP ;以下为汉字显示子程序 DISPCHN PROC NEAR PUSH CX PUSH DX PUSH AX PUSH DI PUSH SI MOV DI,BX MOV CL,4 SHL BL,CL MOV AL,BL AND BL, 0FH MOV CL,4 SHR AL,CL ADD AL,COLHIGH ADD BL,COLLOW MOV BH,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BH ;COL HIGH MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;COL LOW MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV BX,DI MOV BL,BH SHL BL,1 ADD BL,PAGE0 MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;ROW 1 MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV CX,16 HIGHE: MOV AL,00000011B MOV DX,PORTB OUT DX,AL DATA1: MOV AL,[SI] MOV DX,PORTA OUT DX,AL NOP NOP INC SI DATAE: MOV AL,00000010B MOV DX,PORTB OUT DX,AL NOP NOP LOOP HIGHE MOV BX,DI MOV BL,BH SHL BL,1 ADD BL,PAGE0 INC BL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;ROW 2 MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV BX,DI MOV CL,4 SHL BL,CL MOV AL,BL AND BL,0FH MOV CL,4 SHR AL,CL ADD AL,COLHIGH ADD BL,COLLOW MOV BH,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BH ;COL HIGH MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;COL LOW MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL POP SI ADD SI,16 MOV CX,16 HIGHE2: MOV AL,00000011B MOV DX,PORTB OUT DX,AL DATA2: MOV AL,[SI] MOV DX,PORTA OUT DX,AL NOP NOP INC SI DATAE2: MOV AL,00000010B MOV DX,PORTB OUT DX,AL NOP NOP LOOP HIGHE2 POP DI POP AX POP DX POP CX RET DISPCHN ENDP ;以下为显示半角字母、数字的子程序 DISPCHA PROC NEAR PUSH CX PUSH DX PUSH AX PUSH DI PUSH SI MOV DI,BX MOV CL,4 ;4 SHL BL,CL MOV AL,BL AND BL,0FH ;0F MOV CL,4 ;4 SHR AL,CL ADD AL,COLHIGH ADD BL,COLLOW MOV BH,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BH ;COL HIGH MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;COL LOW MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV BX,DI MOV BL,BH ;Y SHL BL,1 ADD BL,PAGE0 MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;ROW 1 MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV CX,8 HIGHEC: MOV AL,00000011B MOV DX,PORTB OUT DX,AL DATA1C: MOV AL,[SI] MOV DX,PORTA OUT DX,AL NOP NOP INC SI DATAEC: MOV AL,00000010B MOV DX,PORTB OUT DX,AL NOP NOP LOOP HIGHEC MOV BX,DI MOV BL,BH SHL BL,1 ADD BL,PAGE0 INC BL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;ROW 2 MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV BX,DI MOV CL,4 ;4 SHL BL,CL MOV AL,BL AND BL, 0FH ;0F MOV CL,4 ;4 SHR AL,CL ADD AL,COLHIGH ADD BL,COLLOW MOV BH,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BH ;COL HIGH MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL MOV AL,00000001B MOV DX,PORTB OUT DX,AL NOP MOV AL,BL ;COL LOW MOV DX,PORTA OUT DX,AL NOP MOV AL,00000000B MOV DX,PORTB OUT DX,AL POP SI ADD SI,8 MOV CX,8 HIGHE2C: MOV AL,00000011B MOV DX,PORTB OUT DX,AL DATA2C: MOV AL,[SI] MOV DX,PORTA OUT DX,AL NOP NOP INC SI DATAE2C: MOV AL,00000010B MOV DX,PORTB OUT DX,AL NOP NOP LOOP HIGHE2C POP DI POP AX POP DX POP CX RET DISPCHA ENDP FULLCHA PROC NEAR PUSH SI PUSH DI PUSH CX PUSH BX PUSH AX MOV CX,4 MOV BX,BP TLOP1: MOV AX,[SI] MOV [BX],AX INC SI INC SI INC BX INC BX LOOP TLOP1 MOV CX,4 TLOP2: MOV AX,[DI] MOV [BX],AX INC DI INC DI INC BX INC BX LOOP TLOP2 MOV CX,4 TLOP3: MOV AX,[SI] MOV [BX],AX INC SI INC SI INC BX INC BX LOOP TLOP3 MOV CX,4 TLOP4: MOV AX,[DI] MOV [BX],AX INC DI INC DI INC BX INC BX LOOP TLOP4 POP AX POP BX POP CX POP DI POP SI MOV SI,BP CALL DISPCHN RET FULLCHA ENDP CODE ENDS END START ;以上代码不是最优结果,大家可以尝试优化、合并处 理
最新发布
05-23
### 实现 LCD 显示学校、学院、姓名和学号的汇编代码 为了实现使用 8255 和 LCD 来显示学校、学院、姓名和学号的功能,需要考虑以下几个方面: #### 1. **硬件连接** 8255 是一种可编程并行接口芯片,通常用于微控制器与外部设备之间的数据传输。LCD 的控制可以通过 8255 的端口来完成。具体来说: - A 口可以用来发送命令或数据到 LCD。 - B 口可以用作状态读取或其他辅助功能。 - 控制寄存器配置决定了哪些端口作为输入/输出。 这种设计方式相比 PC 机更加紧凑且稳定,在恶劣环境下表现更好[^2]。 #### 2. **初始化设置** 在开始操作之前,必须对 8255 进行初始化以及对 LCD 初始化。以下是主要步骤: - 配置 8255 工作模式(一般为 Mode 0)。 - 设置 LCD 到适当的工作模式(如 4-bit 或 8-bit 模式),并通过写入特定指令完成初始化。 #### 3. **编写汇编程序** 下面是一个简单的例子,演示如何利用 8255 将字符串显示在 LCD 上: ```assembly ; 定义地址和常量 EQU PORTA 0x60 ; 假设 8255 Port A 地址 EQU CONTROL 0x63 ; 假设 8255 Control 寄存器地址 EQU DELAY_COUNT 10000 ; 主程序入口 START: MOV AL, 0x80 ; 配置 8255 工作模式 (Mode 0) OUT CONTROL, AL ; 发送到控制寄存器 CALL INIT_LCD ; 调用子程序初始化 LCD LEA SI, SCHOOL_NAME ; 加载要显示的第一个字符串地址 CALL DISPLAY_STRING ; 调用子程序显示字符串 LEA SI, COLLEGE_NAME ; 加载第二个字符串地址 CALL DISPLAY_STRING LEA SI, NAME ; 加载第三个字符串地址 CALL DISPLAY_STRING LEA SI, STUDENT_ID ; 加载第四个字符串地址 CALL DISPLAY_STRING END_PROGRAM: HLT ; 结束程序 ; 子程序:初始化 LCD INIT_LCD: PUSH AX ; 保存寄存器 MOV AL, 0x38 ; 功能设置:2 行,5x7 字符点阵 CALL SEND_COMMAND MOV AL, 0x0C ; 开启显示,关闭光标 CALL SEND_COMMAND MOV AL, 0x06 ; 自增地址指针 CALL SEND_COMMAND MOV AL, 0x01 ; 清屏 CALL SEND_COMMAND POP AX ; 恢复寄存器 RET ; 返回调用处 ; 子程序:发送命令到 LCD SEND_COMMAND: PUSH AX PUSH DX MOV DX, PORTA ; 使用 Port A 输出命令 OUT DX, AL ; 发送命令字节 CALL DELAY ; 等待一段时间让 LCD 处理 POP DX POP AX RET ; 子程序:显示字符串 DISPLAY_STRING: PUSH CX ; 保护计数器 XOR CH, CH ; CL 用作索引 CHAR_LOOP: MOV AL, [SI+CX] ; 获取当前字符 CMP AL, 0 ; 如果遇到 NULL 终止符则结束循环 JE END_DISPLAY CALL SEND_DATA ; 否则发送该字符至 LCD INC CX ; 移动到下一个字符 JMP CHAR_LOOP END_DISPLAY: POP CX ; 恢复计数器 RET ; 返回调用处 ; 子程序:发送数据到 LCD SEND_DATA: PUSH AX PUSH DX MOV DX, PORTA ; 使用 Port A 输出数据 OUT DX, AL ; 发送数据字节 CALL DELAY ; 等待一段时间让 LCD 处理 POP DX POP AX RET ; 子程序:延迟函数 DELAY: PUSH CX MOV CX, DELAY_COUNT DELAY_LOOP: LOOP DELAY_LOOP POP CX RET ; 数据区定义 SCHOOL_NAME DB 'School Name', 0 COLLEGE_NAME DB 'College Name', 0 NAME DB 'Your Name', 0 STUDENT_ID DB 'Student ID', 0 ``` 以上代码展示了基本框架,其中 `PORTA` 和 `CONTROL` 应根据实际硬件连线调整其物理地址。此外,还需要注意不同型号 LCD 的特殊需求,比如某些可能仅支持 4 位模式而非完整的 8 位模式[^1]。 #### 4. **注意事项** - 在实际开发过程中,应仔细校验每一步的操作是否成功执行完毕再继续下一步。 - 对于复杂项目而言,建议先在一个模拟环境中测试整个流程后再移植到真实硬件上运行[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值