當前位置:首頁 » 操作系統 » tomcat7源碼

tomcat7源碼

發布時間: 2022-10-04 23:43:46

❶ Tomcat 7 只支持到JDK 1.6嗎

Tomcat 7可以支持到jdk1.7的。
1、 查看系統版本
# uname –a //是64位系統,那麼我們選擇64位的JDK
linux 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux

2、 下載tomcat7和jdk1.7
Tarbag專門放源碼包,software專門放解壓後的軟體包
# mkdir /usr/local/src/tarbag
# mkdir /usr/local/src/software

# cd /usr/local/src/tarbag
# wget http://mirror.bjtu.e.cn/apache/tomcat/tomcat-7/v7.0.22/bin/apache-tomcat-7.0.22.tar.gz
# wgethttp://download.oracle.com/auth/otn-pub/java/jdk/7u1-b08/jdk-7u1-linux-x64.tar.gz

3、 安裝jdk(配置java環境)
# tar -xzvf jdk-7u1-linux-x64.tar.gz
# mv jdk1.7.0_01/ /usr/local/java

配置java環境
# vi /etc/profile
加上以下信息
export JAVA_HOME=/usr/local/java
CLASSPATH=/usr/local/java/lib/dt.jar:/usr/local/java/lib/tools.jar
PATH=/usr/local/java/bin:$PATH
export PATH JAVA_HOME CLASSPATH

查看是否成功
# source /etc/profile
# java -version //看到1.7的字樣說明安裝成功了
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)

4、 安裝tomcat 7
# tar –xzvf apache-tomcat-7.0.22.tar.gz
# mv apache-tomcat-7.0.22 /usr/local/tomcat7

5、 啟動關閉tomcat7
啟動
# /usr/local/tomcat7/bin/startup.sh

關閉
# /usr/local/tomcat7/bin/shutdown.sh

6、 開啟tomcat測試

❷ Tomcat安裝完畢後打不開主頁怎麼回事

如果tomcat啟動無報錯,考慮是否有首頁面或者配置了訪問跳轉
另tomcat啟動失敗:是否埠佔用、源碼包載入錯誤
參考地址:
http://jingyan..com/article/7e440953dc096e2fc0e2ef1a.html

❸ Axure 安裝後打不開 一開就出現這種 不管怎麼重裝 都這樣

首先要檢查:
.Net Framework 4.0環境是否安裝好,您可以在「控制面板》添加刪除軟體」中把它刪除,然後再重。(微軟官網上有,搜索一下)
2
如果您確定環境沒問題:
可以嘗試安裝最新版Axure(這不是廢話嘛)
3
如果您確認上面兩步都沒問題,那麼請嘗試:
刪除下面目錄下的的文件(請在此之前確保您的項目已保存好了):
C:\Users\[用戶名]\AppData\Local\Temp\Axure-6(或Axure 7.0)
刪除該目錄下的配置文檔:
C:\Users\[用戶名]\AppData\Local\Axure
這兩個路徑是隱藏的,先設置隱藏文件可見。
刪除後就可以重啟Axure了。
最後如果是
萬能的網路。【桌面】→【右鍵】→【NVIDIA控制面板】→【管理3D設置】→【程序設置】→【添加】,選擇安裝目錄下的AxureRP8.exe,為此程序選擇首選圖形處理器高性能NVIDIA處理器,看完這個解決方案,覺得這就是小編要找的解決方案。
之前由於PC的屏幕亮度調節不了,然後找到一個解決方案說是要卸載和NVIDIA相關的程序,去官網下載相關的驅動,結果屏幕亮度是可以調了,不曾想會埋下此禍。最後,又重新去PC官網下載NVIDIA驅動進行安裝,第一次安裝選擇的是「精簡」安裝,結果安裝失敗了。如圖:

