??xml version="1.0" encoding="utf-8" standalone="yes"?>精品自拍视频,亚洲精品www,欧美日韩国产一区二区在线观看http://www.aygfsteel.com/foolpig83/category/40624.htmlzh-cnWed, 05 Aug 2009 12:24:40 GMTWed, 05 Aug 2009 12:24:40 GMT60明明白白Unsupported major.minor version 49.0的错??http://www.aygfsteel.com/foolpig83/archive/2009/08/05/289964.htmlqxqxWed, 05 Aug 2009 08:27:00 GMThttp://www.aygfsteel.com/foolpig83/archive/2009/08/05/289964.htmlhttp://www.aygfsteel.com/foolpig83/comments/289964.htmlhttp://www.aygfsteel.com/foolpig83/archive/2009/08/05/289964.html#Feedback0http://www.aygfsteel.com/foolpig83/comments/commentRss/289964.htmlhttp://www.aygfsteel.com/foolpig83/services/trackbacks/289964.html 一Q要解决的问?/font>

我们在尝?JDK1.5 的时候,怿不少人遇到过 Unsupported major.minor version 49.0 错误Q当时定?x)茫然不知所措。因为刚开始那?x)儿Q网上与此相关的中文资料q不多,现在好了Q网上一扑ְ知道是如何解冻I大多?x)告诉你要?JDK 1.4 重新~译。那么至于ؓ(f)什么,那个 major.minor I竟Z物呢Q这是本篇来讲的内容,以未错而先知?br />
我觉得我是比较幸q的Q因为在遇到那个错误之前已研读过《深?Java 虚拟机》第二版Q英文原书名为《Inside the Java Virtual Machine? Second Edition)Q看时已知晓 major.minor 藏匿于何处,但没有切w体?x),待到?Unsupported major.minor version 49.0 真正?x)面试,正好是给我验证了一个事实?br />
首先我们要对 Unsupported major.minor version 49.0 建立的直接感觉是QJDK1.5 ~译出来的类不能?JVM 1.4 下运行,必须~译?JVM 1.4 下能q行的类?当然Q也怽用的q是 JVM 1.3 ?nbsp;JVM 1.2Q那么就要编译成目标 JVM 能认可的c?。这也解决问题的方向?br />
二:(x)major.minor 栖n于何?/font>

何谓 major.minorQ且又居w于何处呢?先感性认识ƈ扑ֈ major.minor 来?br />
写一?Java Hello World! 代码Q然后用 JDK 1.5 的编译器~译成,HelloWorld.java
 1package com.unmi;
 2
 3public class HelloWorld
 4{
 5    public static void main(String[] args)
 6    {
 7        System.out.println("Hello, World!");
 8    }

 9}

10
?JDK 1.5 ?javac -d .  HelloWorld.java ~译出来的字节码 HelloWorld.class ?UltraEdit 打开来的内容如图所C:(x)

HelloWorldClassUnmi.jpg


从上图中我们看出来了什么是 major.minor version 了,它相当于一个Y件的L版本P只是在这里是标识的一?Java Class 的主版本号和ơ版本号Q同时我们看?minor_version ?0x0000Qmajor_version ?0x0031Q{换ؓ(f)十制数分别ؓ(f)0 ?49Q即 major.minor 是 49.0 了?br />
三:(x)何谓 major.minor 以及(qing)何用

Class 文g的第 5-8 字节?minor_version ?major_version。Java class 文g格式可能?x)加入新?gu)。class 文g格式一旦发生变化,版本号也?x)随之变化。对?JVM 来说Q版本号定了特定的 class 文g格式Q通常只有l定ȝ本号和一pdơ版本号后,JVM 才能够读?class 文g。如?class 文g的版本号出?JVM 所能处理的有效范围QJVM 不?x)处理?class 文g?br />
?Sun ?JDK 1.0.2 发布版中QJVM 实现支持?45.0 ?45.3 ?class 文g格式。在所?JDK 1.1 发布版中?JVM 都能够支持版本从 45.0 ?45.65535 ?class 文g格式。在 Sun ?1.2 版本?SDK 中,JVM 能够支持从版?45.0 ?6.0 ?class 文g格式?br />
1.0 ?1.2 版本的编译器能够产生版本号ؓ(f) 45.3 ?class 文g。在 Sun ?1.2 版本 SDK 中,Javac ~译器默认生版本号?45.3  ?class 文g。但如果?javac 命o(h)行中指定?-target 1.2 标志Q?.2 版本的编译器生版本号?46.0 ?class 文g?.0 ?1.1 版本?JVM 上不能运行?target 1.2 标志所产生?class 文g?br />
JVM 实现?W二版中修改了对 class 文gȝ本号和次版本L(fng)解释。对于第二版而言Qclass 文g的主版本号与 Java q_d布版的版本号保持一?例如Q在 Java 2 q_发布版上Q主版本号从 45 升至 46)Q次版本号与特定d^台发布版的各个发布版相关。因此,管不同?class 文g格式可以׃同的版本可C,但版本号不一样ƈ不代?class 文g格式不同。版本号不同的原因可能只是因?class 文g׃同发布版本的 java q_产生Q可?class 文g的格式ƈ没有改变?br />
上面三段节选自《深?Java 虚拟机》,啰嗦一堆,JDK 1.2 开启了 Java 2 的时代,但那个年代仍然离我们很远Q我们当中很多少直接跛_ JDK 1.4 上的Q我也差不多Q只是项目要求不得不在一D|间里委屈?JDK 1.3 上。不q大致我们可以得到的信息是每个版本?JDK ~译器编译出?class 文g中都带有一个版本号Q不同的 JVM 能接受一个范?class 版本P出范围则要出错。不q一般都是能向后兼容的,知道 Sun 在做 Solaris 的一句口号吗Q保持对先前版本?100% 二进制兼Ҏ(gu),q也是对客户的投资保护?br />
四:(x)其他定 class ?major.minor version 办法

1QEclipse 中查?br />       Eclipse 3.3 加入的新特征Q当某个cL有关联到源代码,打开它会(x)昄比较详细的类信息Q当然还未到源码U别了,看下图是打开 2.0 spring.jar ?ClasspathXmlApplicationContext.class 昄的信?br />
eclipseclass1.jpg

2Q命?javap -verbose
       对于~译出的 class 文g?javap -verbose 能显C出cȝ major.minor 版本Q见下图Q?br />
JavapVerboseUnmi.jpg

3)  MANIFEST 文g
      ?nbsp;class 打成?nbsp;JAR 包中都会(x)有文?META-INF\MANIFESTQ这个文件一般会(x)有编译器的信息,下面列几个包?META-INF\MANIFEST 文g内容大家看看
      ·Velocity-1.5.jar ?META-INFO\MANIFEST 部䆾内容
                  Manifest-Version: 1.0
                  Ant-Version: Apache Ant 1.7.0
                  Created-By: Apache Ant
                  Package: org.apache.velocity
                  Build-Jdk: 1.4.2_08
                  Extension-Name: velocity
            我们看到是用 ant 打包Q构建用的JDK?1.4.2_08Q用 1.4 ~译的类?1.4 JVM 中当然能q行。如果那人用 1.5 ?JDK 来编译,然后?JDK 1.4+ANT 来打包就太无聊了?br />       ·2.0 spring.jar ?META-INFO\MANIFEST 部䆾内容
                  Manifest-Version: 1.0
                  Ant-Version: Apache Ant 1.6.5
                  Created-By: 1.5.0_08-b03 (Sun Microsystems Inc.)
                  Implementation-Title: Spring Framework
           q下要注意啦Q它是用?JDK 1.5 来编译的Q那么它是否带了 -target 1.4 ?-target 1.3 来编译的呢?实是的Q可以查看类的二q制文gQ这是最保险的。所?spring-2.0.jar 也可以在 1.4 JVM 中加载执行?br />       ·自已一个项目中?ant 打的 jar 包的 META-INFO\MANIFEST
                  Manifest-Version: 1.0
                  Ant-Version: Apache Ant 1.7.0
                  Created-By: 1.4.2-b28 (Sun Microsystems Inc.)
            用的?JDK 1.4 构徏打包的?br />
W一W二U办法能明确知道 major.minor versionQ而第三种Ҏ(gu)应该也没问题Q但是碰到变态构建就难说了,比如谁把那个 META-INFO\MANIFEST 打包后换了也未可知。直接查看类的二q制文g的方法可以万分保证,准确无误Q就是工L(fng)Ҏ(gu)也认了?br />
五:(x)~译器比较及(qing)症节之所?/font>