最後,重新安裝的時候選擇了」自定義安裝選項「,只安裝了NVIDIAGeForce Experience,結果安裝成功。重啟之後,axure閃退的問題解決!
版權聲明:本文為博主原創文章,轉載請註明出處。
目前您尚未登錄,請 登錄 或 注冊 後進行評論
ccnanxi
ccnanxi2017-10-16 11:311樓1條回復 回復
安裝環境有問題,無論什麼版本都是打開閃退,博主的解決方案沒看明白,我也要安裝一個NVDID圖形驅動程序嗎
axure8.0使用教程 xiaopingping___xiaopingping___2016年07月26日 15:38644
http://www.axure.com.cn/3608/
win8.1打開axure8.0閃退的問題 u010927640u0109276402017年04月19日 21:132828
由於需求有大的變動,需要重新定義系統,為了能更快地表達出用戶想要的效果,用了axure畫了原型。但在安裝完成後打開總是出現閃退的問題,對解決過程做個記錄。 一、逐步排查問題: ...
造成程序閃退的bug u012701023u0127010232015年10月19日 19:10356
例子很簡單 大家可以自己分析一下 #import "ViewController.h" @interface ViewController () @property (nonatomic, wea...
autoCAD2010在win8.1上面的閃退問題 lily0806lily08062015年05月12日 10:27825
成功安裝後,竟然閃退了。網路之,有效方法:C:\ProgramData\FLEXnet\adskflex_*_tsf.data ,將adskflex_*_tsf.data 更名為adskflex_*_...
anaconda navigator閃退問題解決 fessigyfessigy2017年11月29日 15:04776
環境:win7 32位 anaconda安裝版本:Anaconda3-4.2.0-Windows-x86.exe 問題現象: anaconda安裝完畢後,雙擊anaconda navigator打開,...
Axure在Win10系統中安裝亂碼 meronemerone2017年04月14日 10:461174
記錄Auxre在Win10系統中安裝出現亂碼的解決辦法。
AXURE RP EXTENSION For Chrome
2017年10月14日 14:2525KB下載
Win8.1 IE11 瀏覽器無法打開任何網頁的解決辦法 年09月29日 13:271103
最近發現自己的Win8.1 IE11瀏覽器無法打開任何網頁,遂網路了大約10分鍾,開始的幾個方法都無效,最終找到一個簡單的辦法,一招制敵! 按下 Win 鍵進入開始屏幕,直接鍵盤按下 cmd 三個字元...
解決Android7.0以上,手機拍照閃退的問題 fanyuyoungfanyuyoung2017年08月08日 14:35221
protected void takePhoto() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.W...
tomcat7啟動startup閃退的解決方案 年09月15日 13:283773
一、配置 JDK 要想在自己的計算機上安裝Tomcat,需要JDK的支持,因為Tomcat是用java語言編寫的一個很輕量級的Web伺服器。 1、首先將自己下載的jdk(這里使用的是1.7)下載...
Axure 7.0 mac Yosemite 不能打開的問題 qqMCYqqMCY2015年01月03日 16:042928
使用下面這個新版就OK了, 下載地址:http://cdn1.axure.com/AxureRP-Pro-Setup-RC.dmg 注冊碼 我也是在網上找的。 Axure7用戶名: aa...
QT版本不對導致軟體閃退 PengPengBlogPengPengBlog2017年09月13日 15:55385
QT版本的的鏈接問題,點擊平台時候,閃退,然後查源碼,源碼找到的問題是析構的問題,但是析構並沒有什麼問題,這個問題只有在我的電腦上出現過, 然後也沒有發現內存泄露,越界等問題,懷疑是QT版本問題,隨...
微信分享閃退問題分析及解決 fxjzzyofxjzzyo2016年05月14日 21:112777
今天看了慕課網的微信朋友圈分享課程,自己動手做時卻發現點擊按鈕總出現閃退,分享結果也返回true了,可就是閃退。看了評論發現好多同學都在問這個問題。大致的原因都在說簽名不一致的問題。多方網路,我最後終...
axure一啟動滑鼠就失靈怎麼辦 p1i2n3g4p1i2n3g42017年04月07日 13:43464
原文: http://jingyan..com/album/ea24bc39a55fd3da62b331d0.html?picindex=4 刪除文件目錄下 C:\Windows...
解決360/chrome瀏覽器打開Axure生成的html文件需要安裝axure擴展的問題
用360/chrome瀏覽器打開Axure生成的html文件,會提示需要安裝一個相應的Axure擴展才能正常使用。其實不用安裝擴展,直接編輯index.html文件也行。用UE或者editplus(或...
年08月26日 13:45256
如何解決tomcat啟動閃退問題 年12月28日 17:0613705
在這幾天,遇到一個Tomcat啟動閃退的問題,通過查閱各種資料,算是完美解決。在此分享給朋友們。 首先,確定你的問題在哪裡 1.查詢錯誤:win+R 輸入c...
解決Eclipse打開後閃退 Eclipse在異常關閉後,啟動閃退的解決辦法
問題描述:Win7下 Eclipse編譯原本沒問題的工程時,第二天開始編譯總是通不過,後來Debug As - Android Application 調試時出現卡死現象。任務管理器強制關閉,後重啟E...
BuaaroidBuaaroid2015年11月18日 12:3511286
如何使用axure打開視頻? PEXUEPEXUE2015年09月16日 16:43536
一、選擇內部框架拖入 二、內部框架可以調節大小和滾動條 三、雙擊打開內部框架設置內部屬性 四、你可以到陪學網看下教程,最後可以填入視頻網址鏈接URL或者本地文件路徑 想要學習Axu...
Axure Mac中文破解版
2017年07月09日 15:061.01MB下載
打不開Eclipse,Eclipse閃退(已解決) zml_2015zml_20152015年08月23日 18:3014172
Failed to write core mp. Minimps are not enabled by default on client versions of Windows in Ecl...

❹ web app root system property already set to different value怎麼解決

您好,很高興為您解答。

Tomcat發布多個項目時拋的webAppRootKey錯誤,部署到WAS控制台單獨一個項目可以運行,兩個項目同時運行先啟動的可以運行,後啟動的項目不會讀本項目的web.xml信息。
異常信息
Web app root system property already set to different value: 'webapp.root'

修改web.xml文件
部署在同一容器中的Web項目,要配置不同的<param-value>,不能重復

異常信息
Web app root system property already set to different value: 'webapp.root'
部署在同一容器中的Web項目,要配置不同的<param-value>,不能重復.
所以如果項目名稱如果為test,那麼<param-value>可以改為test.root,避免與webapp.root重復。

http://localhost:8080/test
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>test.root</param-value>
</context-param>

註:test.root,test為訪問項目的名稱

這樣重新部署後的項目就可以運行了。

如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】

希望我的回答對您有所幫助,望採納!

~ O(∩_∩)O~

❺ 怎麼 閱讀github上tomcat7源碼

到github.com找到自己感興趣的項目,比如Jquery,復制項目的Clone URL

2
在本地打開Git Bash命令行窗口

3
把復制好的Clone URL粘貼到命令行窗口並回車,執行完Clone命令代碼即下載到本地
Git Clone [URL]

END
方法2 - 下載源代碼Zip包
1
找到自己感興趣的項目,在項目頁面點擊"Download Zip"按鈕,源代碼即可下載到本地

END
方法3 - 直接在線瀏覽代碼並復制想要的代碼段
項目的源代碼可以直接在代碼瀏覽窗口查看,感興趣的話可以直接復制或者下載

❻ 在Apache Tomcat 官網上如何找到下載Tomcat8的源碼的地方

8.0.27

Please see the
README
file for packaging information. It explains what every distribution contains.

Binary Distributions

Core:

zip
(pgp,
md5,
sha1)

tar.gz
(pgp,
md5,
sha1)

32-bit Windows zip
(pgp,
md5,
sha1)

64-bit Windows zip
(pgp,
md5,
sha1)

64-bit Itanium Windows zip
(pgp,
md5,
sha1)

32-bit/64-bit Windows Service Installer
(pgp,
md5,
sha1)

Full documentation:

tar.gz
(pgp,
md5,
sha1)

Deployer:

zip
(pgp,
md5,
sha1)

tar.gz
(pgp,
md5,
sha1)

Extras:

JMX Remote jar
(pgp,
md5,
sha1)

Web services jar
(pgp,
md5,
sha1)

JULI adapters jar
(pgp,
md5,
sha1)

JULI log4j jar
(pgp,
md5,
sha1)

Embedded:

tar.gz
(pgp,
md5,
sha1)

zip
(pgp,
md5,
sha1)

Source Code Distributions

tar.gz
(pgp,
md5,
sha1)

zip
(pgp,
md5,
sha1)

❼ eclipse提示「error:A JNI error has occureed」怎麼辦

打開myeclipse,Preferentces->MyEclipse->Servers->Tomcat->Tomcat 6.x
,載入Tomcat7,在"Paths"下,點擊「AddJAR/ZIP」,載入tomcat7下的……/bin/tomcat-juli.jar。點擊「OK」

❽ 創作工具包括哪些

1、 VisualAgeJava。

它與其它JAVA開發工具相比有很多獨特的地方,VAJ用自己的二進制格式文件(資源庫)作為基本的存儲模型。內置的版本控制、增量編譯和高效的debug工具。

2、 VC。

如果說到Windows下的可視化開發工具現在大家接觸得最多的就是VC,VB,DELPHI,BCB。其實我覺得VC並不能完全算是一個可視化工具,這表現在VC中編寫代碼還是佔了開發工作的大部分時間。而其他的可視化工具中都在界面設計中耗費了大量的開發時間。我一直使用VC的原因就是因為我能夠一直將注意力集中在軟體功能開發上而不是界面設計上。我認為這樣能夠在開發的過程中更加自由和有更多的控制權。而且這種情況下產生的代碼維護性更強。

3、 delphi。

資料庫支持是delphi的強項。這主要體現在delphi與bde的無縫集成,以及delphi提供的那一大堆現成的資料庫操作控制項。這是vc望塵莫及的。目前delphi支持bde、ado、interbase三種資料庫訪問方式。所有的方式都能拖拉到應用程序中實現可視化操作。正是因為delphi對資料庫類的包裝,使得用戶操作資料庫不像在visual c++中必須從開始到最後都要干預。明顯地提高了開發速度。在delphi中使用webbroker控制項還能很方便地構造出基於資料庫的web頁面,通過html管理web資料庫。

4、 perl。

我喜歡perl的理由是與我從事的工作有關,我想使用SNMP網管工具查出每天的帶寬使用情況。當然可以寫一個C程序直接同路由器交談取得所需信息。但我並不喜歡C的malloc()和free(),它讓我著實不安。好在perl有一個SNMP介面——一個大約20行代碼的perl腳本可以同路由器對話,並且能將精力放在功能實現上,而不是編程的細節上。

5、 python

大家可能對這個名詞比較陌生,它是一種面向像的腳本語言。它具有動態類型,支持多繼承,用戶定義類型,高級動態類型和類。為什麼我這么喜歡python?有幾個原因。首選,它的語法清晰而簡單,我的python程序比其它的語言更易讀懂。其次,我發現自己更傾向於面向對像方式編程,而向對像的編程比舊的傳統方式似乎更貼切一些,再加上python是從頭至腳面向對像的,長的程序易於開發和維護。

6、 Tomcat。

之所以要選擇它,主要是因為原因是因為它是免費的,不像MS的軟體動則幾千RMB,像我們這樣的學習者哪裡承受得了! 免費並不代表質量低下,據測試表明,Tomcat在JSP伺服器方面的穩定性優於websphere。它的開發非常方便,集成了很多優秀的性能,它的源碼公開,你可以仔細地研究它運行機制。

7、 ASP。

簡單易學。Basic有誰不會?很少會有人舉手,所以有人在說這個開發基礎是最廣的。而且MS有一向做的非常好的聯機手冊,本地化語言的幫助,同時非常快的出現教學書籍,這樣會大大方便開發人員的學習和對技術的深入研究。安裝使用方便。裝好一個Windows 2000,只要你安裝了IIS哪么ASP就可以使用了,從沒有什麼需要你花心思去配置的。

8、 php

PHP是一個什麼原因出現的呢?它是一個技術人員希望能用一個快速的方面來完成他自己的個人主頁中的一個小應用。而在他一發不可收時出現了php,它使一個人能在多種操作系統下迅速的完成一個輕型的Web應用。所以在短短的幾年裡,php迅速的升級了它的版本,同時在GNU的世界裡找到了一個青梅竹馬的夥伴----Apache。個人認為php是自由軟體在web應用平台上一個決勝的工具,如果沒有php的出現,還會有許多人認為自由軟體就代表了對開發人員的高技術要求、難記的代碼、復雜的工具.....php使一個會使用basic的人員在極短的時間里快迅學習並完成用戶需要的應用。

9、 PB。

現在究竟是什麼阻礙了Web應用和3-tier的大批出現呢?仍然是工具。一般說來,完成這些任務需要使用多種工具,在開發時需要在多個工具之間切換,由此造成了開發效率的低下和開發難度的提高。而PB8/PJ4很好地解決了這些問題。所有這些任務,都可以在同一個開發環境中完成,開發人員能非常快速地編寫基於資料庫的業務邏輯Component以及調用這些Component的Web-Client或PB-Client。尤其是Sybase把2-tier中的王牌Datawindow擴展到了HTML領域,使得資料庫驅動的動態頁面實現起來非常容易。

10、.NET。

.NET框架和C#擴展了Windows的功能,C#和Visual Studio .NET的結合使得創建和配置Web服務幾乎可以自動進行。並且,和傳統的ASP應用程序相比,ASP.NET應用程在性能、穩定性以及可擴展性方面都有了實質性的提高

❾ tomcat 7二進制和源碼的區別

Tomcat作為JavaWeb領域的Web容器,目前在我們淘寶也使用的也非常廣泛,現在基本上所有線上業務系統都是部署在Tomcat上。為了對平時開發的Web系統有更深入的理解以及出於好奇心對我們寫的Web系統是如何跑在Tomcat上的,於是仔細研究了下Tomcat的源碼。大家都知道Servlet規范是Java領域中為服務端編程制定的規范,對於我們開發者只是關注了Servlet規范中提供的編程組件(ServletContextListener,Filer,Servlet) 等 ,但是規范中還有一些我們經常

❿ 如何解決Unsupported major.minor version 52.0問題

一:要解決的問題

我們在嘗鮮 JDK1.5 的時候,相信不少人遇到過 Unsupported major.minor version 49.0 錯誤,當時定會茫然不知所措。因為剛開始那會兒,網上與此相關的中文資料還不多,現在好了,網上一找就知道是如何解決,大多會告訴你要使用 JDK 1.4 重新編譯。那麼至於為什麼,那個 major.minor 究竟為何物呢?這就是本篇來講的內容,以使未錯而先知。

我覺得我是比較幸運的,因為在遇到那個錯誤之前已研讀過《深入 Java 虛擬機》第二版,英文原書名為《Inside the Java Virtual Machine》( Second Edition),看時已知曉 major.minor 藏匿於何處,但沒有切身體會,待到與 Unsupported major.minor version 49.0 真正會面試,正好是給我驗證了一個事實。

首先我們要對 Unsupported major.minor version 49.0 建立的直接感覺是:JDK1.5 編譯出來的類不能在 JVM 1.4 下運行,必須編譯成 JVM 1.4 下能運行的類。(當然,也許你用的還是 JVM 1.3 或 JVM 1.2,那麼就要編譯成目標 JVM 能認可的類)。這也解決問題的方向。

二:major.minor 棲身於何處

何謂 major.minor,且又居身於何處呢?先感性認識並找到 major.minor 來。

寫一個 Java Hello World! 代碼,然後用 JDK 1.5 的編譯器編譯成,HelloWorld.java

package com.unmi;

public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello, World!");
}
}
package com.unmi;public class HelloWorld{ public static void main(String[] args) { System.out.println("Hello, World!"); }}