现在不妨?JDK 1.1 ?JDK 1.7 ~译器编译出?class 的默?minor.major version 吧。(又走?Sun 的网站上腾出我从来都没用过的古董来Q?br />
JDK ~译器版?/strong> target 参数 十六q制 minor.major 十进?minor.major
jdk1.1.8 不能?target 参数 00 03   00 2D 45.3
jdk1.2.2 不带(默认?-target 1.1) 00 03   00 2D 45.3
jdk1.2.2 -target 1.2 00 00   00 2E 46.0
jdk1.3.1_19 不带(默认?-target 1.1) 00 03   00 2D 45.3
jdk1.3.1_19 -target 1.3 00 00   00 2F 47.0
j2sdk1.4.2_10 不带(默认?-target 1.2) 00 00   00 2E 46.0
j2sdk1.4.2_10 -target 1.4 00 00   00 30 48.0
jdk1.5.0_11 不带(默认?-target 1.5) 00 00   00 31 49.0
jdk1.5.0_11 -target 1.4 -source 1.4 00 00   00 30 48.0
jdk1.6.0_01 不带(默认?-target 1.6) 00 00   00 32 50.0
jdk1.6.0_01 -target 1.5 00 00   00 31 49.0
jdk1.6.0_01 -target 1.4 -source 1.4 00 00   00 30 48.0
jdk1.7.0 不带(默认?-target 1.6) 00 00   00 32 50.0
jdk1.7.0 -target 1.7 00 00   00 33 51.0
jdk1.7.0 -target 1.4 -source 1.4 00 00   00 30 48.0
Apache Harmony 5.0M3 不带(默认?-target 1.2) 00 00   00 2E 46.0
Apache Harmony 5.0M3 -target 1.4 00 00   00 30 48.0

上面比较?Windows q_下的 JDK ~译器的情况Q我们可以此作些ȝQ?br />
1) -target 1.1 ?有次版本Ptarget ?1.2 ?qing)以后都只用ȝ本号了,ơ版本号?0
2) ?1.1 ?1.4 语言差异比较?yu),所?1.2 ?1.4 默认?target 都不是自w相对应版本
3) 1.5 语法变动很大Q所以直接默?target 是 1.5。也因ؓ(f)如此?1.5 ?JDK 要生成目标ؓ(f) 1.4 的代码,光有 -target 1.4 不够Q必d时带?-source 1.4Q指定源码的兼容性,1.6/1.7 JDk 生成目标?1.4 的代码也如此?br /> 4) 1.6 ~译器显得较为激q,默认参数׃ؓ(f) -target 1.6。因?nbsp;1.6 ?1.5 的语法无差异Q所以用 -target 1.5 时无需跟着 -source 1.5?br /> 5) 注意 1.7 ~译的默?target ?1.6
6) 其他W三方的 JDK 生成?Class 文g格式版本号同对应 Sun 版本 JDK
7) 最后一Ҏ(gu)重要的,某个版本?JVM 能接?class 文g的最大主版本号不能超q对?JDK 带相?target 参数~译出来?class 文g的版本号?br />
上面那句话有炚wQ一口气读过M是很好理解,举个例子Q?.4 ?JVM 能接受最大的 class 文g的主版本号不能超q用 1.4 JDK 带参?-target 1.4 时编译出?class 文g的主版本P也就?48?br />
因ؓ(f) 1.5 JDK ~译旉?target ?1.5Q出来的字节?major.minor version ?49.0Q所?1.4 ?JVM 是无法接受的Q只有抛出错误?br />
那么?font color="#800080">Z么从 1.1 ?1.2、从 1.2 ?1.3 或者从 1.3 ?1.4 ?JDK 升不会(x)发生 Unsupported major.minor version 的错误呢Q那是因?1.2/1.3/1.4 都保持了很好的二q制兼容?/font>Q看?1.2/1.3/1.4 的默?target 分别?1.1/1.1/1.2 q道了Q也是默认情况?.4 JDK ~译出的 class 文g?JVM 1.2 下都能加载执行,何况?JVM 1.3 呢?Q当然要去除使用了新版本扩充?API 的因素)(j)

六:(x)扑ֈ问题解决的方?/font>