用 JDK 1.5 的 javac -d . HelloWorld.java 編譯出來的位元組碼 HelloWorld.class 用 UltraEdit 打開來的內容如圖所示:

從上圖中我們看出來了什麼是 major.minor version 了,它相當於一個軟體的主次版本號,只是在這里是標識的一個 Java Class 的主版本號和次版本號,同時我們看到 minor_version 為 0x0000,major_version 為 0x0031,轉換為十制數分別為0 和 49,即 major.minor 就是 49.0 了。

三:何謂 major.minor 以及何用

Class 文件的第 5-8 位元組為 minor_version 和 major_version。Java class 文件格式可能會加入新特性。class 文件格式一旦發生變化,版本號也會隨之變化。對於 JVM 來說,版本號確定了特定的 class 文件格式,通常只有給定主版本號和一系列次版本號後,JVM 才能夠讀取 class 文件。如果 class 文件的版本號超出了 JVM 所能處理的有效范圍,JVM 將不會處理該 class 文件。

在 Sun 的 JDK 1.0.2 發布版中,JVM 實現支持從 45.0 到 45.3 的 class 文件格式。在所有 JDK 1.1 發布版中的 JVM 都能夠支持版本從 45.0 到 45.65535 的 class 文件格式。在 Sun 的 1.2 版本的 SDK 中,JVM 能夠支持從版本 45.0 到46.0 的 class 文件格式。