那么现在如果到q种问题该知道如何解决了吧,q会(x)像我所见到有些兄弟那样Q去找个 1.4 ?JDK 下蝲安装Q然后用光新编译所有的代码吗?其实大可不必如此费神Q我们一定还记得 javac q有?-target 参数Q对啦,可以l箋使用 1.5 JDKQ编译时带上参数 -target 1.4 -source 1.4 ?OK 啦,不过你一定要对哪?API ?1.5 JDK 加入q来的了如指掌,不能你的 class 文g拿到 JVM 1.4 下就?method not found。目?JVM ?1.3 的话Q编译选项q -target 1.3 -source 1.3 了?br />
相应的如果?ant Q它?javac d也可对应的选择 target ?source

<javac target="1.4" source="1.4" ............................/>

如果是在开发中Q可以肯定的是现在真正算得上?JAVA IDE 对于工程也都有编译选项讄目标代码的。例?Eclipse 的项目属性中?Java Compiler 讄Q如?br />
EclipseCompiler.JPG


自已讑֮~译选项Q你?x)看到选择不同?compiler compliance level 是,Generated class files compatibility ?Source compatibility 也在变,你也可以手动调整那两,手动讄后你׃用很在乎用的什么版本的~译器了Q只要求他生成我们希望的字节码就行了Q再引申一下就是即使源代码是用 VB 写的Q只要能~译?JVM 能执行的字节码都不打紧。在其他?IDE 也能扑ֈ相应的设|对话框的?br />
其他时候,你一定要知道当前?JVM 是什么版本,能接受的字节码主版本h多少Q可对照前面那个表)(j)。获息当?JVM 版本有两U途径Q?br />
W一Q如果你是直接用 java 命o(h)在控制台执行E序Q可以用 java -version 查看当前?JVM 版本Q然后确定能接受?class 文g版本

W二Q如果是在容器中执行Q而不能明知道会(x)使用哪个 JVMQ那么可以在容器中执行的E序中加入代码 System.getProperty("java.runtime.version"); ?System.getProperty("java.class.version")Q获?JVM 版本和能接受?class 的版本号?br />
最后一l招Q如果你不想针对低版本的 JVM ?target 参数重新~译所有代码;如果你仍然想l箋在代码中用新?API 的话Q更有甚者,你还用了 JDK 1.5 的新Ҏ(gu),譬如泛型、自动拆装箱、枚丄的话Q那你用 -target 1.4 -source 1.4 没法编译通过Q不得不重新整理代码。那么告诉你最后一招,不需要再从源代码着手,直接转换你所正常~译出的字节码,l箋享用那些新的Ҏ(gu),新的 APIQ那是Q请参考之前的一日志:(x)Retrotranslator让你用JDK1.5的特性写出的代码能在JVM1.4中运?/a>Q我是q么用的Q做好测试就不会(x)有问题的?br />
七:(x)再议一个实际发生的相关问题

q是一个因为拷?Tomcat 而生的 Unsupported major.minor version 49.0 错误。情景是Q我本地安装的是 JDK 1.5Q然后在|上找了一?EXE ?Tomcat 安装文g安装了ƈ且可用。后来同事要一?TomcatQ不想下载或安装Q于是根据我以往的经验是把我?Tomcat 整个目录L(fng)他应该就行了Q结果是拿到他那里浏?jsp 文g都出?Unsupported major.minor version 49.0 错误Q可以确定的是他安装的是 1.4 ?JDKQ但我还是有些纳P先前对这个问题还颇有信心的我?c)了。惯性思维是编译好?class 文g拿到低版本的 JVM ?x)出现如是异常,可现q没有用?JDK 1.5 ~译好的c要执行啊?br />
后来仔细看异怿息,l于发现?%TOMCAT_HOME%\common\lib\tools.jar q一眉目Q因?jsp 文g需要依赖它来编译,打来q个 tools.jar 中的一?class 文g来看看,49.0Q很快我明白原来这个文件是在我的机器上安装 Tomcat 时由 Tomcat 安装E序?%JDK1.5%\lib 目录拷到 Tomcat ?lib 目录ȝQ造成在同事机器上~译 JSP 时是 1.4 ?nbsp;JVM 配搭着 49.0 ?tools.jarQ那能不出错Q于是找?1.4  JDK ?tools.jar 替换?Tomcat 的就 OK 啦?br />
八:(x)结