1.0 或 1.2 版本的編譯器能夠產生版本號為 45.3 的 class 文件。在 Sun 的 1.2 版本 SDK 中,Javac 編譯器默認產生版本號為 45.3 的 class 文件。但如果在 javac 命令行中指定了 -target 1.2 標志,1.2 版本的編譯器將產生版本號為 46.0 的 class 文件。1.0 或 1.1 版本的 JVM 上不能運行使用-target 1.2 標志所產生的 class 文件。

JVM 實現的 第二版中修改了對 class 文件主版本號和次版本號的解釋。對於第二版而言,class 文件的主版本號與 Java 平台主發布版的版本號保持一致(例如:在 Java 2 平台發布版上,主版本號從 45 升至 46),次版本號與特定主平台發布版的各個發布版相關。因此,盡管不同的 class 文件格式可以由不同的版本號表示,但版本號不一樣並不代表 class 文件格式不同。版本號不同的原因可能只是因為 class 文件由不同發布版本的 java 平台產生,可能 class 文件的格式並沒有改變。

上面三段節選自《深入 Java 虛擬機》,啰嗦一堆,JDK 1.2 開啟了 Java 2 的時代,但那個年代仍然離我們很遠,我們當中很多少直接跳在 JDK 1.4 上的,我也差不多,只是項目要求不得不在一段時間里委屈在 JDK 1.3 上。不過大致我們可以得到的信息就是每個版本的 JDK 編譯器編譯出的 class 文件中都帶有一個版本號,不同的 JVM 能接受一個范圍 class 版本號,超出范圍則要出錯。不過一般都是能向後兼容的,知道 Sun 在做 Solaris 的一句口號嗎?保持對先前版本的 100% 二進制兼容性,這也是對客戶的投資保護。

四:其他確定 class 的 major.minor version 辦法

1)Eclipse 中查看

Eclipse 3.3 加入的新特徵,當某個類沒有關聯到源代碼,打開它會顯示比較詳細的類信息,當然還未到源碼級別了,看下圖是打開 2.0 spring.jar 中 .class 顯示的信息

2)命令 javap -verbose

對於編譯出的 class 文件用 javap -verbose 能顯示出類的 major.minor 版本,見下圖:

3) MANIFEST 文件

把 class 打成的 JAR 包中都會有文件 META-INF\MANIFEST,這個文件一般會有編譯器的信息,下面列幾個包的 META-INF\MANIFEST 文件內容大家看看

·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 打包,構建用的JDK是 1.4.2_08,用 1.4 編譯的類在 1.4 JVM 中當然能運行。如果那人用 1.5 的 JDK 來編譯,然後用 JDK 1.4+ANT 來打包就太無聊了。

·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

這下要注意啦,它是用的 JDK 1.5 來編譯的,那麼它是否帶了 -target 1.4 或 -target 1.3 來編譯的呢?確實是的,可以查看類的二進制文件,這是最保險的。所在 spring-2.0.jar 也可以在 1.4 JVM 中載入執行。

·自已一個項目中用 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 構建打包的。

第一第二種辦法能明確知道 major.minor version,而第三種方法應該也沒問題,但是碰到變態構建就難說了,比如誰把那個 META-INFO\MANIFEST 打包後換了也未可知。直接查看類的二進制文件的方法可以萬分保證,准確無誤,就是工具篡改我也認了。