其实理解 major.minor 像是我们可以这么想像,同样是微软g的程序,32 位的应用E序不能拿到 16 位系l中执行那样?br />
如果我们发布前了解到目标 JVM 版本Q知道怎么?java class 文g中看?major.minor 版本来,׃用等到服务器报出异常才着手去解决Q也p预知到可能发生的问题?br />
其他时候遇到这个问题应具体解决QM问题的根由是低版本的  JVM 无法加蝲高版本的 class 文g造成的,扑ֈ高版本的 class 文g处理一下就行了?br />


qx 2009-08-05 16:27 发表评论
]]>
关于S2SH+mysql中文q问题http://www.aygfsteel.com/foolpig83/archive/2009/07/23/288067.htmlqxqxThu, 23 Jul 2009 09:40:00 GMThttp://www.aygfsteel.com/foolpig83/archive/2009/07/23/288067.htmlhttp://www.aygfsteel.com/foolpig83/comments/288067.htmlhttp://www.aygfsteel.com/foolpig83/archive/2009/07/23/288067.html#Feedback0http://www.aygfsteel.com/foolpig83/comments/commentRss/288067.htmlhttp://www.aygfsteel.com/foolpig83/services/trackbacks/288067.html       关于JSP面?qing)action只需d一个EncodingFilter可以了Q代码如下:(x)
 1package cn.zhang.myznt.filter;
 2
 3import java.io.IOException;
 4
 5import javax.servlet.Filter;
 6import javax.servlet.FilterChain;
 7import javax.servlet.FilterConfig;
 8import javax.servlet.ServletException;
 9import javax.servlet.ServletRequest;
10import javax.servlet.ServletResponse;
11
12public class EncodingFilter implements Filter {
13    private String charset = null;
14    public void destroy() {
15
16    }

17
18    public void doFilter(ServletRequest request, ServletResponse response,
19            FilterChain chain) throws IOException, ServletException {
20        request.setCharacterEncoding(this.charset);
21        chain.doFilter(request, response);
22
23    }

24
25    public void init(FilterConfig arg0) throws ServletException {
26        this.charset = arg0.getInitParameter("charset");
27    }

28
29}

30

在web.xml中注册这个FilterQ注意他的位|必L在需要调用action?qing)jsp或其他页面声明之?br />
 1<filter>
 2        <filter-name>encoding</filter-name>
 3        <filter-class>cn.zhang.myznt.filter.EncodingFilter</filter-class>
 4        <init-param>
 5            <param-name>charset</param-name>
 6            <param-value>UTF-8</param-value>
 7        </init-param>
 8    </filter>
 9    <filter-mapping>
10        <filter-name>encoding</filter-name>
11        <url-pattern>/*</url-pattern>
12    </filter-mapping>

同时在连接mysql数据库的时候也要改为jdbc:mysql://localhost:3306/mldn?useUnicode=true&amp;characterEncoding=utf-8 如果q接在java代码中用,请?amp;Q如果是在xml中用请写成&amp;?br />
    关于mysql的collation字符集和mysql的characterSet字符集问题,查了很多资料都说要设|成一P我想那只是针对如果你选GBK作ؓ(f)数据库编码的时候所用,但如果选用UTF8作ؓ(f)数据库编码的时候就不一定正了?br />     今天Ҏ(gu)|上的资料将所有的characterSet讄成utf8Q可用mysql> SHOW VARIABLES LIKE 'character_set_%';查看Q,一直在试q问题解决没有。在试q程发现传递的中文都是正确的,可就是在MySQL Client中查看的是ؕ码,所以l找Ҏ(gu)解决Q但其实q个时候你插进ȝ中文已经是正常的了,只是在MySQL Client中显C是q。那么ؓ(f)什么会(x)q样QMySQL Client讄成UTF8的时候中文不能正常显C,此时我们应该charact_set_client Q设|成gbkQ这样就可以正常昄中文了?br />     可以在my.ini?

[mysql]

default-character-set=gbk


而下面的default-character-set=utf8Q两个default-character-set的设|是不一L(fng)。当然如果你选用gbk作ؓ(f)数据库编码,是需要设|成一L(fng)?

qx 2009-07-23 17:40 发表评论
]]>
վ֩ģ壺 | | Ƽ| | | â| | | | ֣| ƽ| ͨ| ƽԶ| Ȫ| ֶ| «Ϫ| ˳| | | | | | Ϸ| º| Ϫ| ̩| | | Ƥ| ˮ| Ͷ| | | | | | ߴ| | | DZ| ػʵ|