五:編譯器比較及症節之所在

現在不妨從 JDK 1.1 到 JDK 1.7 編譯器編譯出的 class 的默認 minor.major version 吧。(又走到 Sun 的網站上翻騰出我從來都沒用過的古董來)

JDK 編譯器版本 target 參數 十六進制 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 平台下的 JDK 編譯器的情況,我們可以此作些總結:

1) -target 1.1 時 有次版本號,target 為 1.2 及以後都只用主版本號了,次版本號為 0

2) 從 1.1 到 1.4 語言差異比較小,所以 1.2 到 1.4 默認的 target 都不是自身相對應版本

3) 1.5 語法變動很大,所以直接默認 target 就是 1.5。也因為如此用 1.5 的 JDK 要生成目標為 1.4 的代碼,光有 -target 1.4 不夠,必須同時帶上 -source 1.4,指定源碼的兼容性,1.6/1.7 JDk 生成目標為 1.4 的代碼也如此。

4) 1.6 編譯器顯得較為激進,默認參數就為 -target 1.6。因為 1.6 和 1.5 的語法無差異,所以用 -target 1.5 時無需跟著 -source 1.5。

5) 注意 1.7 編譯的默認 target 為 1.6

6) 其他第三方的 JDK 生成的 Class 文件格式版本號同對應 Sun 版本 JDK

7) 最後一點最重要的,某個版本的 JVM 能接受 class 文件的最大主版本號不能超過對應 JDK 帶相應 target 參數編譯出來的 class 文件的版本號。

上面那句話有點長,一口氣讀過去不是很好理解,舉個例子:1.4 的 JVM 能接受最大的 class 文件的主版本號不能超過用 1.4 JDK 帶參數 -target 1.4 時編譯出的 class 文件的主版本號,也就是 48。

因為 1.5 JDK 編譯時默認 target 為 1.5,出來的位元組碼 major.minor version 是 49.0,所以 1.4 的 JVM 是無法接受的,只有拋出錯誤。

那麼又為什麼從 1.1 到 1.2、從 1.2 到 1.3 或者從 1.3 到 1.4 的 JDK 升級不會發生 Unsupported major.minor version 的錯誤呢,那是因為 1.2/1.3/1.4 都保持了很好的二進制兼容性,看看 1.2/1.3/1.4 的默認 target 分別為 1.1/1.1/1.2 就知道了,也就是默認情況下1.4 JDK 編譯出的 class 文件在 JVM 1.2 下都能載入執行,何況於 JVM 1.3 呢?(當然要去除使用了新版本擴充的 API 的因素)

六:找到問題解決的方法

那麼現在如果碰到這種問題該知道如何解決了吧,還會像我所見到有些兄弟那樣,去找個 1.4 的 JDK 下載安裝,然後用其重新編譯所有的代碼嗎?其實大可不必如此費神,我們一定還記得 javac 還有個 -target 參數,對啦,可以繼續使用 1.5 JDK,編譯時帶上參數 -target 1.4 -source 1.4 就 OK 啦,不過你一定要對哪些 API 是 1.5 JDK 加入進來的了如指掌,不能你的 class 文件拿到 JVM 1.4 下就會 method not found。目標 JVM 是 1.3 的話,編譯選項就用 -target 1.3 -source 1.3 了。

相應的如果使用 ant ,它的 javac 任務也可對應的選擇 target 和 source

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

如果是在開發中,可以肯定的是現在真正算得上是 JAVA IDE 對於工程也都有編譯選項設置目標代碼的。例如 Eclipse 的項目屬性中的 Java Compiler 設置,如圖

自已設定編譯選項,你會看到選擇不同的 compiler compliance level 是,Generated class files compatibility 和 Source compatibility 也在變,你也可以手動調整那兩項,手動設置後你就不用很在乎用的什麼版本的編譯器了,只要求他生成我們希望的位元組碼就行了,再引申一下就是即使源代碼是用 VB 寫的,只要能編譯成 JVM 能執行的位元組碼都不打緊。在其他的 IDE 也能找到相應的設置對話框的。

其他時候,你一定要知道當前的 JVM 是什麼版本,能接受的位元組碼主版本號是多少(可對照前面那個表)。獲息當前 JVM 版本有兩種途徑:

第一:如果你是直接用 java 命令在控制台執行程序,可以用 java -version 查看當前的 JVM 版本,然後確定能接受的 class 文件版本

第二:如果是在容器中執行,而不能明確知道會使用哪個 JVM,那麼可以在容器中執行的程序中加入代碼System.getProperty("java.runtime.version"); 或 System.getProperty("java.class.version"),獲得 JVM 版本和能接受的 class 的版本號。

最後一絕招,如果你不想針對低版本的 JVM 用 target 參數重新編譯所有代碼;如果你仍然想繼續在代碼中用新的 API 的話;更有甚者,你還用了 JDK 1.5 的新特性,譬如泛型、自動拆裝箱、枚舉等的話,那你用 -target 1.4 -source 1.4 就沒法編譯通過,不得不重新整理代碼。那麼告訴你最後一招,不需要再從源代碼著手,直接轉換你所正常編譯出的位元組碼,繼續享用那些新的特性,新的 API,那就是:請參考之前的一篇日誌:Retrotranslator讓你用JDK1.5的特性寫出的代碼能在JVM1.4中運行 ,我就是這么用的,做好測試就不會有問題的。

七:再議一個實際發生的相關問題

這是一個因為拷貝 Tomcat 而產生的 Unsupported major.minor version 49.0 錯誤。情景是:我本地安裝的是 JDK 1.5,然後在網上找了一個 EXE 的 Tomcat 安裝文件安裝了並且可用。後來同事要一個 Tomcat,不想下載或安裝,於是根據我以往的經驗是把我的 Tomcat 整個目錄拷給他應該就行了,結果是拿到他那裡瀏覽 jsp 文件都出現 Unsupported major.minor version 49.0 錯誤,可以確定的是他安裝的是 1.4 的 JDK,但我還是有些納悶,先前對這個問題還頗有信心的我傻眼了。慣性思維是編譯好的 class 文件拿到低版本的 JVM 會出現如是異常,可現並沒有用已 JDK 1.5 編譯好的類要執行啊。

後來仔細看異常信息,終於發現了 %TOMCAT_HOME%\common\lib\tools.jar 這一眉目,因為 jsp 文件需要依賴它來編譯,打來這個 tools.jar 中的一個 class 文件來看看,49.0,很快我就明白原來這個文件是在我的機器上安裝 Tomcat 時由 Tomcat 安裝程序從 %JDK1.5%\lib 目錄拷到 Tomcat 的 lib 目錄去的,造成在同事機器上編譯 JSP 時是 1.4 的 JVM 配搭著 49.0 的 tools.jar,那能不出錯,於是找來 1.4 JDK 的 tools.jar 替換了 Tomcat 的就 OK 啦。

八:小結

其實理解 major.minor 就像是我們可以這么想像,同樣是微軟體的程序,32 位的應用程序不能拿到 16 位系統中執行那樣。

如果我們發布前了解到目標 JVM 版本,知道怎麼從 java class 文件中看出 major.minor 版本來,就不用等到伺服器報出異常才著手去解決,也就能預知到可能發生的問題。

其他時候遇到這個問題應具體解決,總之問題的根由是低版本的 JVM 無法載入高版本的 class 文件造成的,找到高版本的 class 文件處理一下就行了

熱點內容
標致5008怎麼連接安卓 發布:2024-04-25 23:25:08 瀏覽:793
安卓下載管理器哪個好 發布:2024-04-25 23:22:48 瀏覽:442
考試系統源碼php 發布:2024-04-25 23:09:46 瀏覽:136
磁碟禁止訪問 發布:2024-04-25 22:53:48 瀏覽:287
多線程ftp上傳 發布:2024-04-25 22:41:36 瀏覽:115
phpqrcode 發布:2024-04-25 22:41:36 瀏覽:33
桂平上網密碼是多少 發布:2024-04-25 22:32:10 瀏覽:575
open函數c語言 發布:2024-04-25 21:47:42 瀏覽:406
簡訊刪除後怎麼找伺服器 發布:2024-04-25 21:15:06 瀏覽:388
查ip地址伺服器數量 發布:2024-04-25 20:49:48 瀏覽:620